summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2010-12-29 18:12:40 -0500
committerChris McDonough <chrism@plope.com>2010-12-29 18:12:40 -0500
commit73741f6f97dce4d3f8ee340a708823db75c7aef6 (patch)
treeb98ac2a97334738bc28bb18820a6ed93e36f5823
parent1f8536956af7e122007da369d35924c28dd99c25 (diff)
downloadpyramid-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.py78
-rw-r--r--pyramid/tests/test_config.py6
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):