summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2010-12-31 16:47:13 -0500
committerChris McDonough <chrism@plope.com>2010-12-31 16:47:13 -0500
commit95c95bf924a8c08e0a5b686d7a5d12fa4e49d87e (patch)
tree69877760c0cff03c9ac0412e2a40129f82ca71c5
parent13bfb5ae063fde4bb45f73340ca97d37279e4b34 (diff)
downloadpyramid-95c95bf924a8c08e0a5b686d7a5d12fa4e49d87e.tar.gz
pyramid-95c95bf924a8c08e0a5b686d7a5d12fa4e49d87e.tar.bz2
pyramid-95c95bf924a8c08e0a5b686d7a5d12fa4e49d87e.zip
- A view callable wrapper registered in the registry now contains an
``__original_view__`` attribute which references the original view callable (or class).
-rw-r--r--CHANGES.txt4
-rw-r--r--pyramid/config.py4
-rw-r--r--pyramid/tests/test_config.py33
3 files changed, 27 insertions, 14 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 04f5a7d05..826be0be6 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -51,6 +51,10 @@ Internals
- The class used as the "page template" in ``pyramid.chameleon_text`` was
removed, in preference to using a Chameleon-inbuilt version.
+- A view callable wrapper registered in the registry now contains an
+ ``__original_view__`` attribute which references the original view callable
+ (or class).
+
1.0a8 (2010-12-27)
==================
diff --git a/pyramid/config.py b/pyramid/config.py
index ee34adae1..01d453cd1 100644
--- a/pyramid/config.py
+++ b/pyramid/config.py
@@ -2695,6 +2695,10 @@ def wraps_view(wrapped):
def preserve_view_attrs(view, wrapped_view):
if wrapped_view is view:
return view
+ original_view = getattr(view, '__original_view__', None)
+ if original_view is None:
+ original_view = view
+ wrapped_view.__original_view__ = original_view
wrapped_view.__module__ = view.__module__
wrapped_view.__doc__ = view.__doc__
try:
diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py
index b2fa0e329..1760d119a 100644
--- a/pyramid/tests/test_config.py
+++ b/pyramid/tests/test_config.py
@@ -3886,19 +3886,25 @@ class Test__map_view(unittest.TestCase):
request = self._makeRequest()
self.assertEqual(result(None, request).body, 'Hello!')
-class Test_wraps_view(unittest.TestCase):
- def _callFUT(self, fn, view):
- from pyramid.config import wraps_view
- return wraps_view(fn)(None, view)
+class Test_preserve_view_attrs(unittest.TestCase):
+ def _callFUT(self, view, wrapped_view):
+ from pyramid.config import preserve_view_attrs
+ return preserve_view_attrs(view, wrapped_view)
def test_it_same(self):
def view(context, request):
""" """
- def afunc(self, view):
- return view
- result = self._callFUT(afunc, view)
+ result = self._callFUT(view, view)
self.failUnless(result is view)
+ def test_it_different_with_existing_original_view(self):
+ def view1(context, request): pass
+ view1.__original_view__ = 'abc'
+ def view2(context, request): pass
+ result = self._callFUT(view1, view2)
+ self.assertEqual(result.__original_view__, 'abc')
+ self.failIf(result is view1)
+
def test_it_different(self):
class DummyView1:
""" 1 """
@@ -3906,9 +3912,9 @@ class Test_wraps_view(unittest.TestCase):
__module__ = '1'
def __call__(self, context, request):
""" """
- def __call_permissive__(self, context, reuqest):
+ def __call_permissive__(self, context, request):
""" """
- def __predicated__(self, context, reuqest):
+ def __predicated__(self, context, request):
""" """
def __permitted__(self, context, request):
""" """
@@ -3918,18 +3924,17 @@ class Test_wraps_view(unittest.TestCase):
__module__ = '2'
def __call__(self, context, request):
""" """
- def __call_permissive__(self, context, reuqest):
+ def __call_permissive__(self, context, request):
""" """
- def __predicated__(self, context, reuqest):
+ def __predicated__(self, context, request):
""" """
def __permitted__(self, context, request):
""" """
view1 = DummyView1()
view2 = DummyView2()
- def afunc(self, view):
- return view1
- result = self._callFUT(afunc, view2)
+ result = self._callFUT(view2, view1)
self.assertEqual(result, view1)
+ self.failUnless(view1.__original_view__ is view2)
self.failUnless(view1.__doc__ is view2.__doc__)
self.failUnless(view1.__module__ is view2.__module__)
self.failUnless(view1.__name__ is view2.__name__)