Version 0.5 - August 13, 2010
=============================
- Better compatibility with webapp:
  - webapp2.WSGIapplication can be used with webapp.RequestHandler.
  - webapp.WSGIapplication can be used with webapp2.RequestHandler.

  Although the functionality becomes limited in both cases, this should help
  migration.

- Review of Response based on observations from
  http://pythonpaste.org/webob/differences.html#webapp-response:

  - Response.out is now a reference to self, to use webob.Response's neat
    .write() method which can handle both string and unicode.
  - Response.clear() now sets .body = '' instead of .app_iter = [].

- Added Response.write(), for compatibility with StringIO behavior in webapp
  when calling write() passing non-basestring values (issue 2).

- Removed url_escape() and url_unescape(). Unused or almost unused.

- ErrorHandlers can now be defined as strings to be lazily loaded, as they
  now use the same dispatch mechanism of other handlers.

Backwards compatibility warning
-------------------------------
- The method handle_exception() is called from app-wide error handlers.
  Previously, get() was called.


Version 0.4.1 - August 08, 2010
===============================
- Removed router parameter from get_routes(), get_match_routes(),
  get_build_routes(). This simplifies multi-routes quite a bit.


Version 0.4 - August 07, 2010
=============================
- redirect() and redirect_to() now accept a keyword argument 'abort' to raise
  an exception to do the redirect.

- '_netloc' can be passed to url_for() build URLs for a given domain or
  subdomain.

- Added BaseRoute, an interface for custom routes. Several improvements make
  the routing system more extensible, while the default Route class sticks to
  the basics.

- Nested routes are now possible. As an example, `extras/routes.py` has several
  classes that accept nested routes or extend routing in other ways:

  - PathPrefixRoute: the idea of this route is to set a base path for other
    routes::

        app = WSGIApplication([
            PathPrefixRoute('/users/<user:\w+>', [
                Route('/', UserOverviewHandler, 'user-overview'),
                Route('/profile', UserProfileHandler, 'user-profile'),
                Route('/projects', UserProjectsHandler, 'user-projects'),
            ]),
        ])

    The example above is the same as setting the following routes, just more
    convenient as you can reuse the path prefix::

        app = WSGIApplication([
            Route('/users/<user:\w+>/', UserOverviewHandler, 'user-overview'),
            Route('/users/<user:\w+>/profile', UserProfileHandler, 'user-profile'),
            Route('/users/<user:\w+>/projects', UserProjectsHandler, 'user-projects'),
        ])

  - NamePrefixRoute: Same as PathPrefixRoute, but prefixes the names of routes.

  - HandlerPrefixRoute: Same as PathPrefixRoute, but prefixes the handlers of
    routes.

  - DomainRoute: a route used to restrict route matches to a given domain or
    subdomain.

    For example, to restrict routes to a subdomain of the appspot domain::

        SUBDOMAIN_RE = '^([^.]+)\.app-id\.appspot\.com$'

        app = WSGIApplication([
            DomainRoute(SUBDOMAIN_RE, [
                Route('/foo', 'FooHandler', 'subdomain-thing'),
            ]),
            Route('/bar', 'BarHandler', 'normal-thing'),
        ])

  - ImprovedRoute: a route with redirect_to and strict_slash.

    - `redirect_to`: if set, the route is used to redirect to a URL. The value
       can be a URL string or a callable that returns a URL. These two are
       equivalent::

          route = Route('/foo', RedirectHandler, defaults={'url': '/bar'})
          route = Route('/foo', redirect_to='/bar')

    - `strict_slash`: if True, redirects access to the same URL with different
      trailing slash to the strict path defined in the rule. For example, take
      these rules::

          route = Route('/foo', FooHandler, strict_slash=True)
          route = Route('/bar/', BarHandler, strict_slash=True)

      Because **strict_slash** is True, this is what will happen:

      - Access to ``/foo`` will execute ``FooHandler`` normally.
      - Access to ``/bar/`` will execute ``BarHandler`` normally.
      - Access to ``/foo/`` will redirect to ``/foo``.
      - Access to ``/bar`` will redirect to ``/bar/``.


Version 0.3 - August 05, 2010
=============================
- Routes store the handler, as we had in 0.1. This allows custom routes to
  have nested routes.
- Much improved URL building, now delegated to routes.
- added urlunsplit() helper.


Version 0.2 - August 04, 2010
=============================
- Fixed a bug in Route.match() that would make it return positional arguments
  with wrong order. Dictionary is correctly sorted now.
- Added build_only option for routes: routes that are only used for url_for()
  and never match.


Version 0.1 - August 03, 2010
=============================
- Initial release.
