summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2012-11-04 18:39:25 -0500
committerChris McDonough <chrism@plope.com>2012-11-04 18:39:25 -0500
commita8d71ca12aa648aa70e0c00f303e60da1fa97a61 (patch)
tree664befdad1e31820c6ff39dd99e47f10d253d4ce
parentfee21a3199d2d6e24e34c1e4bc71dfcfa0e31e64 (diff)
downloadpyramid-a8d71ca12aa648aa70e0c00f303e60da1fa97a61.tar.gz
pyramid-a8d71ca12aa648aa70e0c00f303e60da1fa97a61.tar.bz2
pyramid-a8d71ca12aa648aa70e0c00f303e60da1fa97a61.zip
- Allow a ``_depth`` argument to ``pyramid.view.view_config``, which will
permit limited compisition reuse of the decorator by other software that wants to provide custom decorators that are much like view_config. Closes #637.
-rw-r--r--CHANGES.txt4
-rw-r--r--pyramid/tests/test_view.py11
-rw-r--r--pyramid/view.py11
3 files changed, 24 insertions, 2 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index 43a910f96..5175baa5a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -33,6 +33,10 @@ Features
class; that's enough to satisfy WebOb and behave as it did before with the
monkeypatching.
+- Allow a ``_depth`` argument to ``pyramid.view.view_config``, which will
+ permit limited composition reuse of the decorator by other software that
+ wants to provide custom decorators that are much like view_config.
+
Bug Fixes
---------
diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py
index f63e17bd8..df9d03490 100644
--- a/pyramid/tests/test_view.py
+++ b/pyramid/tests/test_view.py
@@ -519,6 +519,14 @@ class TestViewConfigDecorator(unittest.TestCase):
self.assertTrue(renderer is renderer_helper)
self.assertEqual(config.pkg, pyramid.tests)
+ def test_call_withdepth(self):
+ decorator = self._makeOne(_depth=2)
+ venusian = DummyVenusian()
+ decorator.venusian = venusian
+ def foo(): pass
+ decorator(foo)
+ self.assertEqual(venusian.depth, 2)
+
class Test_append_slash_notfound_view(BaseTest, unittest.TestCase):
def _callFUT(self, context, request):
from pyramid.view import append_slash_notfound_view
@@ -746,8 +754,9 @@ class DummyVenusian(object):
self.info = info
self.attachments = []
- def attach(self, wrapped, callback, category=None):
+ def attach(self, wrapped, callback, category=None, depth=1):
self.attachments.append((wrapped, callback, category))
+ self.depth = depth
return self.info
class DummyRegistry(object):
diff --git a/pyramid/view.py b/pyramid/view.py
index 51ded423c..835982e79 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -176,6 +176,13 @@ class view_config(object):
:meth:`pyramid.config.Configurator.add_view`. If any argument is left
out, its default will be the equivalent ``add_view`` default.
+ An additional keyword argument named ``_depth`` is provided for people who
+ wish to reuse this class from another decorator. It will be passed in to
+ the :term:`venusian` ``attach`` function as the depth of the callstack when
+ Venusian checks if the decorator is being used in a class or module
+ context. It's not often used, but it can be useful in this circumstance.
+ See the ``attach`` function in Venusian for more information.
+
See :ref:`mapping_views_using_a_decorator_section` for details about
using :class:`view_config`.
@@ -189,12 +196,14 @@ class view_config(object):
def __call__(self, wrapped):
settings = self.__dict__.copy()
+ depth = settings.pop('_depth', 1)
def callback(context, name, ob):
config = context.config.with_package(info.module)
config.add_view(view=ob, **settings)
- info = self.venusian.attach(wrapped, callback, category='pyramid')
+ info = self.venusian.attach(wrapped, callback, category='pyramid',
+ depth=depth)
if info.scope == 'class':
# if the decorator was attached to a method in a class, or