diff options
| -rw-r--r-- | CHANGES.txt | 8 | ||||
| -rw-r--r-- | docs/api/config.rst | 6 | ||||
| -rw-r--r-- | pyramid/config/__init__.py | 59 | ||||
| -rw-r--r-- | pyramid/config/adapters.py | 1 | ||||
| -rw-r--r-- | pyramid/config/factories.py | 4 | ||||
| -rw-r--r-- | pyramid/tests/test_config/test_init.py | 45 |
6 files changed, 78 insertions, 45 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index bff399598..dede9cf53 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -64,6 +64,14 @@ Features ``set_authentication_policy`` and ``set_authorization_policy``. These are meant to be consumed mostly by add-on authors. +- New Configurator method: ``set_root_factory``. + +- Pyramid no longer eagerly commits some default configuration statements at + Configurator construction time, which permits values passed in as + constructor arguments (e.g. ``authentication_policy`` and + ``authorization_policy``) to override the same settings obtained via an + "include". + Internal -------- diff --git a/docs/api/config.rst b/docs/api/config.rst index de054d7ce..d744418b3 100644 --- a/docs/api/config.rst +++ b/docs/api/config.rst @@ -54,6 +54,8 @@ .. automethod:: add_view + .. automethod:: add_tween + .. automethod:: derive_view .. automethod:: make_wsgi_app() @@ -74,6 +76,8 @@ .. automethod:: set_request_factory + .. automethod:: set_root_factory + .. automethod:: set_renderer_globals_factory(factory) .. automethod:: set_view_mapper @@ -82,8 +86,6 @@ .. automethod:: set_authorization_policy - .. automethod:: add_tween - .. automethod:: testing_securitypolicy .. automethod:: testing_resources diff --git a/pyramid/config/__init__.py b/pyramid/config/__init__.py index 5957dc612..38f2698bd 100644 --- a/pyramid/config/__init__.py +++ b/pyramid/config/__init__.py @@ -6,6 +6,9 @@ import warnings import venusian + +from webob.exc import WSGIHTTPException as WebobWSGIHTTPException + from zope.configuration.config import GroupingContextDecorator from zope.configuration.config import ConfigurationMachine from zope.configuration.xmlconfig import registerCommonDirectives @@ -277,13 +280,10 @@ class Configurator( other settings using the configurator's current registry, as per the descriptions in the Configurator constructor.""" - from webob.exc import WSGIHTTPException as WebobWSGIHTTPException - registry = self.registry self._fix_registry() self._set_settings(settings) - self._set_root_factory(root_factory) self._register_response_adapters() if isinstance(debug_logger, basestring): @@ -294,20 +294,39 @@ class Configurator( registry.registerUtility(debug_logger, IDebugLogger) - if authentication_policy or authorization_policy: - self._set_security_policies(authentication_policy, - authorization_policy) - - for name, renderer in renderers: - self.add_renderer(name, renderer) - if exceptionresponse_view is not None: exceptionresponse_view = self.maybe_dotted(exceptionresponse_view) self.add_view(exceptionresponse_view, context=IExceptionResponse) self.add_view(exceptionresponse_view,context=WebobWSGIHTTPException) + # commit before adding default_view_mapper, as the + # exceptionresponse_view above requires the superdefault view + # mapper + + self.commit() + + if default_view_mapper is not None: + self.set_view_mapper(default_view_mapper) + self.commit() + + # The following registrations should be treated as if the methods had + # been called after configurator construction (commit should not be + # called after this). Rationale: user-supplied implementations + # should be preferred rather than add-on author implementations (as + # per automatic conflict resolution). + + if authentication_policy: + self.set_authentication_policy(authentication_policy) + if authorization_policy: + self.set_authorization_policy(authorization_policy) + + self.set_root_factory(root_factory) + + for name, renderer in renderers: + self.add_renderer(name, renderer) + if locale_negotiator: - self._set_locale_negotiator(locale_negotiator) + self.set_locale_negotiator(locale_negotiator) if request_factory: self.set_request_factory(request_factory) @@ -329,24 +348,14 @@ class Configurator( if session_factory is not None: self.set_session_factory(session_factory) - self.commit() - - # commit before adding default_view_mapper, as the - # exceptionresponse_view above requires the superdefault view - # mapper - - if default_view_mapper is not None: - self.set_view_mapper(default_view_mapper) - self.commit() - - includes = aslist(registry.settings.get('pyramid.includes', [])) - for inc in includes: - self.include(inc) - tweens = aslist(registry.settings.get('pyramid.tweens', [])) for factory in tweens: self._add_tween(factory, explicit=True) + includes = aslist(registry.settings.get('pyramid.includes', [])) + for inc in includes: + self.include(inc) + def _make_spec(self, path_or_spec): package, filename = resolve_asset_spec(path_or_spec, self.package_name) diff --git a/pyramid/config/adapters.py b/pyramid/config/adapters.py index 3f4acfa59..f022e7f08 100644 --- a/pyramid/config/adapters.py +++ b/pyramid/config/adapters.py @@ -57,5 +57,4 @@ class AdaptersConfiguratorMixin(object): def _register_response_adapters(self): # cope with WebOb response objects that aren't decorated with IResponse from webob import Response as WebobResponse - # cope with WebOb exc objects not decoratored with IExceptionResponse self.registry.registerSelfAdapter((WebobResponse,), IResponse) diff --git a/pyramid/config/factories.py b/pyramid/config/factories.py index cae070fc9..cc73d596c 100644 --- a/pyramid/config/factories.py +++ b/pyramid/config/factories.py @@ -9,7 +9,7 @@ from pyramid.traversal import DefaultRootFactory class FactoriesConfiguratorMixin(object): @action_method - def _set_root_factory(self, factory): + def set_root_factory(self, factory): """ Add a :term:`root factory` to the current configuration state. If the ``factory`` argument is ``None`` a default root factory will be registered.""" @@ -21,6 +21,8 @@ class FactoriesConfiguratorMixin(object): self.registry.registerUtility(factory, IDefaultRootFactory) # b/c self.action(IRootFactory, register) + _set_root_factory = set_root_factory # bw compat + @action_method def set_session_factory(self, session_factory): """ diff --git a/pyramid/tests/test_config/test_init.py b/pyramid/tests/test_config/test_init.py index ec9fea460..4f880d7f4 100644 --- a/pyramid/tests/test_config/test_init.py +++ b/pyramid/tests/test_config/test_init.py @@ -189,14 +189,16 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(policy, result) def test_ctor_authorization_policy_only(self): - from pyramid.exceptions import ConfigurationError + from zope.configuration.config import ConfigurationExecutionError policy = object() - self.assertRaises(ConfigurationError, - self._makeOne, authorization_policy=policy) + config = self._makeOne(authorization_policy=policy) + self.assertRaises(ConfigurationExecutionError, config.commit) def test_ctor_no_root_factory(self): from pyramid.interfaces import IRootFactory config = self._makeOne() + self.assertEqual(config.registry.queryUtility(IRootFactory), None) + config.commit() self.assertTrue(config.registry.getUtility(IRootFactory)) def test_ctor_alternate_renderers(self): @@ -214,6 +216,8 @@ class ConfiguratorTests(unittest.TestCase): def test_ctor_session_factory(self): from pyramid.interfaces import ISessionFactory config = self._makeOne(session_factory='factory') + self.assertEqual(config.registry.queryUtility(ISessionFactory), None) + config.commit() self.assertEqual(config.registry.getUtility(ISessionFactory), 'factory') def test_ctor_default_view_mapper(self): @@ -477,14 +481,13 @@ class ConfiguratorTests(unittest.TestCase): self.assertEqual(result, pyramid.tests) def test_setup_registry_authorization_policy_only(self): + from zope.configuration.config import ConfigurationExecutionError from pyramid.registry import Registry - from pyramid.exceptions import ConfigurationError policy = object() reg = Registry() config = self._makeOne(reg) - config = self.assertRaises(ConfigurationError, - config.setup_registry, - authorization_policy=policy) + config.setup_registry(authorization_policy=policy) + config = self.assertRaises(ConfigurationExecutionError, config.commit) def test_setup_registry_default_root_factory(self): from pyramid.registry import Registry @@ -492,6 +495,8 @@ class ConfiguratorTests(unittest.TestCase): reg = Registry() config = self._makeOne(reg) config.setup_registry() + self.assertEqual(reg.queryUtility(IRootFactory), None) + config.commit() self.assertTrue(reg.getUtility(IRootFactory)) def test_setup_registry_dottedname_root_factory(self): @@ -501,6 +506,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) import pyramid.tests config.setup_registry(root_factory='pyramid.tests') + self.assertEqual(reg.queryUtility(IRootFactory), None) + config.commit() self.assertEqual(reg.getUtility(IRootFactory), pyramid.tests) def test_setup_registry_locale_negotiator_dottedname(self): @@ -510,6 +517,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) import pyramid.tests config.setup_registry(locale_negotiator='pyramid.tests') + self.assertEqual(reg.queryUtility(ILocaleNegotiator), None) + config.commit() utility = reg.getUtility(ILocaleNegotiator) self.assertEqual(utility, pyramid.tests) @@ -520,6 +529,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) negotiator = object() config.setup_registry(locale_negotiator=negotiator) + self.assertEqual(reg.queryUtility(ILocaleNegotiator), None) + config.commit() utility = reg.getUtility(ILocaleNegotiator) self.assertEqual(utility, negotiator) @@ -530,6 +541,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) factory = object() config.setup_registry(request_factory=factory) + self.assertEqual(reg.queryUtility(IRequestFactory), None) + config.commit() utility = reg.getUtility(IRequestFactory) self.assertEqual(utility, factory) @@ -540,6 +553,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) import pyramid.tests config.setup_registry(request_factory='pyramid.tests') + self.assertEqual(reg.queryUtility(IRequestFactory), None) + config.commit() utility = reg.getUtility(IRequestFactory) self.assertEqual(utility, pyramid.tests) @@ -553,6 +568,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) factory = object() config.setup_registry(renderer_globals_factory=factory) + self.assertEqual(reg.queryUtility(IRendererGlobalsFactory), None) + config.commit() utility = reg.getUtility(IRendererGlobalsFactory) self.assertEqual(utility, factory) finally: @@ -568,6 +585,8 @@ class ConfiguratorTests(unittest.TestCase): config = self._makeOne(reg) import pyramid.tests config.setup_registry(renderer_globals_factory='pyramid.tests') + self.assertEqual(reg.queryUtility(IRendererGlobalsFactory), None) + config.commit() utility = reg.getUtility(IRendererGlobalsFactory) self.assertEqual(utility, pyramid.tests) finally: @@ -3845,10 +3864,8 @@ class TestConfigurator_add_directive(unittest.TestCase): self.assert_(hasattr(config, 'dummy_extend')) config.dummy_extend('discrim') context_after = config._ctx - actions = context_after.actions - self.assertEqual(len(actions), 1) self.assertEqual( - context_after.actions[0][:3], + context_after.actions[-1][:3], ('discrim', None, test_config), ) @@ -3860,10 +3877,8 @@ class TestConfigurator_add_directive(unittest.TestCase): self.assert_(hasattr(config, 'dummy_extend')) config.dummy_extend('discrim') context_after = config._ctx - actions = context_after.actions - self.assertEqual(len(actions), 1) self.assertEqual( - context_after.actions[0][:3], + context_after.actions[-1][:3], ('discrim', None, test_config), ) @@ -3876,10 +3891,8 @@ class TestConfigurator_add_directive(unittest.TestCase): self.assert_(hasattr(config, 'dummy_extend')) config.dummy_extend('discrim') context_after = config._ctx - actions = context_after.actions - self.assertEqual(len(actions), 1) self.assertEqual( - context_after.actions[0][:3], + context_after.actions[-1][:3], ('discrim', None, config.registry), ) |
