diff options
| author | Chris McDonough <chrism@plope.com> | 2011-12-12 01:28:53 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-12-12 01:28:53 -0500 |
| commit | bb462e7f489bee123f1c5bf37cde06c65cefa5d0 (patch) | |
| tree | c6668d5da7b03bcdbdb4dfe36772277b400bf5dc | |
| parent | 99520ee274400c246ab073f598dff32acc256fa9 (diff) | |
| download | pyramid-bb462e7f489bee123f1c5bf37cde06c65cefa5d0.tar.gz pyramid-bb462e7f489bee123f1c5bf37cde06c65cefa5d0.tar.bz2 pyramid-bb462e7f489bee123f1c5bf37cde06c65cefa5d0.zip | |
first cut at __view_defaults__ feature
| -rw-r--r-- | pyramid/config/util.py | 4 | ||||
| -rw-r--r-- | pyramid/config/views.py | 16 | ||||
| -rw-r--r-- | pyramid/tests/test_config/test_views.py | 27 |
3 files changed, 46 insertions, 1 deletions
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): |
