summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2010-12-25 02:12:54 -0500
committerChris McDonough <chrism@plope.com>2010-12-25 02:12:54 -0500
commitf5bafd1da8da405936bae032d20dba545922860e (patch)
tree9c912d12c443ea8b18e7ab387954d417cb8ea182
parent781f9e02e0433a77e78f07f28e5b7d2064e73af4 (diff)
downloadpyramid-f5bafd1da8da405936bae032d20dba545922860e.tar.gz
pyramid-f5bafd1da8da405936bae032d20dba545922860e.tar.bz2
pyramid-f5bafd1da8da405936bae032d20dba545922860e.zip
- Prevent misunderstanding of how the ``view`` and ``view_permission``
arguments to add_route work by raising an exception during configuration if view-related arguments exist but no ``view`` argument is passed.
-rw-r--r--CHANGES.txt4
-rw-r--r--pyramid/config.py32
-rw-r--r--pyramid/tests/test_config.py40
3 files changed, 70 insertions, 6 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index db7cb991a..b544c6b49 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -21,6 +21,10 @@ Features
- Added CSRF token generation, as described in the narrative chapter entitled
"Preventing Cross-Site Request Forgery Attacks".
+- Prevent misunderstanding of how the ``view`` and ``view_permission``
+ arguments to add_route work by raising an exception during configuration if
+ view-related arguments exist but no ``view`` argument is passed.
+
Paster Templates
----------------
diff --git a/pyramid/config.py b/pyramid/config.py
index 2a18db4e9..f6b4a2112 100644
--- a/pyramid/config.py
+++ b/pyramid/config.py
@@ -1748,13 +1748,14 @@ class Configurator(object):
for info in view_info:
self.add_view(**info)
- if view:
+ if view_context is None:
+ view_context = view_for
if view_context is None:
- view_context = view_for
- if view_context is None:
- view_context = for_
- view_permission = view_permission or permission
- view_renderer = view_renderer or renderer
+ view_context = for_
+ view_permission = view_permission or permission
+ view_renderer = view_renderer or renderer
+
+ if view:
self.add_view(
permission=view_permission,
context=view_context,
@@ -1764,6 +1765,25 @@ class Configurator(object):
renderer=view_renderer,
attr=view_attr,
)
+ else:
+ # prevent mistakes due to misunderstanding of how hybrid calls to
+ # add_route and add_view interact
+ if view_attr:
+ raise ConfigurationError(
+ 'view_attr argument not permitted without view '
+ 'argument')
+ if view_context:
+ raise ConfigurationError(
+ 'view_context argument not permitted without view '
+ 'argument')
+ if view_permission:
+ raise ConfigurationError(
+ 'view_permission argument not permitted without view '
+ 'argument')
+ if view_renderer:
+ raise ConfigurationError(
+ 'view_renderer argument not permitted without '
+ 'view argument')
mapper = self.get_routes_mapper()
diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py
index e4ab9a867..84e8289be 100644
--- a/pyramid/tests/test_config.py
+++ b/pyramid/tests/test_config.py
@@ -2331,6 +2331,46 @@ class ConfiguratorTests(unittest.TestCase):
route = config.add_route('name', 'pattern', pregenerator='123')
self.assertEqual(route.pregenerator, '123')
+ def test_add_route_no_view_with_view_attr(self):
+ config = self._makeOne(autocommit=True)
+ from pyramid.exceptions import ConfigurationError
+ try:
+ config.add_route('name', '/pattern', view_attr='abc')
+ except ConfigurationError:
+ pass
+ else:
+ raise AssertionError
+
+ def test_add_route_no_view_with_view_context(self):
+ config = self._makeOne(autocommit=True)
+ from pyramid.exceptions import ConfigurationError
+ try:
+ config.add_route('name', '/pattern', view_context=DummyContext)
+ except ConfigurationError:
+ pass
+ else:
+ raise AssertionError
+
+ def test_add_route_no_view_with_view_permission(self):
+ config = self._makeOne(autocommit=True)
+ from pyramid.exceptions import ConfigurationError
+ try:
+ config.add_route('name', '/pattern', view_permission='edit')
+ except ConfigurationError:
+ pass
+ else:
+ raise AssertionError
+
+ def test_add_route_no_view_with_view_renderer(self):
+ config = self._makeOne(autocommit=True)
+ from pyramid.exceptions import ConfigurationError
+ try:
+ config.add_route('name', '/pattern', view_renderer='json')
+ except ConfigurationError:
+ pass
+ else:
+ raise AssertionError
+
def test__override_not_yet_registered(self):
from pyramid.interfaces import IPackageOverrides
package = DummyPackage('package')