Routes
++++++
Routes is a Python re-implementation of the `Rails routes system `_
for mapping URL's to Controllers/Actions and generating URL's. Routes makes it easy to create pretty and concise URL's that are RESTful with little effort.
Speedy and dynamic URL generation means you get a URL with minimal cruft (no big dangling query args). Shortcut features like Named Routes cut down on repetitive typing.
Current features:
* Named Routes
* Sophisticated Route lookup and URL generation
* Wildcard path's before and after static parts
* Groupings syntax to allow flexible URL's to accommodate almost any need
* Sub-domain support built-in
* Conditional matching based on domain, cookies, HTTP method (RESTful), and more
* Easily extensible utilizing custom condition functions and route generation functions
* Extensive unit tests
Buzzword Compliance: *REST*, *DRY*
News
====
**Feb. 26th, 2008**
Routes 1.7.2:
* Fixed bug with keyword args not being coerced to raw string properly.
**Nov. 16th, 2007**
Routes 1.7.1:
* Fixed bug with sub-domains from route defaults getting encoded to unicode
resulting in a unicode route which then caused url_for to throw an
exception.
* Removed duplicate assignment in map.resource. Patch by Mike Naberezny.
* Applied test patch fix for path checking. Thanks Mike Naberezny.
* Added additional checking of remaining URL, to properly swallow periods in
the appropriate context. Fixes #57.
* Added mapper.hardcode_names option which restricts url generation to the
named route during generation rather than using the routes default options
during generation.
* Fixed the special '_method' attribute not being recognized during POST
requests of Content-Type 'multipart/form-data'.
**June 8th, 2007**
Routes 1.7:
* Fixed url_unquoting to only apply for strings.
* Added _encoding option to individual routes to toggle decoding/encoding on a
per route basis.
* Fixed route matching so that '.' and other special chars are only part of the
match should they not be followed by that character. Fixed regexp creation so
that route parts with '.' in them aren't matched properly. Fixes #48.
* Fixed Unicode decoding/encoding so that the URL decoding and encoding can be
set on the mapper with mapper.encoding. Fixes #40.
* Don't assume environ['CONTENT_TYPE'] always exists: it may be ommitted
according to the WSGI PEP.
* Fixed Unicode decode/encoding of path_info dynamic/wildcard parts so that
PATH_INFO will stay a raw string as it should. Fixes #51.
* Fixed url_for (thus redirect_to) to throw an exception if a Unicode
string is returned as that's an invalid URL. Fixes #46.
* Fixed Routes middleware to only parse POST's if the content type is
application/x-www-form-urlencoded for a HTML form. This properly avoids
parsing wsgi.input when it doesn't need to be.
**April 10th, 2007**
Routes 1.6.3:
* Fixed matching so that an attempt to match an empty path raises a
RouteException. Fixes #44.
* Added ability to use characters in URL's such as '-' and '_' in
map.resource. Patch by Wyatt Baldwin. Fixes #45.
* Updated Mapper.resource handling with name_prefix and path_prefix checking
to specify defaults. Also ensures that should either of them be set, they
override the prefixes should parent_resource be specified. Patch by Wyatt
Baldwin. Fixes #42.
* Added utf-8 decoding of incoming path arguments, with fallback to ignoring
them in the very rare cases a malformed request URL is sent. Patch from
David Smith.
* Fixed treatment of '#' character as something that can be left off and
used in route paths. Found by Mike Orr.
* Added ability to specify parent resource to map.resource command. Patch from
Wyatt Baldwin.
* Fixed formatted route issue with map.resource when additional collection
methods are specified. Added unit tests to verify the collection methods
work properly.
* Updated URL parsing to properly use HTTP_HOST for hostname + port info before
falling back to SERVER_PORT and SERVER_NAME. Fixes #43.
* Added member_name and collection_name setting to Route object when made with
map.resource.
* Updated routes.middleware to make the Routes matched accessible as
environ['routes.route'].
* Updating mapper object to use thread local for request data (such as
environ) and middleware now deletes environ references at the end of the
request.
* Added explicit option to Routes and Mapper. Routes _explicit setting will
prevent the Route defaults from being implicitly set, while setting Mapper
to explicit will prevent Route implicit defaults and stop url_for from using
Route memory. Fixes #38.
* Updated config object so that the route is attached if possible.
* Adding standard logging usage with debug messages.
* Added additional test for normal '.' match and fixed new special matching to
match it properly. Thanks David Smith.
* Fixed hanging special char issue with 'special' URL chars at the end of a URL
that are missing the variable afterwards.
* Changed Routes generation and recognition to handle other 'special' URL chars
, . and ; as if they were /. This lets them be optionally left out of the
resulting generated URL. Feature requested by David Smith.
* Fixed lookahead assertion in regexp builder to properly handle two grouped
patterns in a row.
* Applied patch to generation and matching to handle Unicode characters
properly. Reported with patch by David Smith.
**Jan. 5, 2007**
Routes 1.6.2:
* Fixed issue with method checking not properly handling different letter
cases in REQUEST_METHOD. Reported by Sean Davis.
* redirect_to now supports config.redirect returning a redirect, not just
raising one.
**Dec. 29, 2006**
Routes 1.6.1:
* Fixed zipsafe flag to be False as it occasionally was installed zipped.
**Dec. 14th, 2006**
Routes 1.6:
* Fixed append_slash to take effect in the route generation itself instead of
relying on url_for function. Reported by ToddG.
* Added additional url_for tests to ensure map.resource generates proper named
routes.
* WARNING: Changed map.resource initialization to accept individual member and
collection names to generate proper singular and plural route names. Those
using map.resource will need to update their routes and url_for statements
accordingly.
* Added additional map.resource recognition tests.
* Added WSGI middleware that does route resolving using new `WSGI.org Routing
Vars Spec `_.
* Added _absolute keyword option route connect to ignore SCRIPT_NAME settings.
Suggested by Ian Bicking.
**Oct. 16th, 2006**
Routes 1.5.2:
* Fixed qualified keyword to keep host port names when used, unless a host
is specifically passed in. Reported by Jon Rosebaugh.
* Added fully_qualified keyword option to url_for to have it generate a full
URL. Resolves #29.
* Fixed examples in url_for doc strings so they'll be accurate.
**Oct. 4th, 2006**
Routes 1.5.1:
* Fixed bug with escaping part names in the regular expression, reported by
James Taylor.
**Sept. 19th, 2006**
Routes 1.5 released:
* Significant updates to map.resource and unit tests that comb it thoroughly
to ensure its creating all the proper routes (it now is). Increased unit
testing coverage to 95%.
* Added unit tests to ensure controller_scan works properly with nested
controller files and appropriately scans the directory structure. This
brings the Routes util module up to full code coverage.
* Fixed url_for so that when the protocol is changed, port information is
removed from the host.
* Added more thorough testing to _RequestConfig object and the ability to
set your own object. This increases testing coverage of the __init__ module
to 100%.
* Fixed bug with sub_domain not maintaining port information in url_for and
added unit tests. Reported by Jonathan Rosebaugh.
* Added unit tests to ensure sub_domain option works with named routes, cleaned
up url_for memory argument filtering. Fixed bug with named routes and sub_domain
option not working together, reported by Jonathan Rosebaugh.
* Changed order in which sub-domain is added to match-dict so it can be used
in a conditions function.
**Sept. 6th, 2006**
Routes 1.4.1 released:
* Added sub_domains option to mapper, along with sub_domains_ignore list for
subdomains that are considered equivalent to the main domain. When sub_domains
is active, url_for will now take a sub_domain option that can alter the host
the route will go to.
* Added ability for filter functions to provide a _host, _protocol, _anchor arg
which is then used to create the URL with the appropriate host/protocol/anchor
destination.
* Patch applied from Ticket #28. Resolves issue with Mapper's controller_scan
function requiring a valid directory argument. Submitted by Zoran Isailovski.
**July 21, 2006**
Routes 1.4 released:
* Fixed bug with map.resource related to member methods, found in Rails version.
* Fixed bug with map.resource member methods not requiring a member id.
* Fixed bug related to handling keyword argument controller.
* Added map.resource command which can automatically generate a batch of routes intended
to be used in a REST-ful manner by a web framework.
* Added URL generation handling for a 'method' argument. If 'method' is specified, it
is not dropped and will be changed to '_method' for use by the framework.
* Added conditions option to map.connect. Accepts a dict with optional keyword args
'method' or 'function'. Method is a list of HTTP methods that are valid for the route.
Function is a function that will be called with environ and matchdict where matchdict is
the dict created by the URL match.
* Fixed redirect_to function for using absolute URL's. redirect_to now passes all args to
url_for, then passes the resulting URL to the redirect function. Reported by climbus.
**April 30th, 2006**
Routes 1.3.2 released with:
* Fixed _filter bug with inclusion in match dict during matching, reported by David Creemer.
* Fixed improper url quoting by using urllib.encode, patch by Jason Culverhouse.
**April 4th, 2006**
Routes 1.3.1 released with:
* Mapper has an optional attribute ``append_slash``. When set to ``True``, any URL's
generated will have a slash appended to the end.
* Fixed prefix option so that if the PATH_INFO is empty after prefix regexp, its set to
'/' so the match proceeds ok.
* Fixed prefix bug that caused routes after the initial one to not see the proper url
for matching. Caught by Jochen Kupperschmidt.
**February 25th, 2006**
Routes 1.3 released with:
* Filter functionality when using named routes
* Fixed Python 2.3 incompatibility issue with 1.2
**February 17th, 2006**
Routes 1.2 released with:
* Mapper debugging capabilities
* URL generation enhancements for application portability
* Static named routes
**January 13th, 2006**
Routes 1.1 released with:
* Easier integration
* Powerful Groupings syntax for more flexibility
Credits
=======
Many thanks to `Nicholas Seckar `_ for his insight and explanation of many aspects of the Rails Route system.
Author
======
`Ben Bangert `_ (`e-mail `_)
Development sponsored by `Parachute LLC. `_