==================
Werkzeug Changelog
==================

.. module:: werkzeug

This file lists all major changes in Werkzeug over the versions.
For API breaking changes have a look at :ref:`api-changes`, they
are listed there in detail.

.. include:: ../CHANGES

.. _api-changes:

API Changes
===========

`0.9`
    -   Soft-deprecated the :attr:`BaseRequest.data` and
        :attr:`BaseResponse.data` attributes and introduced new methods
        to interact with entity data.  This will allows in the future to
        make better APIs to deal with request and response entity
        bodies.  So far there is no deprecation warning but users are
        strongly encouraged to update.
    -   The :class:`Headers` and :class:`EnvironHeaders` datastructures
        are now designed to operate on unicode data.  This is a backwards
        incomaptible change and was necessary for the Python 3 support.
    -   The :class:`Headers` object no longer supports in-place operations
        through the old ``linked`` method.  This has been removed without
        replacement due to changes on the encoding model.

`0.6.2`
    -   renamed the attribute `implicit_seqence_conversion` attribute of
        the request object to `implicit_sequence_conversion`.  Because
        this is a feature that is typically unused and was only in there
        for the 0.6 series we consider this a bug that does not require
        backwards compatibility support which would be impossible to
        properly implement.

`0.6`
    -   Old deprecations were removed.
    -   `cached_property.writeable` was deprecated.
    -   :meth:`BaseResponse.get_wsgi_headers` replaces the older
        `BaseResponse.fix_headers` method.  The older method stays
        around for backwards compatibility reasons until 0.7.
    -   `BaseResponse.header_list` was deprecated.  You should not
        need this function, `get_wsgi_headers` and the `to_list`
        method on the regular headers should serve as a replacement.
    -   Deprecated `BaseResponse.iter_encoded`'s charset parameter.
    -   :class:`LimitedStream` non-silent usage was deprecated.
    -   the `__repr__` of HTTP exceptions changed.  This might break
        doctests.

`0.5`
    -   Werkzeug switched away from wsgiref as library for the builtin
        webserver.
    -   The `encoding` parameter for :class:`Template`\s is now called
        `charset`.  The older one will work for another two versions
        but warn with a :exc:`DeprecationWarning`.
    -   The :class:`Client` has cookie support now which is enabled
        by default.
    -   :meth:`BaseResponse._get_file_stream` is now passed more parameters
        to make the function more useful.  In 0.6 the old way to invoke
        the method will no longer work.  To support both newer and older
        Werkzeug versions you can add all arguments to the signature and
        provide default values for each of them.
    -   :func:`url_decode` no longer supports both `&` and `;` as
        separator.  This has to be specified explicitly now.
    -   The request object is now enforced to be read-only for all
        attributes.  If your code relies on modifications of some values
        makes sure to create copies of them using the mutable counterparts!
    -   Some data structures that were only used on request objects are
        now immutable as well.  (:class:`Authorization` / :class:`Accept`
        and subclasses)
    -   `CacheControl` was splitted up into :class:`RequestCacheControl`
        and :class:`ResponseCacheControl`, the former being immutable.
        The old class will go away in 0.6
    -   undocumented `werkzeug.test.File` was replaced by
        :class:`FileWrapper`.
    -   it's not longer possible to pass dicts inside the `data` dict
        in :class:`Client`.  Use tuples instead.
    -   It's save to modify the return value of :meth:`MultiDict.getlist`
        and methods that return lists in the :class:`MultiDict` now.  The
        class creates copies instead of revealing the internal lists.
        However :class:`MultiDict.setlistdefault` still (and intentionally)
        returns the internal list for modifications.

`0.3`
    -   Werkzeug 0.3 will be the last release with Python 2.3 compatibility.
    -   The `environ_property` is now read-only by default.  This decision was
        made because the request in general should be considered read-only.

`0.2`
    -   The `BaseReporterStream` is now part of the contrib module, the
        new module is `werkzeug.contrib.reporterstream`.  Starting with
        `0.3`, the old import will not work any longer.
    -   `RequestRedirect` now uses a 301 status code.  Previously a 302
        status code was used incorrectly.  If you want to continue using
        this 302 code, use ``response = redirect(e.new_url, 302)``.
    -   `lazy_property` is now called `cached_property`.  The alias for
        the old name will disappear in Werkzeug 0.3.
    -   `match` can now raise `MethodNotAllowed` if configured for
        methods and there was no method for that request.
    -   The `response_body` attribute on the response object is now called
        `data`.  With Werkzeug 0.3 the old name will not work any longer.
    -   The file-like methods on the response object are deprecated.  If
        you want to use the response object as file like object use the
        `Response` class or a subclass of `BaseResponse` and mix the new
        `ResponseStreamMixin` class and use `response.stream`.
