Codebase list flask-restless / master CHANGES
master

Tree @master (Download .tar.gz)

CHANGES @masterraw · history · blame

Changelog
=========

Here you can see the full list of changes between each Flask-Restless release.
Numbers following a pound sign (#) refer to `GitHub issues
<https://github.com/jfinkels/flask-restless/issues>`_.

.. note::

   As of version 0.13.0, Flask-Restless supports Python 2.6, 2.7, and 3. Before
   that, it supported Python 2.5, 2.6, and 2.7.

.. note::

   As of version 0.6, Flask-Restless supports both pure SQLAlchemy and
   Flask-SQLAlchemy models. Before that, it supported only Elixir models.

Version 0.17.0
--------------

Released on February 17, 2015.

- Corrects bug to allow delayed initialization of multiple Flask applications.
- #167: allows custom serialization/deserialization functions.
- #198: allows arbitrary Boolean expressions in search query filters.
- #226: allows creating APIs before initializing the Flask application object.
- #274: adds the :func:`url_for` function for computing URLs from models.
- #379: improves datetime parsing in search requests.
- #398: fixes bug where DELETE_SINGLE processors were not actually used.
- #400: disallows excluding a primary key on a :http:method:`POST` request.

Version 0.16.0
--------------

Released on February 3, 2015.

- #237: allows bulk delete of model instances via the ``allow_delete_many``
  keyword argument.
- #313, #389: :meth:`APIManager.init_app` now can be correctly used to
  initialize multiple Flask applications.
- #327, #391: allows ordering searches by fields on related instances.
- #353: allows search queries to specify ``group_by`` directives.
- #365: allows preprocessors to specify return values on :http:method:`get`
  requests.
- #385: makes the `include_methods` keywords argument respect model properties.

Version 0.15.1
--------------

Released on January 2, 2015.

- #367: catch :exc:`IntegrityError`, :exc:`DataError`, and
  :exc:`ProgrammingError` exceptions in all view methods.
- #374: import :class:`sqlalchemy.Column` from :mod:`sqlalchemy` directly,
  instead of :mod:`sqlalchemy.sql.schema`

Version 0.15.0
--------------

Released on October 30, 2014.

- #320: detect settable hybrid properties instead of raising an exception.
- #350: allows exclude/include columns to be specified as SQLAlchemy column
  objects in addition to strings.
- #356: rollback the SQLAlchemy session on a failed :http:method:`patch`
  request.
- #368: adds missing documentation on using custom queries (see
  :ref:`customqueries`)

Version 0.14.2
--------------

Released on September 2, 2014.

- #351, #355: fixes bug in getting related models from a model with hybrid
  properties.

Version 0.14.1
--------------

Released on August 26, 2014.

- #210: lists some related projects in the documentation.
- #347: adds automated build testing for PyPy 3.
- #354: renames ``is_deleted`` to ``was_deleted`` when providing keyword
  arguments to postprocessor for :http:method:`delete` method in order to match
  documentation.

Version 0.14.0
--------------

Released on August 12, 2014.

- Fixes bug where primary key specified by user was not being checked in some
  :http:method:`post` requests and some search queries.
- #223: documents CORS example.
- #280: don't expose raw SQL in responses on database errors.
- #299: show error message if search query tests for ``NULL`` using comparison
  operators.
- #315: check for query object being ``None``.
- #324: :http:method:`delete` should only return :http:statuscode:`204` if
  something is actuall deleted.
- #325: support ``null`` inside ``has`` search operators.
- #328: enable automatic testing for Python 3.4.
- #333: enforce limit in :func:`helpers.count`.
- #338: catch validation exceptions when attempting to update relations.
- #339: use user-specified primary key on :http:method:`patch` requests.
- #344: correctly encodes Unicode fields in responses.

Version 0.13.1
--------------

Released on April 21, 2014.

- #304: fixes mimerender bug due to how Python 3.4 handles decorators.

Version 0.13.0
--------------

Released on April 6, 2014.

- Allows universal preprocessors or postprocessors; see :ref:`universal`.
- Allows specifying which primary key to use when creating endpoint URLs.
- Requires SQLAlchemy version 0.8 or greater.
- #17: use Flask's :attr:`flask.Request.json` to parse incoming JSON requests.
- #29: replace custom ``jsonify_status_code`` function with built-in support
  for ``return jsonify(), status_code`` style return statements (new in Flask
  0.9).
- #51: Use `mimerender <http://mimerender.readthedocs.org>`_ to render
  dictionaries to JSON format.
- #247: adds support for making :http:method:`post` requests to dictionary-like
  association proxies.
- #249: returns :http:statuscode:`404` if a search reveals no matching results.
- #254: returns :http:statuscode:`404` if no related field exists for a request
  with a related field in the URL.
- #256: makes search parameters available to postprocessors for
  :http:method:`get` and :http:method:`patch` requests that access multiple
  resources.
- #263: Adds Python 3.3 support; drops Python 2.5 support.
- #267: Adds compatibility for legacy Microsoft Internet Explorer versions 8
  and 9.
- #270: allows the ``query`` attribute on models to be a callable.
- #282: order responses by primary key if no order is specified.
- #284: catch ``DataError`` and ``ProgrammingError`` exceptions when bad data
  are sent to the server.
- #286: speed up paginated responses by using optimized count() function.
- #293: allows :class:`sqlalchemy.Time` fields in JSON responses.

Version 0.12.1
--------------

Released on December 1, 2013.

- #222: on :http:method:`post` and :http:method:`patch` requests, recurse into
  nested relations to get or create instances of related models.
- #246: adds `pysqlite <https://pypi.python.org/pypi/pysqlite>`_ to test
  requirements.
- #260: return a single object when making a :http:method:`get` request to a
  relation sub-URL.
- #264: all methods now execute postprocessors after setting headers.
- #265: convert strings to dates in related models when making
  :http:method:`post` requests.

Version 0.12.0
--------------

Released on August 8, 2013.

- #188: provides metadata as well as normal data in JSONP responses.
- #193: allows :http:method:`delete` requests to related instances.
- #215: removes Python 2.5 tests from Travis configuration.
- #216: don't resolve Query objects until pagination function.
- #217: adds missing indices in format string.
- #220: fix bug when checking attributes on a hybrid property.
- #227: allows client to request that the server use the current date and/or
  time when setting the value of a field.
- #228 (as well as #212, #218, #231): fixes issue due to a module removed from
  Flask version 0.10.

Version 0.11.0
--------------

Released on May 18, 2013.

- Requests that require a body but don't have ``Content-Type:
  application/json`` will cause a :http:statuscode:`415` response.
- Responses now have ``Content-Type: application/json``.
- #180: allow more expressive ``has`` and ``any`` searches.
- #195: convert UUID objects to strings when converting an instance of a model
  to a dictionary.
- #202: allow setting hybrid properties with expressions and setters.
- #203: adds the ``include_methods`` keyword argument to
  :meth:`APIManager.create_api`, which allows JSON responses to include the
  result of calling arbitrary methods of instances of models.
- #204, 205: allow parameters in ``Content-Type`` header.

Version 0.10.1
--------------

Released on May 8, 2013.

- #115: change ``assertEqual()`` methods to ``assert`` statements in tests.
- #184, #186: Switch to `nose <http://nose.readthedocs.org>`_ for testing.
- #197: documents technique for adding filters in processors when there are
  none initially.

Version 0.10.0
--------------

Released on April 30, 2013.

- #2: adds basic :http:method:`get` access to one level of relationship depth
  for models.
- #113: interpret empty strings for date fields as ``None`` objects.
- #115: use Python's built-in assert statements for testing
- #128: allow disjunctions when filtering search queries.
- #130: documentation and examples now more clearly show search examples.
- #135: added support for hybrid properties.
- #139: remove custom code for authentication in favor of user-defined pre- and
  postprocessors (this supercedes the fix from #154).
- #141: relax requirement for version of `python-dateutil
  <http://labix.org/python-dateutil>`_ to be not equal to 2.0 if using Python
  version 2.6 or 2.7.
- #146: preprocessors now really execute before other code.
- #148: adds support for SQLAlchemy `association proxies <http://docs.sqlalchemy.org/en/latest/orm/extensions/associationproxy.html>`_.
- #154 (*this fix is irrelevant due to #139*): authentication function now may
  raise an exception instead of just returning a Boolean.
- #157: :http:method:`post` requests now receive a response containing all
  fields of the created instance.
- #162: allow pre- and postprocessors to indicate that no change has occurred.
- #164, #172, and #173: :http:method:`patch` requests update fields on related
  instances.
- #165: fixed bug in automatic exposing of URLs for related instances.
- #170: respond with correct HTTP status codes when a query for a single
  instance results in none or multiple instances.
- #174: allow dynamically loaded relationships for automatically exposed URLs
  of related instances.
- #176: get model attribute instead of column name when getting name of primary
  key.
- #182: allow :http:method:`post` requests that set hybrid properties.
- #152: adds some basic server-side logging for exceptions raised by views.

Version 0.9.3
-------------

Released on February 4, 2013.

- Fixes incompatibility with Python 2.5 try/except syntax.
- #116: handle requests which raise :exc:`~sqlalchemy.exc.IntegrityError`.

Version 0.9.2
-------------

Released on February 4, 2013.

- #82, #134, #136: added request pre- and postprocessors.
- #120: adds support for JSON-P callbacks in :http:method:`get` requests.

Version 0.9.1
-------------

Released on January 17, 2013.

- #126: fix documentation build failure due to bug in a dependency.
- #127: added "ilike" query operator.

Version 0.9.0
-------------

Released on January 16, 2013.

- Removed ability to provide a :class:`~sqlalchemy.orm.session.Session` class
  when initializing :class:`APIManager`; provide an instance of the class
  instead.
- Changes some dynamically loaded relationships used for testing and in
  examples to be many-to-one instead of the incorrect one-to-many. Versions of
  SQLAlchemy after 0.8.0b2 raise an exception when the latter is used.
- #105: added ability to set a list of related model instances on a model.
- #107: server responds with an error code when a :http:method:`patch` or
  :http:method:`post` request specifies a field which does not exist on the
  model.
- #108: dynamically loaded relationships should now be rendered correctly by
  the :func:`views._to_dict` function regardless of whether they are a list or
  a single object.
- #109: use `sphinxcontrib-issuetracker`_ to render links to GitHub issues in
  documentation.
- #110: enable ``results_per_page`` query parameter for clients, and added
  ``max_results_per_page`` keyword argument to :meth:`APIManager.create_api`.
- #114: fix bug where string representations of integers were converted to
  integers.
- #117: allow adding related instances on :http:method:`patch` requests for
  one-to-one relationships.
- #123: :http:method:`patch` requests to instances which do not exist result in
  a :http:statuscode:`404` response.

.. _sphinxcontrib-issuetracker: https://sphinxcontrib-issuetracker.readthedocs.org/en/latest

Version 0.8.0
-------------

Released on November 19, 2012.

- #94: :func:`views._to_dict` should return a single object instead of a list
  when resolving dynamically loaded many-to-one relationships.
- #104: added ``num_results`` key to paginated JSON responses.

Version 0.7.0
-------------

Released on October 9, 2012.

- Added working ``include`` and ``exclude`` functionality to the
  :func:`views._to_dict` function.
- Added ``exclude_columns`` keyword argument to :meth:`APIManager.create_api`.
- #79: attempted to access attribute of ``None`` in constructor of
  :class:`APIManager`.
- #83: allow :http:method:`post` requests with one-to-one related instances.
- #86: allow specifying include and exclude for related models.
- #91: correctly handle :http:method:`post` requests to nullable
  :class:`~sqlalchemy.DateTime` columns.
- #93: Added a ``total_pages`` mapping to the JSON response.
- #98: :http:method:`get` requests to the function evaluation endpoint should
  not have a data payload.
- #101: ``exclude`` in :func:`views._to_dict` function now correctly excludes
  requested fields from the returned dictionary.

Version 0.6
-----------

Released on June 20, 2012.

- Added support for accessing model instances via arbitrary primary keys,
  instead of requiring an integer column named ``id``.
- Added example which uses curl as a client.
- Added support for pagination of responses.
- Fixed issue due to symbolic link from :file:`README` to :file:`README.md`
  when running ``pip bundle foobar Flask-Restless``.
- Separated API blueprint creation from registration, using
  :meth:`APIManager.create_api` and :meth:`APIManager.create_api_blueprint`.
- Added support for pure SQLAlchemy in addition to Flask-SQLAlchemy.
- #74: Added ``post_form_preprocessor`` keyword argument to
  :meth:`APIManager.create_api`.
- #77: validation errors are now correctly handled on :http:method:`PATCH`
  requests.

Version 0.5
-----------

Released on April 10, 2012.

- Dual-licensed under GNU AGPLv3+ and 3-clause BSD license.
- Added capturing of exceptions raised during field validation.
- Added :file:`examples/separate_endpoints.py`, showing how to create separate
  API endpoints for a single model.
- Added ``include_columns`` keyword argument to
  :meth:`~flask_restless.APIManager.create_api` method to allow users to
  specify which columns of the model are exposed in the API.
- Replaced Elixir with Flask-SQLAlchemy. Flask-Restless now only supports
  Flask-SQLAlchemy.

Version 0.4
-----------

Released on March 29, 2012.

- Added Python 2.5 and Python 2.6 support.
- Allow users to specify which HTTP methods for a particular API will require
  authentication and how that authentication will take place.
- Created base classes for test cases.
- Moved the ``evaluate_functions`` function out of the
  :mod:`flask_restless.search` module and corrected documentation about how
  function evaluation works.
- Added `allow_functions` keyword argument to
  :meth:`~flask_restless.APIManager.create_api`.
- Fixed bug where we weren't allowing PUT requests in
  :meth:`~flask.ext.restless.manager.APIManager.create_api`.
- Added ``collection_name`` keyword argument to
  :meth:`~flask_restless.APIManager.create_api` to allow user provided names in
  URLs.
- Added ``allow_patch_many`` keyword argument to
  :meth:`~flask_restless.APIManager.create_api` to allow enabling or disabling
  the PATCH many functionality.
- Disable the PATCH many functionality by default.

Version 0.3
-----------

Released on March 4, 2012.

- Initial release in Flask extension format.