diff options
| author | Chris McDonough <chrism@plope.com> | 2010-11-26 01:47:34 -0500 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2010-11-26 01:47:34 -0500 |
| commit | 86cba9d9e34840c64653a2fd224c9bbf34fb2a13 (patch) | |
| tree | 1f1a59d5fab0669de7081c647743f25d048d006c | |
| parent | 857de348b16c23dad976570f8f63d214cd31d2c3 (diff) | |
| download | pyramid-86cba9d9e34840c64653a2fd224c9bbf34fb2a13.tar.gz pyramid-86cba9d9e34840c64653a2fd224c9bbf34fb2a13.tar.bz2 pyramid-86cba9d9e34840c64653a2fd224c9bbf34fb2a13.zip | |
put autocommit flag on registry, make add_static_view into a non-config method, create a circdep between registry and config context, treat load_zcml specially with respect to autocommit, register auth policies eagerly
| -rw-r--r-- | pyramid/configuration.py | 58 | ||||
| -rw-r--r-- | pyramid/registry.py | 2 | ||||
| -rw-r--r-- | pyramid/tests/test_zcml.py | 27 |
3 files changed, 42 insertions, 45 deletions
diff --git a/pyramid/configuration.py b/pyramid/configuration.py index cf0e8558e..7818029b6 100644 --- a/pyramid/configuration.py +++ b/pyramid/configuration.py @@ -101,7 +101,7 @@ if chameleon_zpt: def config_method(wrapped): def wrapper(self, *arg, **kw): result = wrapped(self, *arg, **kw) - if self.autocommit: + if self.registry.autocommit: self.commit() return result wrapper.__doc__ = wrapped.__doc__ @@ -243,7 +243,6 @@ class Configurator(object): self.package_name = name_resolver.package_name self.package = name_resolver.package self.registry = registry - self.autocommit = autocommit if registry is None: registry = Registry(self.package_name) self.registry = registry @@ -259,6 +258,7 @@ class Configurator(object): renderer_globals_factory=renderer_globals_factory, default_permission=default_permission, session_factory=session_factory, + autocommit=autocommit, ) def _set_settings(self, mapping): @@ -266,6 +266,7 @@ class Configurator(object): self.registry.settings = settings return settings + @config_method 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 @@ -273,8 +274,10 @@ class Configurator(object): factory = self.maybe_dotted(factory) if factory is None: factory = DefaultRootFactory - self.registry.registerUtility(factory, IRootFactory) - self.registry.registerUtility(factory, IDefaultRootFactory) # b/c + def register(): + self.registry.registerUtility(factory, IRootFactory) + self.registry.registerUtility(factory, IDefaultRootFactory) # b/c + self.action(IRootFactory, register) @config_method def _set_authentication_policy(self, policy): @@ -282,10 +285,9 @@ class Configurator(object): the current configuration.""" policy = self.maybe_dotted(policy) _info = self.ctx_info() - def register(): - self.registry.registerUtility(policy, IAuthenticationPolicy, - info=_info) - self.action(IAuthenticationPolicy, register) + self.registry.registerUtility(policy, IAuthenticationPolicy, + info=_info) + self.action(IAuthenticationPolicy, None) @config_method def _set_authorization_policy(self, policy): @@ -294,10 +296,9 @@ class Configurator(object): Python name`.""" policy = self.maybe_dotted(policy) _info = self.ctx_info() - def register(): - self.registry.registerUtility(policy, IAuthorizationPolicy, - info=_info) - self.action(IAuthorizationPolicy, register) + self.registry.registerUtility(policy, IAuthorizationPolicy, + info=_info) + self.action(IAuthorizationPolicy, None) def _make_spec(self, path_or_spec): package, filename = resolve_resource_spec(path_or_spec, @@ -415,7 +416,8 @@ class Configurator(object): locale_negotiator=None, request_factory=None, renderer_globals_factory=None, default_permission=None, - session_factory=None): + session_factory=None, + autocommit=True): """ When you pass a non-``None`` ``registry`` argument to the :term:`Configurator` constructor, no initial 'setup' is performed against the registry. This is because the registry @@ -435,12 +437,13 @@ class Configurator(object): configurator's current registry, as per the descriptions in the Configurator constructor.""" self._fix_registry() + registry = self.registry + registry.autocommit = autocommit self._set_settings(settings) self._set_root_factory(root_factory) debug_logger = self.maybe_dotted(debug_logger) if debug_logger is None: debug_logger = make_stream_logger('pyramid.debug', sys.stderr) - registry = self.registry registry.registerUtility(debug_logger, IDebugLogger) if authentication_policy or authorization_policy: self._set_security_policies(authentication_policy, @@ -586,6 +589,7 @@ class Configurator(object): return self._derive_view(view, attr=attr, renderer=renderer) def action(self, discriminator, callable, args=(), kw=None, order=0): + """ Register an action which will be executed during commit. """ if kw is None: kw = {} self.registry.ctx.action(discriminator, callable, args, kw, order) @@ -694,16 +698,19 @@ class Configurator(object): package = sys.modules[package_name] lock.acquire() - self.manager.push({'registry':self.registry, 'request':None}) + registry = self.registry + self.manager.push({'registry':registry, 'request':None}) + context = registry.ctx + autocommit = registry.autocommit try: - context = self.registry.ctx + registry.autocommit = False context.package = package - context.registry = self.registry xmlconfig.file(filename, package, context=context, execute=True) finally: lock.release() self.manager.pop() - return self.registry + registry.autocommit = autocommit + return registry def add_handler(self, route_name, pattern, handler, action=None, **kw): @@ -1241,7 +1248,7 @@ class Configurator(object): IMultiView, name=name, info=_info) discriminator = [ - 'view', context, name, request_type, containment, + 'view', context, name, request_type, IView, containment, request_param, request_method, route_name, attr, xhr, accept, header, path_info] discriminator.extend(sorted(custom_predicates)) @@ -1960,7 +1967,6 @@ class Configurator(object): ctranslate = ChameleonTranslate(translator) self.registry.registerUtility(ctranslate, IChameleonTranslate) - @config_method def add_static_view(self, name, path, **kw): """ Add a view used to render static resources such as images and CSS files. @@ -2059,14 +2065,12 @@ class Configurator(object): See :ref:`static_resources_section` for more information. """ spec = self._make_spec(path) - def register(): - info = self.registry.queryUtility(IStaticURLInfo) - if info is None: - info = StaticURLInfo(self) - self.registry.registerUtility(info, IStaticURLInfo) + info = self.registry.queryUtility(IStaticURLInfo) + if info is None: + info = StaticURLInfo(self) + self.registry.registerUtility(info, IStaticURLInfo) - info.add(name, spec, **kw) - self.action(('static', name), register) + info.add(name, spec, **kw) # testing API def testing_securitypolicy(self, userid=None, groupids=(), diff --git a/pyramid/registry.py b/pyramid/registry.py index ed7b5b0cd..36ded8146 100644 --- a/pyramid/registry.py +++ b/pyramid/registry.py @@ -25,6 +25,7 @@ class Registry(Components, dict): # to notify them has_listeners = False _settings = None + autocommit = False def registerSubscriptionAdapter(self, *arg, **kw): result = Components.registerSubscriptionAdapter(self, *arg, **kw) @@ -56,6 +57,7 @@ class Registry(Components, dict): def ctx(self): context = ConfigurationMachine() registerCommonDirectives(context) + context.registry = self # circdep return context global_registry = Registry('global') diff --git a/pyramid/tests/test_zcml.py b/pyramid/tests/test_zcml.py index 905a53287..cf0aba624 100644 --- a/pyramid/tests/test_zcml.py +++ b/pyramid/tests/test_zcml.py @@ -11,7 +11,7 @@ from zope.interface import implements class TestViewDirective(unittest.TestCase): def setUp(self): - testing.setUp() + self.config = testing.setUp() def tearDown(self): testing.tearDown() @@ -21,14 +21,12 @@ class TestViewDirective(unittest.TestCase): return view(*arg, **kw) def test_with_dotted_renderer(self): - from pyramid.threadlocal import get_current_registry from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IRendererFactory from pyramid.interfaces import IRequest - context = DummyContext() - reg = get_current_registry() - context.registry = reg + reg = self.config.registry + context = reg.ctx def factory(path): def foo(*arg): return 'OK' @@ -49,13 +47,11 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(regview(None, None).body, 'OK') def test_with_custom_predicates(self): - from pyramid.threadlocal import get_current_registry from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IRequest - context = DummyContext() - reg = get_current_registry() - context.registry = reg + reg = self.config.registry + context = reg.ctx view = lambda *arg: 'OK' def pred1(context, request): return True @@ -77,13 +73,11 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(regview(None, None), 'OK') def test_context_trumps_for(self): - from pyramid.threadlocal import get_current_registry from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IRequest context = DummyContext() - reg = get_current_registry() - context.registry = reg + reg = self.config.registry view = lambda *arg: 'OK' class Foo: pass @@ -101,13 +95,11 @@ class TestViewDirective(unittest.TestCase): self.assertEqual(regview(None, None), 'OK') def test_with_for(self): - from pyramid.threadlocal import get_current_registry from pyramid.interfaces import IView from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IRequest - context = DummyContext() - reg = get_current_registry() - context.registry = reg + reg = self.config.registry + context = reg.ctx view = lambda *arg: 'OK' class Foo: pass @@ -861,8 +853,7 @@ class TestZCMLScanDirective(unittest.TestCase): def test_it(self): from pyramid.configuration import Configurator dummy_module = DummyModule() - context = DummyContext() - context.registry = self.config.registry + context = self.config.registry.ctx self._callFUT(context, dummy_module) actions = context.actions self.assertEqual(len(actions), 1) |
