Added support for passing multiple decorators to add_view.
| | |
| | | |
| | | decorator |
| | | |
| | | A :term:`dotted Python name` to function (or the function itself) |
| | | A :term:`dotted Python name` to function (or the function itself, |
| | | or a list or tuple of the aforementioned) |
| | | which will be used to decorate the registered :term:`view |
| | | callable`. The decorator function will be called with the view |
| | | callable`. The decorator function(s) will be called with the view |
| | | callable as a single argument. The view callable it is passed will |
| | | accept ``(context, request)``. The decorator must return a |
| | | accept ``(context, request)``. The decorator(s) must return a |
| | | replacement view callable which also accepts ``(context, |
| | | request)``. |
| | | |
| | |
| | | for_ = self.maybe_dotted(for_) |
| | | containment = self.maybe_dotted(containment) |
| | | mapper = self.maybe_dotted(mapper) |
| | | decorator = self.maybe_dotted(decorator) |
| | | |
| | | def combine(*decorators): |
| | | def decorated(view_callable): |
| | | for decorator in decorators: |
| | | view_callable = decorator(view_callable) |
| | | return view_callable |
| | | return decorated |
| | | |
| | | if isinstance(decorator, (tuple, list)): |
| | | decorator = combine(*map(self.maybe_dotted, decorator)) |
| | | else: |
| | | decorator = self.maybe_dotted(decorator) |
| | | |
| | | if not view: |
| | | if renderer: |
| | |
| | | def makedirs(dir, verbosity, pad): |
| | | parent = os.path.dirname(os.path.abspath(dir)) |
| | | if not os.path.exists(parent): |
| | | makedirs(parent, verbosity, pad) |
| | | makedirs(parent, verbosity, pad) # pragma: no cover |
| | | os.mkdir(dir) |
| | | |
| | | def substitute_filename(fn, vars): |
| | |
| | | result = wrapper(None, None) |
| | | self.assertEqual(result, 'OK') |
| | | |
| | | def test_add_view_with_decorator_tuple(self): |
| | | from pyramid.renderers import null_renderer |
| | | def view(request): |
| | | """ ABC """ |
| | | return 'OK' |
| | | def view_wrapper1(fn): |
| | | def inner(context, request): |
| | | return 'wrapped1' + fn(context, request) |
| | | return inner |
| | | def view_wrapper2(fn): |
| | | def inner(context, request): |
| | | return 'wrapped2' + fn(context, request) |
| | | return inner |
| | | config = self._makeOne(autocommit=True) |
| | | config.add_view(view=view, decorator=(view_wrapper1, view_wrapper2), |
| | | renderer=null_renderer) |
| | | wrapper = self._getViewCallable(config) |
| | | self.assertFalse(wrapper is view) |
| | | self.assertEqual(wrapper.__doc__, view.__doc__) |
| | | result = wrapper(None, None) |
| | | self.assertEqual(result, 'wrapped2wrapped1OK') |
| | | |
| | | def test_add_view_with_http_cache(self): |
| | | import datetime |
| | | from pyramid.response import Response |
| | |
| | | def test_create_with_other_predicates(self): |
| | | decorator = self._makeOne(foo=1) |
| | | self.assertEqual(decorator.foo, 1) |
| | | |
| | | def test_create_decorator_tuple(self): |
| | | decorator = self._makeOne(decorator=('decorator1', 'decorator2')) |
| | | self.assertEqual(decorator.decorator, ('decorator1', 'decorator2')) |
| | | |
| | | def test_call_function(self): |
| | | decorator = self._makeOne() |