summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt8
-rw-r--r--docs/api/config.rst6
-rw-r--r--pyramid/config/__init__.py59
-rw-r--r--pyramid/config/adapters.py1
-rw-r--r--pyramid/config/factories.py4
-rw-r--r--pyramid/tests/test_config/test_init.py45
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),
)