summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorMalthe Borch <mborch@gmail.com>2009-10-22 13:17:19 +0000
committerMalthe Borch <mborch@gmail.com>2009-10-22 13:17:19 +0000
commit7a13fbf4f966df1a4a35c47003155f41fe498a93 (patch)
tree41fb63b4104e24e292705bd1f5fea5a483e7cb65 /repoze
parentd6df9b056b5ea87e8d08cbc52c284b5eb154b29b (diff)
downloadpyramid-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.py204
-rw-r--r--repoze/bfg/view.py11
-rw-r--r--repoze/bfg/zcml.py29
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),