Version 0.5.7 - June 27, 2010
=============================
- REMOVED: normalize_callable(). Unused.

- Renamed Tipfy.context to Tipfy.registry, as the purpose is to serve as a
  registry for instances reused by the app, like Jinja2 or Genshi environments.


Version 0.5.6 - June 22, 2010
=============================
- REMOVED: RegexConverter. Unused and undocumented.

- REMOVED: wsgi_app_id config key. Unused.

- Middleware lists can now also have middleware instances. This allows
  different instances of same middleware classes to be used with different
  configuration:

  my_middleware = MyMiddleware(foo='bar')

  class MyRequestHandler(RequestHandler):
      middleware = [my_middleware]

      # ...

  my_middleware2 = MyMiddleware(foo='zing')

  class MyRequestHandler2(RequestHandler):
      middleware = [my_middleware2]

      # ...

- Fixed using tipfy with zipimport. For whatever reason py_zipimport fails to
  load werkzeug modules if werkzeug package is not imported first. This is
  probably related to how werkzeug lazy-loads modules -- an edge case not
  covered by py_zimpimport.


Version 0.5.5 - June 2nd, 2010
==============================
- All .ext packages were moved to separate releases. Tipfy is again a single
  file with a single dependency (Werkzeug), as it was in the beginning.


Version 0.5.4 - May 27, 2010
============================
Bug fix release following 0.5.3.

- REMOVED 'pre_run_app' hook. Use post_make_app instead:

    def post_make_app(self, app):
        # Wrap the callable, so we keep a reference to the app...
        app.wsgi_app = my_middleware(app.wsgi_app)
        # ...and return the original app.
        return app

- IMPROVED tipfy.ext.appstatts and tipfy.ext.debugger: middleware is set on
  'post_make_app'.


Version 0.5.3 - May 27, 2010
============================

Backwards compatibility warnings
--------------------------------

- ADDED: RequestHandler.__init__(app, request), setting references to current
  WSGIApplication and Request in the handler. If you implemented __init__() on
  RequestHandler, please update it to accept these arguments:

    class MyRequestHandler(RequestHandler):
        def __init__(self, app, request):
            super(MyRequestHandler, self).__init__(app, request)
            ...

  We now have access to the URL rule and rule arguments that matched on
  __init__(), and can read app configuration without relying on local.

- CHANGED: the signature of RequestHandler.dispatch(), as a consequence of
  adding __init__() to the handler class. Request method and rule arguments
  are taken from the request set on __init__().

- REMOVED: tipfy.ext.session.MessagesMixin.set_form_error(). It required
  i18n, which requires Babel. Sessions should not depend on i18n. Now they
  don't. Please implement it on a separate mixin or base handler if you used
  it.

- We're now slowly getting rid of globals and local is the first target, as it
  doesn't make sense on App Engine.

  While local.request and local.app still works, you should start using
  Tipfy.request and Tipfy.app if globals are required in helper functions (they
  are now available in the handler, which should cover most use cases).

  Tipfy.request and Tipfy.app are set and cleaned on each request. It is
  fast and perfectly valid on App Engine, but unfortunately this is not a
  good idea outside of App Engine where you need to take care of threading.

  So an application using Tipfy outside of App Engine needs to setup a proxy on
  these attributes pointing to a thread local. This monkeypatch covers it all:

    from werkzeug import Local

    local = Local()

    def set_wsgi_app(self):
        local.app = self

    def set_request(self, request):
        local.request = request

    def cleanup(self):
        local.__release_local__()

    Tipfy.set_wsgi_app = set_wsgi_app
    Tipfy.set_request = set_request
    Tipfy.cleanup = cleanup
    Tipfy.app = local('app')
    Tipfy.request = local('request')

  This makes Tipfy.app and Tipfy.request thread-safe outside of App Engine.

tipfy.routing
-------------

- CHANGED: Added _anchor keyword argument to url_for() and redirect_to(), to
  append an anchor to the generated URL. Also keyword arguments in these two
  functions are now prefixed with a '_':

    url_for(endpoint, _full=False, _method=None, _anchor=None, **kwargs)
    redirect_to(endpoint, _method=None, _anchor=None, _code=302, **kwargs)

  This is just a sanity measure to avoid collisions with variables set in
  rules. The old, non-prefixed keywords are still accepted, but they should
  be removed on 1.0.

- ADDED: request.url_for(). tipfy.url_for() just calls request.url_for().

tipfy.ext.i18n
--------------

- ADDED: functions to ext.i18n: get_timezone_name(), parse_date(),
  parse_datetime() and parse_time().

- IMPROVED: All datetime and number format functions in ext.i18n now accept a
  locale argument. If not set, uses the currently loaded locale (as before).

- ADDED: babel.cfg to the project directory, with configuration to extract
  translation messages using pybabel. Also added locale directory to the app
  dir.

tipfy.application
-----------------

- ADDED: a Request object that extends werkzeug's Request. This is backwards
  compatible and stores url_adapter, matched rule and rule arguments.
  app.url_adapter, app.rule and app.rule_args are still set, but they will be
  removed on 1.0.

- ADDED: app.dev attribute, as a shortcut to the development flag set in
  config.

- ADDED: app.get_config(). tipfy.get_config() just calls app.get_config().

- FIXED: logging debug level is set correctly now when in development.

- ADDED some ideas from Flask:
  - Local variables are not cleaned when in development and an exception is
    raised. This allows the debugger to still access request and other
    variables from local in the interactive shell.
  - Added a wsgi_app() function to WSGIApplication, wrapping __call__().
  - Added a make_response() method to WSGIApplication, so that handlers
    can return not only a Response object.
  - Refactoring: split pre_dispatch/dispatch/post_dispatch into separate
    functions. Makes it easier to override these methods in a middleware.
  - Added function get_test_client() to return a werkzeug.Client for the wsgi
    app.
  - Added function ext.jinja2.get_template_attribute().
  - ADDED: a Response object that extends werkzeug's Response, with default
    mimetype set to 'text/html'.

- REMOVED:
  - tipfy.response and 'extensions' configuration key. They were deprecated
    since 0.5 and not useful at all since then.
  - tipfy.local_manager. No longer needed since latest Werkzeug.


Miscelaneous
------------

- FIXED: XMPP handlers. Now fully tested.

- IMPROVED: render_json_response() now accepts all arguments and keyword
  arguments accepted by simplejson.dumps().

- ADDED: tipfy.ext.mail, a simple RequestHandler for inbound mail.


Version 0.5.2 - May 06, 2010
============================
- Added a buildout setup to manage external dependencies. It is now
  the preferred method for setting and updating tipfy and app libraries.
  A full build will still be provided, though.

- Experimental support for loading all libraries using zipimport. The buildout
  setup is capable of generating the zip and it is included in sys.path by
  default. (issue #12)

- Tipfy can now be installed using easy_install.

- Fixed bug in ext.taskqueue.Mapper that would prevent changes from being
  written to the datastore. (Kaelten)

- Fixed debugger interactive console which was not working since Werkzeug 0.6.
  (issue #11)

- Fixed ext.blobstore, broken since SDK 1.3.3 which made some previously
  public blobstore functions protected.

- Removed tipfy.application.PatchedCGIHandler. The CGIHandler bug was fixed in
  the 1.3.2 SDK.


Version 0.5.1 - April 18, 2010
==============================
- Upgraded Werkzeug to 0.6.1.

- Upgraded Jinja2 to 2.4.

- Fixed bug in ext.auth.is_current_user_admin(). Thanks, danil.

- Added get_locale() to tipfy.ext.i18n. Internally it now uses get_locale()
  instead of local.locale directly, so that locales are autoloaded when not set.


Version 0.5 - Codename Spiff - April 10, 2010
=============================================
- Minor bugs fixed in the released candidate, some more docs added, and we are
  good to go.


Version 0.5rc - April 03, 2010
==============================
- This is a major release with several backwards compatibility breaks. API
  and architecture consistency was one of the major goals -- better to break
  things sooner than later.

- Added a middleware system for handlers: handlers can now hook pre, post and
  handle exception routines in the handler class itself. Very useful to make
  base handlers with similar requirements and characteristics, without adding
  overhead to non-related, simpler handlers. A few initial middleware classes
  were added:

  - AppstatsMiddleware
  - AuthMiddleware
  - DebuggerMiddleware
  - I18nMiddleware
  - SessionMiddleware

  This deprecates several functionalities performed by app hooks before.
  While hooks are still useful to wrap and extend WSGIApplication, middleware
  applied directly to handlers are more appropriate in several use cases.

  Thanks to Thomas Johansson (prencher) for the invaluable feedback on this.

- The previous 'extensions' system for the WSGI app now uses the same middleware
  system used by the handlers. You can register middleware for the WSGI app and
  these classes can also act as handler middleware.

- Added tipfy.ext.appstats, a middleware to use the appstats profiling tool.

- Added tipfy.ext.blobstore, with handler mixin classes to handle blobstore
  upload and serving.

- Added tipfy.ext.xmpp, with base handlers for XMPP bots.

- Added several other mixin classes. Each of them add a couple of attributes
  or methods to a request handler. The full list of mixins:

  - AclMixin
  - BlobstoreDownloadMixin
  - BlobstoreUploadMixin
  - Jinja2Mixin
  - MakoMixin
  - MessagesMixin
  - SessionMixin

- Added some new db.Model properties to tipfy.ext.db:

  - JsonProperty
  - TimezoneProperty (thanks to Thomas Johansson for this one)

- Added post_make_app application hook.

- tipfy.ext.session was rewritten from scratch. It now works as a provider of
  sessions and related stuff, such as signed flash messages and secure cookies.

- tipfy.ext.messages was removed and the existing functionality (flash messages
  and messages container) was merged into tipfy.ext.session.

- tipfy.ext.user was renamed to tipfy.ext.auth.

- tipfy.ext.i18n doesn't require initialization anymore; it is initialized when
  first used. Locale for the current request can be automatically loaded using
  several configurable methods (taking arguments from GET, POST, cookies or
  URL parameters).

- Added number formatting functions to tipfy.ext.i18n: format_number,
  format_decimal, format_currency, format_percent, format_scientific,
  parse_number, parse_decimal.

- URL rules are no longer stored in memcache. This can be done in urls.py if
  one wants it. Tipfy core won't make *any* API calls anymore.

- Added a directory for examples in Tipfy's repository, compiling all examples
  from tutorials and some new ones.

- Several improvements everywhere, and a lot more documentation and unit test
  coverage.
