From fee38663daccc0130d0c34dbc5a14e67bef2e183 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Thu, 9 Dec 2010 23:13:04 -0500 Subject: To avoid breaking people's expectations of how ZCML works, we cannot autocommit ZCML actions incrementally. If we commit actions incrementally, configuration outcome will be controlled purely by ZCML directive execution order, which isn't what anyone who uses ZCML expects. So we don't autocommit each ZCML directive action while parsing is happening, but we do make sure to pass execute=self.autocommit to xmlconfig.file below, which will cause the actions implied by the ZCML that was parsed to be committed right away once parsing is finished if autocommit is True. --- pyramid/config.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pyramid/config.py b/pyramid/config.py index 8b4cb0236..72561c493 100644 --- a/pyramid/config.py +++ b/pyramid/config.py @@ -409,11 +409,18 @@ class Configurator(object): """ if kw is None: kw = {} - if self.autocommit: + + context = self._ctx + + if context is None: + autocommit = self.autocommit + else: + autocommit = context.autocommit + + if autocommit: if callable is not None: callable(*args, **kw) else: - context = self._ctx if context is None: # defer expensive creation of context context = self._ctx = self._make_context(self.autocommit) if not context.info: @@ -836,11 +843,23 @@ class Configurator(object): if context is None: context = self._ctx = self._make_context(self.autocommit) + # To avoid breaking people's expectations of how ZCML works, we + # cannot autocommit ZCML actions incrementally. If we commit actions + # incrementally, configuration outcome will be controlled purely by + # ZCML directive execution order, which isn't what anyone who uses + # ZCML expects. So we don't autocommit each ZCML directive action + # while parsing is happening, but we do make sure to pass + # execute=self.autocommit to xmlconfig.file below, which will cause + # the actions implied by the ZCML that was parsed to be committed + # right away once parsing is finished if autocommit is True. + context = GroupingContextDecorator(context) + context.autocommit = False + lock.acquire() try: context.package = package xmlconfig.file(filename, package, context=context, - execute=context.autocommit) + execute=self.autocommit) finally: lock.release() self.manager.pop() -- cgit v1.2.3