Commit cd5a3f35 authored by Martijn Pieters's avatar Martijn Pieters

To aid debugging, generate the facade with the same name as the original callable

parent 01666dcd
...@@ -17,7 +17,7 @@ from zope.publisher.interfaces.browser import IBrowserRequest ...@@ -17,7 +17,7 @@ from zope.publisher.interfaces.browser import IBrowserRequest
_default = [] _default = []
def _buildFacade(spec, docstring): def _buildFacade(name, spec, docstring):
"""Build a facade function, matching the decorated method in signature. """Build a facade function, matching the decorated method in signature.
Note that defaults are replaced by _default, and _curried will reconstruct Note that defaults are replaced by _default, and _curried will reconstruct
...@@ -26,8 +26,8 @@ def _buildFacade(spec, docstring): ...@@ -26,8 +26,8 @@ def _buildFacade(spec, docstring):
""" """
args = inspect.formatargspec(formatvalue=lambda v: '=_default', *spec) args = inspect.formatargspec(formatvalue=lambda v: '=_default', *spec)
callargs = inspect.formatargspec(formatvalue=lambda v: '', *spec) callargs = inspect.formatargspec(formatvalue=lambda v: '', *spec)
return 'def _facade%s:\n """%s"""\n return _curried%s' % ( return 'def %s%s:\n """%s"""\n return _curried%s' % (
args, docstring, callargs) name, args, docstring, callargs)
def requestmethod(*methods): def requestmethod(*methods):
"""Create a request method specific decorator""" """Create a request method specific decorator"""
...@@ -70,9 +70,10 @@ def requestmethod(*methods): ...@@ -70,9 +70,10 @@ def requestmethod(*methods):
return callable(*args, **kw) return callable(*args, **kw)
# Build a facade, with a reference to our locally-scoped _curried # Build a facade, with a reference to our locally-scoped _curried
name = callable.__name__
facade_globs = dict(_curried=_curried, _default=_default) facade_globs = dict(_curried=_curried, _default=_default)
exec _buildFacade(spec, callable.__doc__) in facade_globs exec _buildFacade(name, spec, callable.__doc__) in facade_globs
return facade_globs['_facade'] return facade_globs[name]
return _methodtest return _methodtest
......
...@@ -57,12 +57,16 @@ original closely, and keyword parameter defaults must be preserved:: ...@@ -57,12 +57,16 @@ original closely, and keyword parameter defaults must be preserved::
>>> import inspect >>> import inspect
>>> mutabledefault = dict() >>> mutabledefault = dict()
>>> @requestmethod('POST') >>> @requestmethod('POST')
... def foo(bar, baz=mutabledefault, egg=mutabledefault, REQUEST=None, **kw): ... def foo(bar, baz=mutabledefault, egg=mutabledefault, REQUEST=None, *args):
... return bar, baz is mutabledefault, egg is None, REQUEST ... return bar, baz is mutabledefault, egg is None, REQUEST
>>> inspect.getargspec(foo)[:3] >>> inspect.getargspec(foo)[:3]
(['bar', 'baz', 'egg', 'REQUEST'], None, 'kw') (['bar', 'baz', 'egg', 'REQUEST'], 'args', None)
>>> foo('spam', egg=None) >>> foo('spam', egg=None)
('spam', True, True, None) ('spam', True, True, None)
>>> foo(monty='python')
Traceback (most recent call last):
...
TypeError: foo() got an unexpected keyword argument 'monty'
The requestmethod decorator factory can be used for any request method, simply The requestmethod decorator factory can be used for any request method, simply
pass in the desired request method:: pass in the desired request method::
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment