summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-05-31 20:36:53 +0000
committerChris McDonough <chrism@agendaless.com>2009-05-31 20:36:53 +0000
commit6c7b9a1534d35aeb07f4a9a59b8e15633f6b6b6b (patch)
tree184f1553b041226cac7e8a83b71578e556e15874 /repoze
parent8c3b807625d0480c7ce934bf7daf3437328346bf (diff)
downloadpyramid-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.py12
-rw-r--r--repoze/bfg/tests/test_zcml.py41
-rw-r--r--repoze/bfg/zcml.py18
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"),