Re: Stacking zope.component registries

Chris McDonough <[email protected]>
Newsgroups gmane.comp.web.zope.devel
Message-ID <[email protected]>
Not sure how a new layer setup and teardown is signaled but assuming you can 
hook that, do something like this:

class StackManager(object):
     def __init__(self, default=None):
         self.stack = []
         self.default = default

     def push(self, info):
         self.stack.append(info)

     def pop(self):
         if self.stack:
             return self.stack.pop()

     def get(self):
         try:
             return self.stack[-1]
         except IndexError:
             return self.default()

     def clear(self):
         self.stack[:] = []

from zope.component import getGlobalSiteManager
global_registry = getGlobalSiteManager()

def defaults():
     return {'registry':global_registry}

manager = StackManager(default=defaults)

def get_current_registry(context=None):
     return manager.get()['registry']

from zope.component import getSiteManager
getSiteManager.sethook(get_current_registry)

Then when a layer is pushed:

   from zope.comonent.registry import Components
   manager.push({'registry':Components()})

And popped:

   manager.pop()


On 4/8/10 1:26 PM, Martin Aspeli wrote:
> Hi,
>
> I'd like to come up with a way to set up a test fixture that does the
> component registry equivalent of stackable DemoStorage's: whilst a layer
> is in effect, calls to provideAdapter() and friends (and ZCML execution)
> go into a global registry that is stacked on top of the default global one.
>
> On layer tear-down, the registry is popped, leaving the original (or
> previous) global registry intact.
>
> In zope.component.globalregistry, I see:
>
> def provideUtility(component, provides=None, name=u''):
>       base.registerUtility(component, provides, name, event=False)
>
> base is a module-level variable of type BaseGlobalComponents(). I guess
> there'd be a way to use __bases__ to create this kind of stack, but I'm
> not clear on the details, and in particular whether this would really
> work with provideAdapter() and the rest of the (test-oriented) Python API.
>
> Martin
>
> _______________________________________________
> Zope-Dev maillist  -  [email protected]
> https://mail.zope.org/mailman/listinfo/zope-dev
> **  No cross posts or HTML encoding!  **
> (Related lists -
>   https://mail.zope.org/mailman/listinfo/zope-announce
>   https://mail.zope.org/mailman/listinfo/zope )
>


-- 
Chris McDonough
Agendaless Consulting, Fredericksburg VA
The repoze.bfg Web Application Framework Book: http://bfg.repoze.org/book
_______________________________________________
Zope-Dev maillist  -  [email protected]
https://mail.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 https://mail.zope.org/mailman/listinfo/zope-announce
 https://mail.zope.org/mailman/listinfo/zope )
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.