diff options
| author | Chris McDonough <chrism@plope.com> | 2010-12-25 02:12:54 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2010-12-25 02:12:54 -0500 |
| commit | f5bafd1da8da405936bae032d20dba545922860e (patch) | |
| tree | 9c912d12c443ea8b18e7ab387954d417cb8ea182 | |
| parent | 781f9e02e0433a77e78f07f28e5b7d2064e73af4 (diff) | |
| download | pyramid-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.txt | 4 | ||||
| -rw-r--r-- | pyramid/config.py | 32 | ||||
| -rw-r--r-- | pyramid/tests/test_config.py | 40 |
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') |
