diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-05-31 20:36:53 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-05-31 20:36:53 +0000 |
| commit | 6c7b9a1534d35aeb07f4a9a59b8e15633f6b6b6b (patch) | |
| tree | 184f1553b041226cac7e8a83b71578e556e15874 /repoze | |
| parent | 8c3b807625d0480c7ce934bf7daf3437328346bf (diff) | |
| download | pyramid-6c7b9a1534d35aeb07f4a9a59b8e15633f6b6b6b.tar.gz pyramid-6c7b9a1534d35aeb07f4a9a59b8e15633f6b6b6b.tar.bz2 pyramid-6c7b9a1534d35aeb07f4a9a59b8e15633f6b6b6b.zip | |
- The ``request_type`` argument of ZCML ``view`` declarations and
``bfg_view`` decorators can now be one of the strings ``GET``,
``POST``, ``PUT``, ``DELETE``, or ``HEAD`` instead of a reference to
the respective interface type imported from
``repoze.bfg.interfaces``.
Diffstat (limited to 'repoze')
| -rw-r--r-- | repoze/bfg/request.py | 12 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 41 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 18 |
3 files changed, 63 insertions, 8 deletions
diff --git a/repoze/bfg/request.py b/repoze/bfg/request.py index de5711e0a..44a232d0d 100644 --- a/repoze/bfg/request.py +++ b/repoze/bfg/request.py @@ -21,8 +21,8 @@ class Request(WebobRequest): # an optimization (e.g. preventing calls to ``alsoProvides`` means the # difference between 590 r/s and 690 r/s on a MacBook 2GHz). These # classes are *not* APIs. None of these classes, nor the -# ``HTTP_METHOD_FACTORIES`` lookup dict should be imported directly by -# user code. +# ``HTTP_METHOD_FACTORIES`` or ``HTTP_METHOD_INTERFACES`` lookup dicts +# should be imported directly by user code. class GETRequest(WebobRequest): implements(repoze.bfg.interfaces.IGETRequest) @@ -52,3 +52,11 @@ HTTP_METHOD_FACTORIES = { 'HEAD':HEADRequest, } +HTTP_METHOD_INTERFACES = { + 'GET':repoze.bfg.interfaces.IGETRequest, + 'POST':repoze.bfg.interfaces.IPOSTRequest, + 'PUT':repoze.bfg.interfaces.IPUTRequest, + 'DELETE':repoze.bfg.interfaces.IDELETERequest, + 'HEAD':repoze.bfg.interfaces.IHEADRequest, + } + diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index e44fe1307..0b24071e2 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -109,7 +109,7 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(regadapt['args'][4], '') self.assertEqual(regadapt['args'][5], None) - def test_request_type(self): + def test_request_type_asinterface(self): context = DummyContext() class IFoo: pass @@ -148,6 +148,42 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(regadapt['args'][4], '') self.assertEqual(regadapt['args'][5], None) + def test_request_type_ashttpmethod(self): + context = DummyContext() + class IFoo: + pass + view = lambda *arg: None + self._callFUT(context, 'repoze.view', IFoo, view=view, + request_type='GET') + actions = context.actions + from repoze.bfg.interfaces import IView + from repoze.bfg.interfaces import IGETRequest + + self.assertEqual(len(actions), 2) + + permission = actions[0] + self.assertEqual(permission['args'][2], (IFoo, IGETRequest)) + regadapt = actions[1] + regadapt_discriminator = ('view', IFoo, '', IDummy, IView) + self.assertEqual(regadapt['args'][2], (IFoo, IGETRequest)) + + def test_request_type_asinterfacestring(self): + context = DummyContext() + class IFoo: + pass + view = lambda *arg: None + self._callFUT(context, 'repoze.view', IFoo, view=view, + request_type='whatever') + actions = context.actions + from repoze.bfg.interfaces import IView + self.assertEqual(len(actions), 2) + + permission = actions[0] + self.assertEqual(permission['args'][2], (IFoo, IDummy)) + regadapt = actions[1] + regadapt_discriminator = ('view', IFoo, '', IDummy, IView) + self.assertEqual(regadapt['args'][2], (IFoo, IDummy)) + def test_adapted_class(self): from zope.interface import Interface import zope.component @@ -633,6 +669,9 @@ class DummyContext: 'args':args} ) + def resolve(self, dottedname): + return IDummy + class Dummy: pass diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 39366b0b1..0f9d4a22b 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -25,6 +25,8 @@ from repoze.bfg.interfaces import IRoutesContext from repoze.bfg.interfaces import IViewPermission from repoze.bfg.interfaces import IView +from repoze.bfg.request import HTTP_METHOD_INTERFACES + from repoze.bfg.security import ViewPermissionFactory import martian @@ -68,6 +70,15 @@ def view( # the view specification; we ignore it. pass + if request_type is None: + request_type = IRequest + + elif isinstance(request_type, basestring): + if request_type in HTTP_METHOD_INTERFACES: + request_type = HTTP_METHOD_INTERFACES[request_type] + else: + request_type = _context.resolve(request_type) + if inspect.isclass(view): # If the object we've located is a class, turn it into a # function that operates like a Zope view (when it's invoked, @@ -84,9 +95,6 @@ def view( _bfg_class_view.__doc__ = view.__doc__ view = _bfg_class_view - if request_type is None: - request_type = IRequest - if permission: pfactory = ViewPermissionFactory(permission) _context.action( @@ -132,8 +140,8 @@ class IViewDirective(Interface): required=False, ) - request_type = GlobalObject( - title=u"""The request type interface for the view""", + request_type = TextLine( + title=u"The request type string or dotted name interface for the view", description=(u"The view will be called if the interface represented by " u"'request_type' is implemented by the request. The " u"default request type is repoze.bfg.interfaces.IRequest"), |
