diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-06-22 08:56:22 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-06-22 08:56:22 +0000 |
| commit | cca0d8edb5216ee1c3e4d3a96df9c153292a94aa (patch) | |
| tree | 6ee3a4fc467393f884b5e9a87eac25b53474d989 | |
| parent | 548d30eb11fbd081852139522d789fedc5683bf1 (diff) | |
| download | pyramid-cca0d8edb5216ee1c3e4d3a96df9c153292a94aa.tar.gz pyramid-cca0d8edb5216ee1c3e4d3a96df9c153292a94aa.tar.bz2 pyramid-cca0d8edb5216ee1c3e4d3a96df9c153292a94aa.zip | |
- Add a ``view_for`` attribute to the ``route`` ZCML directive. This
attribute should refer to an interface or a class (ala the ``for``
attribute of the ``view`` ZCML directive).
| -rw-r--r-- | CHANGES.txt | 7 | ||||
| -rw-r--r-- | docs/narr/urldispatch.rst | 10 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 46 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 4 |
4 files changed, 64 insertions, 3 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index b69653e3f..dae7cfb75 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,12 @@ Next release ============ -- ... +Features +-------- + +- Add a ``view_for`` attribute to the ``route`` ZCML directive. This + attribute should refer to an interface or a class (ala the ``for`` + attribute of the ``view`` ZCML directive). 1.0a1 (2009-06-22) ================== diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst index 91063fc26..f62a682c9 100644 --- a/docs/narr/urldispatch.rst +++ b/docs/narr/urldispatch.rst @@ -91,7 +91,15 @@ view The Python dotted-path name to a function that will be used as a view callable when this route matches. - e.g. ``mypackage.views.my_view``. This attribute is required. + e.g. ``mypackage.views.my_view``. + +view_for + + The Python dotted-path name to a class or an interface that the + :term:`context` of the view should match for the view named by the + route to be used. This attribute is only useful if the ``view`` + attribute is used. If this attribute is not specified, the default + (``None``) will be used. permission diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index 30938d101..9302486b6 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -923,6 +923,52 @@ class TestRouteDirective(unittest.TestCase): self.assertEqual(route_discriminator[6], None) self.assertEqual(route_args, (route,)) + def test_after_with_view_and_view_for(self): + from repoze.bfg.zcml import handler + from repoze.bfg.zcml import connect_route + from repoze.bfg.interfaces import IView + + context = DummyContext() + view = Dummy() + route = self._makeOne(context, 'path', 'name', view=view, + view_for=IDummy) + route.after() + actions = context.actions + self.assertEqual(len(actions), 2) + + factories = context.request_factories + request_iface = factories['name'][None]['interface'] + + view_action = actions[0] + view_callable = view_action['callable'] + view_discriminator = view_action['discriminator'] + view_args = view_action['args'] + self.assertEqual(view_callable, handler) + self.assertEqual(len(view_discriminator), 5) + self.assertEqual(view_discriminator[0], 'view') + self.assertEqual(view_discriminator[1], IDummy) + self.assertEqual(view_discriminator[2],'') + self.assertEqual(view_discriminator[3], request_iface) + self.assertEqual(view_discriminator[4], IView) + self.assertEqual(view_args, ('registerAdapter', view, + (IDummy, request_iface), IView, + '', None)) + + 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), 7) + self.assertEqual(route_discriminator[0], 'route') + self.assertEqual(route_discriminator[1], 'name') + self.assertEqual(route_discriminator[2],'{}') + self.assertEqual(route_discriminator[3], None) + self.assertEqual(route_discriminator[4], None) + self.assertEqual(route_discriminator[5], None) + self.assertEqual(route_discriminator[6], None) + self.assertEqual(route_args, (route,)) + def test_after_without_view(self): from repoze.bfg.zcml import connect_route diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 8020cdd9f..57e38386f 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -161,6 +161,7 @@ class IRouteDirective(Interface): name = TextLine(title=u'name', required=True) path = TextLine(title=u'path', required=True) view = GlobalObject(title=u'view', required=False) + view_for = GlobalObject(title=u'view_for', required=False) permission = TextLine(title=u'permission', required=False) factory = GlobalObject(title=u'context factory', required=False) minimize = Bool(title=u'minimize', required=False) @@ -186,6 +187,7 @@ class Route(zope.configuration.config.GroupingContextDecorator): """ Handle ``route`` ZCML directives """ view = None + view_for = None permission = None factory = None minimize = True @@ -232,7 +234,7 @@ class Route(zope.configuration.config.GroupingContextDecorator): context.request_factories[name] = named_request_factories(name) if self.view: - view(context, self.permission, None, self.view, '', + view(context, self.permission, self.view_for, self.view, '', self.request_type, name) method = self.condition_method or self.request_type |
