summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-22 08:56:22 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-22 08:56:22 +0000
commitcca0d8edb5216ee1c3e4d3a96df9c153292a94aa (patch)
tree6ee3a4fc467393f884b5e9a87eac25b53474d989
parent548d30eb11fbd081852139522d789fedc5683bf1 (diff)
downloadpyramid-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.txt7
-rw-r--r--docs/narr/urldispatch.rst10
-rw-r--r--repoze/bfg/tests/test_zcml.py46
-rw-r--r--repoze/bfg/zcml.py4
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