summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-12-14 03:01:54 -0500
committerChris McDonough <chrism@plope.com>2011-12-14 03:01:54 -0500
commit914abe3b0b5d4068d33050f4695c3a3f4a7ecf78 (patch)
treeb1b340e3e69e773ffb7cfe36289c0fc1519f2f68
parentbb462e7f489bee123f1c5bf37cde06c65cefa5d0 (diff)
downloadpyramid-914abe3b0b5d4068d33050f4695c3a3f4a7ecf78.tar.gz
pyramid-914abe3b0b5d4068d33050f4695c3a3f4a7ecf78.tar.bz2
pyramid-914abe3b0b5d4068d33050f4695c3a3f4a7ecf78.zip
add view_defaults class decorator; fix mutability bug with __view_defaults__
-rw-r--r--pyramid/config/views.py2
-rw-r--r--pyramid/tests/test_view.py16
-rw-r--r--pyramid/view.py5
3 files changed, 22 insertions, 1 deletions
diff --git a/pyramid/config/views.py b/pyramid/config/views.py
index d8b728bc3..fd736682a 100644
--- a/pyramid/config/views.py
+++ b/pyramid/config/views.py
@@ -560,7 +560,7 @@ def viewdefaults(wrapped):
else:
view = kw.get('view')
if inspect.isclass(view):
- defaults = getattr(view, '__view_defaults__', {})
+ defaults = getattr(view, '__view_defaults__', {}).copy()
defaults.update(kw)
defaults['_backframes'] = 3
return wrapped(*arg, **defaults)
diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py
index 1bdb066c0..2fa9ced74 100644
--- a/pyramid/tests/test_view.py
+++ b/pyramid/tests/test_view.py
@@ -570,6 +570,22 @@ class Test_static(unittest.TestCase):
view = self._makeOne(path, None)
self.assertEqual(view.docroot, 'fixtures')
+class Test_view_defaults(unittest.TestCase):
+ def test_it(self):
+ from pyramid.view import view_defaults
+ @view_defaults(route_name='abc', renderer='def')
+ class Foo(object): pass
+ self.assertEqual(Foo.__view_defaults__['route_name'],'abc')
+ self.assertEqual(Foo.__view_defaults__['renderer'],'def')
+
+ def test_it_single_inheritance_non_overridden(self):
+ from pyramid.view import view_defaults
+ @view_defaults(route_name='abc', renderer='def')
+ class Foo(object): pass
+ class Bar(Foo): pass
+ self.assertEqual(Bar.__view_defaults__['route_name'],'abc')
+ self.assertEqual(Bar.__view_defaults__['renderer'],'def')
+
class ExceptionResponse(Exception):
status = '404 Not Found'
app_iter = ['Not Found']
diff --git a/pyramid/view.py b/pyramid/view.py
index da5a71c4c..098488f85 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -223,6 +223,11 @@ class view_config(object):
bfg_view = view_config # bw compat (forever)
+class view_defaults(view_config):
+ def __call__(self, wrapped):
+ wrapped.__view_defaults__ = self.__dict__.copy()
+ return wrapped
+
class AppendSlashNotFoundViewFactory(object):
""" There can only be one :term:`Not Found view` in any
:app:`Pyramid` application. Even if you use