From bb462e7f489bee123f1c5bf37cde06c65cefa5d0 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 12 Dec 2011 01:28:53 -0500 Subject: first cut at __view_defaults__ feature --- pyramid/config/util.py | 4 +++- pyramid/config/views.py | 16 ++++++++++++++++ pyramid/tests/test_config/test_views.py | 27 +++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/pyramid/config/util.py b/pyramid/config/util.py index 3a2f911dc..b0e873de3 100644 --- a/pyramid/config/util.py +++ b/pyramid/config/util.py @@ -43,13 +43,15 @@ def action_method(wrapped): if self._ainfo is None: self._ainfo = [] info = kw.pop('_info', None) + # backframes for outer decorators to actionmethods + backframes = kw.pop('_backframes', 2) if is_nonstr_iter(info) and len(info) == 4: # _info permitted as extract_stack tuple info = ActionInfo(*info) if info is None: try: f = traceback.extract_stack(limit=3) - info = ActionInfo(*f[-2]) + info = ActionInfo(*f[-backframes]) except: # pragma: no cover info = ActionInfo(None, 0, '', '') self._ainfo.append(info) diff --git a/pyramid/config/views.py b/pyramid/config/views.py index a4333b3d6..d8b728bc3 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -1,5 +1,6 @@ import inspect import operator +from functools import wraps from zope.interface import ( Interface, @@ -551,7 +552,22 @@ class MultiView(object): continue raise PredicateMismatch(self.name) +def viewdefaults(wrapped): + def wrapper(*arg, **kw): + defaults = {} + if len(arg) > 1: + view = arg[1] + else: + view = kw.get('view') + if inspect.isclass(view): + defaults = getattr(view, '__view_defaults__', {}) + defaults.update(kw) + defaults['_backframes'] = 3 + return wrapped(*arg, **defaults) + return wraps(wrapped)(wrapper) + class ViewsConfiguratorMixin(object): + @viewdefaults @action_method def add_view(self, view=None, name="", for_=None, permission=None, request_type=None, route_name=None, request_method=None, diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py index a7b0dd574..30a30a1e8 100644 --- a/pyramid/tests/test_config/test_views.py +++ b/pyramid/tests/test_config/test_views.py @@ -1376,6 +1376,33 @@ class TestViewsConfigurationMixin(unittest.TestCase): self.assertEqual(view(None, None), 'OK') self.assertEqual(Mapper.kw['mapper'], Mapper) + def test_add_view_with_view_defaults(self): + from pyramid.renderers import null_renderer + from pyramid.exceptions import PredicateMismatch + from zope.interface import directlyProvides + class view(object): + __view_defaults__ = { + 'containment':'pyramid.tests.test_config.IDummy' + } + def __init__(self, request): + pass + def __call__(self): + return 'OK' + config = self._makeOne(autocommit=True) + config.add_view( + view=view, + renderer=null_renderer) + wrapper = self._getViewCallable(config) + context = DummyContext() + directlyProvides(context, IDummy) + request = self._makeRequest(config) + self.assertEqual(wrapper(context, request), 'OK') + + context = DummyContext() + request = self._makeRequest(config) + self.assertRaises(PredicateMismatch, wrapper, context, request) + + def test_derive_view_function(self): from pyramid.renderers import null_renderer def view(request): -- cgit v1.2.3