From 914abe3b0b5d4068d33050f4695c3a3f4a7ecf78 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Wed, 14 Dec 2011 03:01:54 -0500 Subject: add view_defaults class decorator; fix mutability bug with __view_defaults__ --- pyramid/config/views.py | 2 +- pyramid/tests/test_view.py | 16 ++++++++++++++++ pyramid/view.py | 5 +++++ 3 files changed, 22 insertions(+), 1 deletion(-) 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 -- cgit v1.2.3