summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-12-12 01:28:53 -0500
committerChris McDonough <chrism@plope.com>2011-12-12 01:28:53 -0500
commitbb462e7f489bee123f1c5bf37cde06c65cefa5d0 (patch)
treec6668d5da7b03bcdbdb4dfe36772277b400bf5dc
parent99520ee274400c246ab073f598dff32acc256fa9 (diff)
downloadpyramid-bb462e7f489bee123f1c5bf37cde06c65cefa5d0.tar.gz
pyramid-bb462e7f489bee123f1c5bf37cde06c65cefa5d0.tar.bz2
pyramid-bb462e7f489bee123f1c5bf37cde06c65cefa5d0.zip
first cut at __view_defaults__ feature
-rw-r--r--pyramid/config/util.py4
-rw-r--r--pyramid/config/views.py16
-rw-r--r--pyramid/tests/test_config/test_views.py27
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):