summaryrefslogtreecommitdiff
path: root/repoze/bfg/registry.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-01-12 00:30:12 +0000
committerChris McDonough <chrism@agendaless.com>2009-01-12 00:30:12 +0000
commitec2941b96a8f961438f9a341c936dfa660439a95 (patch)
tree648aa834b6c661a93a0947f6968024e89fd1c9fd /repoze/bfg/registry.py
parent74f67dcdc4c672b3e85d674c5eaebb8d435564a3 (diff)
downloadpyramid-ec2941b96a8f961438f9a341c936dfa660439a95.tar.gz
pyramid-ec2941b96a8f961438f9a341c936dfa660439a95.tar.bz2
pyramid-ec2941b96a8f961438f9a341c936dfa660439a95.zip
- Make the (internal) thread local registry manager maintain a stack
of registries in order to make it possible to call one BFG application from inside another.
Diffstat (limited to 'repoze/bfg/registry.py')
-rw-r--r--repoze/bfg/registry.py25
1 files changed, 18 insertions, 7 deletions
diff --git a/repoze/bfg/registry.py b/repoze/bfg/registry.py
index f2f47a889..179fbd3dd 100644
--- a/repoze/bfg/registry.py
+++ b/repoze/bfg/registry.py
@@ -25,15 +25,26 @@ deprecated(
)
class ThreadLocalRegistryManager(threading.local):
- registry = getGlobalSiteManager()
- def set(self, registry):
- self.registry = registry
+ def __init__(self):
+ self.stack = []
+
+ def push(self, registry):
+ self.stack.append(registry)
+
+ set = push # backwards compatibility
+
+ def pop(self):
+ if self.stack:
+ return self.stack.pop()
def get(self):
- return self.registry
+ try:
+ return self.stack[-1]
+ except IndexError:
+ return getGlobalSiteManager()
def clear(self):
- self.registry = getGlobalSiteManager()
+ self.stack[:] = []
registry_manager = ThreadLocalRegistryManager()
@@ -62,7 +73,7 @@ def makeRegistry(filename, package, lock=threading.Lock()):
lock.acquire()
try:
registry = Components(package.__name__)
- registry_manager.set(registry)
+ registry_manager.push(registry)
original_getSiteManager.sethook(getSiteManager)
zope.component.getGlobalSiteManager = registry_manager.get
zcml_configure(filename, package=package)
@@ -70,7 +81,7 @@ def makeRegistry(filename, package, lock=threading.Lock()):
finally:
zope.component.getGlobalSiteManager = getGlobalSiteManager
lock.release()
- registry_manager.clear()
+ registry_manager.pop()
def getSiteManager(context=None):
if context is None: