diff options
| author | Chris McDonough <chrism@plope.com> | 2010-12-29 18:12:40 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2010-12-29 18:12:40 -0500 |
| commit | 73741f6f97dce4d3f8ee340a708823db75c7aef6 (patch) | |
| tree | b98ac2a97334738bc28bb18820a6ed93e36f5823 | |
| parent | 1f8536956af7e122007da369d35924c28dd99c25 (diff) | |
| download | pyramid-73741f6f97dce4d3f8ee340a708823db75c7aef6.tar.gz pyramid-73741f6f97dce4d3f8ee340a708823db75c7aef6.tar.bz2 pyramid-73741f6f97dce4d3f8ee340a708823db75c7aef6.zip | |
preserve_attrs->wraps_view, break out preserve_attrs bulk into preserve_view_attrs, make sure decorator preserves view attrs
| -rw-r--r-- | pyramid/config.py | 78 | ||||
| -rw-r--r-- | pyramid/tests/test_config.py | 6 |
2 files changed, 44 insertions, 40 deletions
diff --git a/pyramid/config.py b/pyramid/config.py index e717556d9..b8b47f686 100644 --- a/pyramid/config.py +++ b/pyramid/config.py @@ -2676,40 +2676,43 @@ class MultiView(object): continue raise PredicateMismatch(self.name) -def preserve_attrs(wrapped): +def wraps_view(wrapped): def inner(self, view): wrapped_view = wrapped(self, view) - if wrapped_view is view: - return view - wrapped_view.__module__ = view.__module__ - wrapped_view.__doc__ = view.__doc__ - try: - wrapped_view.__name__ = view.__name__ - except AttributeError: - wrapped_view.__name__ = repr(view) - try: - wrapped_view.__permitted__ = view.__permitted__ - except AttributeError: - pass - try: - wrapped_view.__call_permissive__ = view.__call_permissive__ - except AttributeError: - pass - try: - wrapped_view.__predicated__ = view.__predicated__ - except AttributeError: - pass - try: - wrapped_view.__accept__ = view.__accept__ - except AttributeError: - pass - try: - wrapped_view.__order__ = view.__order__ - except AttributeError: - pass - return wrapped_view + return preserve_view_attrs(view, wrapped_view) return inner +def preserve_view_attrs(view, wrapped_view): + if wrapped_view is view: + return view + wrapped_view.__module__ = view.__module__ + wrapped_view.__doc__ = view.__doc__ + try: + wrapped_view.__name__ = view.__name__ + except AttributeError: + wrapped_view.__name__ = repr(view) + try: + wrapped_view.__permitted__ = view.__permitted__ + except AttributeError: + pass + try: + wrapped_view.__call_permissive__ = view.__call_permissive__ + except AttributeError: + pass + try: + wrapped_view.__predicated__ = view.__predicated__ + except AttributeError: + pass + try: + wrapped_view.__accept__ = view.__accept__ + except AttributeError: + pass + try: + wrapped_view.__order__ = view.__order__ + except AttributeError: + pass + return wrapped_view + class ViewDeriver(object): def __init__(self, **kw): self.kw = kw @@ -2732,7 +2735,7 @@ class ViewDeriver(object): self.owrap_view( view))))) - @preserve_attrs + @wraps_view def owrap_view(self, view): wrapper_viewname = self.kw.get('wrapper_viewname') viewname = self.kw.get('viewname') @@ -2752,7 +2755,7 @@ class ViewDeriver(object): return wrapped_response return _owrapped_view - @preserve_attrs + @wraps_view def secured_view(self, view): permission = self.kw.get('permission') if permission == '__no_permission_required__': @@ -2780,7 +2783,7 @@ class ViewDeriver(object): return wrapped_view - @preserve_attrs + @wraps_view def authdebug_view(self, view): wrapped_view = view settings = self.registry.settings @@ -2813,7 +2816,7 @@ class ViewDeriver(object): return wrapped_view - @preserve_attrs + @wraps_view def predicated_view(self, view): predicates = self.kw.get('predicates', ()) if not predicates: @@ -2828,7 +2831,7 @@ class ViewDeriver(object): predicate_wrapper.__predicated__ = checker return predicate_wrapper - @preserve_attrs + @wraps_view def attr_wrapped_view(self, view): kw = self.kw accept, order, phash = (kw.get('accept', None), @@ -2907,7 +2910,7 @@ class DefaultViewMapper(object): return False - @preserve_attrs + @wraps_view def __call__(self, view): attr = self.kw.get('attr') decorator = self.kw.get('decorator') @@ -2924,7 +2927,8 @@ class DefaultViewMapper(object): elif self.helper is not None: view = self.map_rendered(view) if decorator is not None: - view = decorator(view) + decorated_view = decorator(view) + view = preserve_view_attrs(view, decorated_view) return view def map_requestonly_class(self, view): diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py index e088ea2fc..80e675623 100644 --- a/pyramid/tests/test_config.py +++ b/pyramid/tests/test_config.py @@ -3868,10 +3868,10 @@ class Test__map_view(unittest.TestCase): request = self._makeRequest() self.assertEqual(result(None, request).body, 'Hello!') -class Test_preserve_attrs(unittest.TestCase): +class Test_wraps_view(unittest.TestCase): def _callFUT(self, fn, view): - from pyramid.config import preserve_attrs - return preserve_attrs(fn)(None, view) + from pyramid.config import wraps_view + return wraps_view(fn)(None, view) def test_it_same(self): def view(context, request): |
