diff options
| author | Malthe Borch <mborch@gmail.com> | 2009-10-22 13:17:19 +0000 |
|---|---|---|
| committer | Malthe Borch <mborch@gmail.com> | 2009-10-22 13:17:19 +0000 |
| commit | 7a13fbf4f966df1a4a35c47003155f41fe498a93 (patch) | |
| tree | 41fb63b4104e24e292705bd1f5fea5a483e7cb65 /repoze | |
| parent | d6df9b056b5ea87e8d08cbc52c284b5eb154b29b (diff) | |
| download | pyramid-7a13fbf4f966df1a4a35c47003155f41fe498a93.tar.gz pyramid-7a13fbf4f966df1a4a35c47003155f41fe498a93.tar.bz2 pyramid-7a13fbf4f966df1a4a35c47003155f41fe498a93.zip | |
Added ``path_info`` predicate (regex-filters on the corresponding HTTP header).
Diffstat (limited to 'repoze')
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 204 | ||||
| -rw-r--r-- | repoze/bfg/view.py | 11 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 29 |
3 files changed, 187 insertions, 57 deletions
diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index aed4758f4..8bd50842c 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -40,7 +40,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -72,7 +72,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -109,7 +109,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -141,7 +141,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -181,7 +181,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -220,7 +220,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -260,7 +260,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -299,7 +299,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -350,7 +350,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -386,7 +386,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -415,7 +415,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IDummy, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -446,7 +446,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', Dummy, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -473,7 +473,7 @@ class TestViewDirective(unittest.TestCase): action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, 'GET', None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -503,7 +503,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(actions[0]['discriminator'], discrim) register = actions[0]['callable'] register() @@ -537,7 +537,7 @@ class TestViewDirective(unittest.TestCase): factory = sm.getUtility(IRouteRequest, 'foo') request_type = implementedBy(factory) discrim = ('view', IFoo, '', request_type, IView, None, None, None, - 'foo', None, False, None, None) + 'foo', None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) the_view = sm.adapters.lookup((IFoo, request_type), IView, name='') request = factory({}) @@ -560,7 +560,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, 'POST', None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -587,7 +587,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, 'POST', None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -613,7 +613,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, 'abc', None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -640,7 +640,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, 'abc', None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -666,7 +666,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, 'abc', None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -693,7 +693,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, 'abc', None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -719,7 +719,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, True, None, None) + None, True, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -746,7 +746,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, True, None, None) + None, True, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -787,7 +787,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, 'Host') + None, False, None, 'Host', None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -814,7 +814,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, 'Host') + None, False, None, 'Host', None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -840,7 +840,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, r'Host:\d') + None, False, None, r'Host:\d', None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -867,7 +867,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, r'Host:\d') + None, False, None, r'Host:\d', None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -893,7 +893,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, 'text/xml', None) + None, False, 'text/xml', None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -920,7 +920,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, 'text/xml', None) + None, False, 'text/xml', None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -948,7 +948,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, IFoo, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -976,7 +976,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, IFoo, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -985,6 +985,72 @@ class TestViewDirective(unittest.TestCase): context = Dummy() self.assertRaises(NotFound, wrapper, context, request) + def test_with_path_info_badregex(self): + from zope.component import getSiteManager + from zope.interface import Interface + from zope.configuration.exceptions import ConfigurationError + class IFoo(Interface): + pass + context = DummyContext() + view = lambda *arg: None + sm = getSiteManager() + def view(context, request): + """ """ + self.assertRaises(ConfigurationError, self._callFUT, + context, None, IFoo, + view=view, path_info='\\') + + def test_with_path_info_match(self): + from zope.component import getSiteManager + from zope.interface import Interface + from repoze.bfg.interfaces import IRequest + from repoze.bfg.interfaces import IView + class IFoo(Interface): + pass + context = DummyContext() + view = lambda *arg: None + sm = getSiteManager() + def view(context, request): + return '123' + self._callFUT(context, None, IFoo, view=view, path_info='/foo') + actions = context.actions + self.assertEqual(len(actions), 1) + action = actions[0] + discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, + None, False, None, None, '/foo') + self.assertEqual(action['discriminator'], discrim) + register = action['callable'] + register() + wrapper = sm.adapters.lookup((IFoo, IRequest), IView, name='') + request = DummyRequest({'PATH_INFO': '/foo'}) + self.assertEqual(wrapper(None, request), '123') + + def test_with_path_info_nomatch(self): + from zope.component import getSiteManager + from zope.interface import Interface + from repoze.bfg.interfaces import IRequest + from repoze.bfg.interfaces import IView + from repoze.bfg.exceptions import NotFound + class IFoo(Interface): + pass + context = DummyContext() + view = lambda *arg: None + sm = getSiteManager() + def view(context, request): + return '123' + self._callFUT(context, None, IFoo, view=view, path_info='/boo') + actions = context.actions + self.assertEqual(len(actions), 1) + action = actions[0] + discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, + None, False, None, None, '/boo') + self.assertEqual(action['discriminator'], discrim) + register = action['callable'] + register() + wrapper = sm.adapters.lookup((IFoo, IRequest), IView, name='') + request = DummyRequest({'PATH_INFO': '/foo'}) + self.assertRaises(NotFound, wrapper, None, request) + def test_multiview_replaces_traditional_view(self): from zope.component import getSiteManager from zope.interface import Interface @@ -1004,7 +1070,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -1139,7 +1205,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', IFoo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -1166,7 +1232,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(len(actions), 1) action = actions[0] discrim = ('view', Foo, '', IRequest, IView, None, None, None, None, - None, False, None, None) + None, False, None, None, None) self.assertEqual(action['discriminator'], discrim) register = action['callable'] register() @@ -1531,7 +1597,7 @@ class TestRouteDirective(unittest.TestCase): from repoze.bfg.interfaces import IRouteRequest from repoze.bfg.zcml import connect_route from repoze.bfg.interfaces import IView - + context = DummyContext() def view(context, request): return '123' @@ -1547,7 +1613,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) register = view_action['callable'] register() @@ -1588,7 +1654,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', IDummy, '', request_type, IView, None, None, None, - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') request = DummyRequest() @@ -1644,7 +1710,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, 'GET', - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1681,7 +1747,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, 'GET', - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1719,7 +1785,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, 'GET', - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1756,7 +1822,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, 'GET', - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1793,7 +1859,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, True, None, None, - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1830,7 +1896,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, True, None, None, - 'name', None, False, None, None) + 'name', None, False, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1867,7 +1933,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, False, None, 'Host') + 'name', None, False, None, 'Host', None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1904,7 +1970,44 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, False, None, 'Host') + 'name', None, False, None, 'Host', None) + self.assertEqual(view_discriminator, discrim) + wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') + self.failUnless(wrapped) + + route_action = actions[1] + route_callable = route_action['callable'] + route_discriminator = route_action['discriminator'] + route_args = route_action['args'] + self.assertEqual(route_callable, connect_route) + self.assertEqual(len(route_discriminator), 2) + self.assertEqual(route_discriminator[0], 'route') + self.assertEqual(route_discriminator[1], 'name') + self.assertEqual(route_args, ('path', 'name', None)) + + def test_with_view_path_info(self): + from zope.component import getSiteManager + from zope.interface import implementedBy + from repoze.bfg.zcml import connect_route + from repoze.bfg.interfaces import IView + from repoze.bfg.interfaces import IRouteRequest + + context = DummyContext() + def view(context, request): + """ """ + self._callFUT(context, 'name', 'path', view=view, view_path_info='/foo') + actions = context.actions + self.assertEqual(len(actions), 2) + + view_action = actions[0] + register = view_action['callable'] + register() + sm = getSiteManager() + request_factory = sm.getUtility(IRouteRequest, 'name') + request_type = implementedBy(request_factory) + view_discriminator = view_action['discriminator'] + discrim = ('view', None, '', request_type, IView, None, None, None, + 'name', None, False, None, None, '/foo') self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1941,7 +2044,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, True, None, None) + 'name', None, True, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -1978,7 +2081,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, True, None, None) + 'name', None, True, None, None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -2016,7 +2119,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, False, 'text/xml', None) + 'name', None, False, 'text/xml', None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -2053,7 +2156,7 @@ class TestRouteDirective(unittest.TestCase): request_type = implementedBy(request_factory) view_discriminator = view_action['discriminator'] discrim = ('view', None, '', request_type, IView, None, None, None, - 'name', None, False, 'text/xml', None) + 'name', None, False, 'text/xml', None, None) self.assertEqual(view_discriminator, discrim) wrapped = sm.adapters.lookup((IDummy, request_type), IView, name='') self.failUnless(wrapped) @@ -2511,7 +2614,8 @@ class DummyRequest: if environ is None: environ = {} self.environ = environ - + self.path_info = environ.get('PATH_INFO', None) + def get_response(self, app): return app diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py index c1e560ea8..11aea496f 100644 --- a/repoze/bfg/view.py +++ b/repoze/bfg/view.py @@ -242,8 +242,8 @@ class bfg_view(object): The following arguments are supported: ``for_``, ``permission``, ``name``, ``request_type``, ``route_name``, ``request_method``, - ``request_param``, ``containment``, ``xhr``, ``accept``, and - ``header``. + ``request_param``, ``containment``, ``xhr``, ``accept``, + ``header`` and ``path_info``. If ``for_`` is not supplied, the interface ``zope.interface.Interface`` (matching any context) is used. @@ -319,6 +319,10 @@ class bfg_view(object): information about the allowable composition and matching behavior of this value. + If ``path_info`` is specified, it must be a regular + expression. The view will only be invoked if the ``PATH_INFO`` + HTTP header matches the expression. + Any individual or all parameters can be omitted. The simplest bfg_view declaration then becomes:: @@ -420,7 +424,7 @@ class bfg_view(object): def __init__(self, name='', request_type=None, for_=None, permission=None, route_name=None, request_method=None, request_param=None, containment=None, attr=None, renderer=None, wrapper=None, - xhr=False, accept=None, header=None): + xhr=False, accept=None, header=None, path_info=None): self.name = name self.request_type = request_type self.for_ = for_ @@ -435,6 +439,7 @@ class bfg_view(object): self.xhr = xhr self.accept = accept self.header = header + self.path_info = path_info def __call__(self, wrapped): setting = self.__dict__.copy() diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 84b1243d1..7dc9cd2a0 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -141,6 +141,12 @@ class IViewDirective(Interface): description=u'Regular expression matching for header values', required = False) + path_info = TextLine( + title = (u'Regular expression which must match the ``PATH_INFO`` ' + 'header for the view to match a request'), + description=(u'Accepts a regular expression.'), + required = False) + def view( _context, permission=None, @@ -158,6 +164,7 @@ def view( xhr=False, accept=None, header=None, + path_info=None, cacheable=True, # not used, here for b/w compat < 0.8 ): @@ -269,6 +276,15 @@ def view( weight = weight - 50 predicates.append(containment_predicate) + if path_info is not None: + try: + path_info_val = re.compile(path_info) + except re.error, why: + raise ConfigurationError(why[0]) + def path_info_predicate(context, request): + return path_info_val.match(request.path_info) + predicates.append(path_info_predicate) + # this will be == sys.maxint if no predicates score = weight / (len(predicates) + 1) @@ -323,7 +339,7 @@ def view( _context.action( discriminator = ('view', for_, name, request_type, IView, containment, request_param, request_method, route_name, attr, - xhr, accept, header), + xhr, accept, header, path_info), callable = register, args = (), ) @@ -536,6 +552,7 @@ class IRouteDirective(Interface): view_header = TextLine(title=u'view_header', required=False) view_accept = TextLine(title=u'view_accept', required=False) view_xhr = Bool(title=u'view_xhr', required=False) + view_path_info = TextLine(title=u'view_path_info', required=False) # alias for "view_for" for_ = GlobalObject(title=u'for', required=False) # alias for "view_permission" @@ -560,6 +577,8 @@ class IRouteDirective(Interface): accept = TextLine(title=u'accept', required=False) # alias for "view_xhr" xhr = Bool(title=u'xhr', required=False) + # alias for "view_path_info" + path_info = TextLine(title=u'path_info', required=False) class IRouteRequirementDirective(Interface): """ The interface for the ``requirement`` route subdirective """ @@ -574,7 +593,8 @@ def route(_context, name, path, view=None, view_for=None, request_param=None, view_request_param=None, containment=None, view_containment=None, attr=None, view_attr=None, renderer=None, view_renderer=None, header=None, view_header=None, accept=None, - view_accept=None, xhr=False, view_xhr=False): + view_accept=None, xhr=False, view_xhr=False, + path_info=None, view_path_info=None): """ Handle ``route`` ZCML directives """ # the strange ordering of the request kw args above is for b/w @@ -590,9 +610,10 @@ def route(_context, name, path, view=None, view_for=None, header = view_header or header accept = view_accept or accept xhr = view_xhr or xhr + path_info = view_path_info or path_info sm = getSiteManager() - + if request_type in ('GET', 'HEAD', 'PUT', 'POST', 'DELETE'): # b/w compat for 1.0 request_method = request_type @@ -610,7 +631,7 @@ def route(_context, name, path, view=None, view_for=None, request_type=request_type, route_name=name, request_method=request_method, request_param=request_param, containment=containment, attr=attr, renderer=renderer, - header=header, accept=accept, xhr=xhr) + header=header, accept=accept, xhr=xhr, path_info=path_info) _context.action( discriminator = ('route', name), |
