Chris McDonough
2011-08-19 ea824f6f1ceaae4b922b6cff5320bb1c19cbacd5
- 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".
6 files modified
123 ■■■■■ changed files
CHANGES.txt 8 ●●●●● patch | view | raw | blame | history
docs/api/config.rst 6 ●●●●● patch | view | raw | blame | history
pyramid/config/__init__.py 59 ●●●●● patch | view | raw | blame | history
pyramid/config/adapters.py 1 ●●●● patch | view | raw | blame | history
pyramid/config/factories.py 4 ●●● patch | view | raw | blame | history
pyramid/tests/test_config/test_init.py 45 ●●●●● patch | view | raw | blame | history
CHANGES.txt
@@ -64,6 +64,14 @@
  ``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
--------
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
@@ -81,8 +85,6 @@
     .. automethod:: set_authentication_policy
     .. automethod:: set_authorization_policy
     .. automethod:: add_tween
     .. automethod:: testing_securitypolicy
pyramid/config/__init__.py
@@ -6,6 +6,9 @@
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 @@
        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 @@
                
        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 @@
        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)
pyramid/config/adapters.py
@@ -57,5 +57,4 @@
    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)
pyramid/config/factories.py
@@ -9,7 +9,7 @@
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 @@
            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):
        """
pyramid/tests/test_config/test_init.py
@@ -189,14 +189,16 @@
        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 @@
    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 @@
        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 @@
        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 @@
        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 @@
        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 @@
        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 @@
        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 @@
        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 @@
            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 @@
            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 @@
        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 @@
        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 @@
        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),
            )