diff options
| author | Chris McDonough <chrism@plope.com> | 2011-12-14 03:01:54 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2011-12-14 03:01:54 -0500 |
| commit | 914abe3b0b5d4068d33050f4695c3a3f4a7ecf78 (patch) | |
| tree | b1b340e3e69e773ffb7cfe36289c0fc1519f2f68 | |
| parent | bb462e7f489bee123f1c5bf37cde06c65cefa5d0 (diff) | |
| download | pyramid-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.py | 2 | ||||
| -rw-r--r-- | pyramid/tests/test_view.py | 16 | ||||
| -rw-r--r-- | pyramid/view.py | 5 |
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 |
