diff options
Diffstat (limited to 'repoze/bfg/urldispatch.py')
| -rw-r--r-- | repoze/bfg/urldispatch.py | 114 |
1 files changed, 8 insertions, 106 deletions
diff --git a/repoze/bfg/urldispatch.py b/repoze/bfg/urldispatch.py index ead8876de..2b6717891 100644 --- a/repoze/bfg/urldispatch.py +++ b/repoze/bfg/urldispatch.py @@ -31,85 +31,6 @@ deprecated('RoutesContext', "DefaultRoutesContext')", ) -class RoutesMapper(object): - """ The ``RoutesMapper`` is a wrapper for the ``get_root`` - callable passed in to the repoze.bfg ``Router`` at initialization - time. When it is instantiated, it wraps the get_root of an - application in such a way that the `Routes - <http://routes.groovie.org/index.html>`_ engine has the 'first - crack' at resolving the current request URL to a repoze.bfg view. - Any view that claims it is 'for' the interface - ``repoze.bfg.interfaces.IRoutesContext`` will be called if its - *name* matches the Routes 'controller' name for the match. It - will be passed a context object that has attributes that match the - Routes match arguments dictionary keys. If no Routes route - matches the current request, the 'fallback' get_root is called. - - .. warning:: This class is deprecated. As of :mod:`repoze.bfg` - 0.6.3, you should use the ``<route.. >`` ZCML directive instead - of manually creating a RoutesMapper. See :ref:`urldispatch_chapter` - for more information. - """ - def __init__(self, get_root): - self.get_root = get_root - self.mapper = Mapper(controller_scan=None, directory=None, - explicit=True, always_scan=False) - self.mapper.explicit = True - self._regs_created = False - - def __call__(self, environ): - if not self._regs_created: - self.mapper.create_regs([]) - self._regs_created = True - path = environ.get('PATH_INFO', '/') - self.mapper.environ = environ - args = self.mapper.match(path) - if isinstance(args, dict): # might be an empty dict - context_factory = args.get('context_factory', _marker) - if context_factory is _marker: - context_factory = DefaultRoutesContext - else: - args = args.copy() - del args['context_factory'] - config = request_config() - config.mapper = self.mapper - config.mapper_dict = args - config.host = environ.get('HTTP_HOST', environ['SERVER_NAME']) - config.protocol = environ['wsgi.url_scheme'] - config.redirect = None - context = context_factory(**args) - alsoProvides(context, IRoutesContext) - return context - - # fall back to original get_root - return self.get_root(environ) - - def connect(self, *arg, **kw): - """ Add a route to the Routes mapper associated with this - request. This method accepts the same arguments as a Routes - *Mapper* object. One differences exists: if the - ``context_factory`` is passed in with a value as a keyword - argument, this callable will be called when a model object - representing the ``context`` for the request needs to be - constructed. It will be called with the (all-keyword) - arguments supplied by the Routes mapper's ``match`` method for - this route, and should return an instance of a class. If - ``context_factory`` is not supplied in this way for a route, a - default context factory (the ``DefaultRoutesContext`` class) - will be used. The interface - ``repoze.bfg.interfaces.IRoutesContext`` will always be tacked - on to the context instance in addition to whatever interfaces - the context instance already supplies. - """ - - self.mapper.connect(*arg, **kw) - -deprecated('RoutesMapper', - 'Usage of the ``RoutesMapper`` class is deprecated. As of ' - 'repoze.bfg 0.6.3, you should use the ``<route.. >`` ZCML ' - 'directive instead of manually creating a RoutesMapper.', - ) - class RoutesContextNotFound(object): implements(IContextNotFound) def __init__(self, msg): @@ -172,7 +93,7 @@ class RoutesRootFactory(Mapper): args = args.copy() routepath = route.routepath factory = route._factory - if not factory: + if factory is None: factory = DefaultRoutesContext config = request_config() config.mapper = self @@ -189,9 +110,7 @@ class RoutesRootFactory(Mapper): kw[k] = v context = factory(**kw) environ['wsgiorg.routing_args'] = ((), kw) - provides = route._provides - for iface in provides: - alsoProvides(context, iface) + environ['bfg.route'] = route alsoProvides(context, IRoutesContext) return context @@ -207,29 +126,12 @@ class RoutesModelTraverser(object): self.context = context def __call__(self, environ): - # the traverser *wants* to get routing args from the environ - # as of 0.6.5; the rest of this stuff is for backwards - # compatibility - try: - # 0.6.5 + - match = environ['wsgiorg.routing_args'][1] - except KeyError: - # <= 0.6.4 - match = self.context.__dict__ - try: - view_name = match['view_name'] - except KeyError: - # b/w compat < 0.6.3 - try: - view_name = match['controller'] - except KeyError: - view_name = '' - try: - subpath = match['subpath'] + route = environ['bfg.route'] + match = environ['wsgiorg.routing_args'][1] + + subpath = match.get('subpath', []) + if subpath: subpath = filter(None, subpath.split('/')) - except KeyError: - # b/w compat < 0.6.5 - subpath = [] if 'path_info' in match: # this is stolen from routes.middleware; if the route map @@ -245,7 +147,7 @@ class RoutesModelTraverser(object): if environ['SCRIPT_NAME'].endswith('/'): environ['SCRIPT_NAME'] = environ['SCRIPT_NAME'][:-1] - return self.context, view_name, subpath, None, self.context, None + return self.context, route.name, subpath, None, self.context, None class RoutesContextURL(object): """ The IContextURL adapter used to generate URLs for a context |
