def registerUtility(self, component=None, provided=None, name=_u(''), info=_u(''), event=True, factory=None): if factory: if component: raise TypeError("Can't specify factory and component.") component = factory() if provided is None: provided = _getUtilityProvided(component) reg = self._utility_registrations.get((provided, name)) if reg is not None: if reg[:2] == (component, info): # already registered return self.unregisterUtility(reg[0], provided, name) subscribed = False for ((p, _), data) in iter(self._utility_registrations.items()): if p == provided and data[0] == component: subscribed = True break self._utility_registrations[(provided, name)] = component, info, factory self.utilities.register((), provided, name, component) if not subscribed: self.utilities.subscribe((), provided, component) if event: notify(Registered( UtilityRegistration(self, provided, name, component, info, factory) ))
def registerAdapter(self, factory, required=None, provided=None, name=_u(''), info=_u(''), event=True): if provided is None: provided = _getAdapterProvided(factory) required = _getAdapterRequired(factory, required) self._adapter_registrations[(required, provided, name) ] = factory, info self.adapters.register(required, provided, name, factory) if event: notify(Registered( AdapterRegistration(self, required, provided, name, factory, info) ))
def registerHandler(self, factory, required=None, name=_u(''), info=_u(''), event=True): if name: raise TypeError("Named handlers are not yet supported") required = _getAdapterRequired(factory, required) self._handler_registrations.append((required, name, factory, info)) self.adapters.subscribe(required, None, factory) if event: notify( Registered( HandlerRegistration(self, required, name, factory, info)))
def registerAdapter(self, factory, required=None, provided=None, name=_u(''), info=_u(''), event=True): if provided is None: provided = _getAdapterProvided(factory) required = _getAdapterRequired(factory, required) if name == _u(''): name = _getName(factory) self._adapter_registrations[(required, provided, name) ] = factory, info self.adapters.register(required, provided, name, factory) if event: notify(Registered( AdapterRegistration(self, required, provided, name, factory, info) ))
def unregisterAdapter(self, factory=None, required=None, provided=None, name=_u(''), ): if provided is None: if factory is None: raise TypeError("Must specify one of factory and provided") provided = _getAdapterProvided(factory) if (required is None) and (factory is None): raise TypeError("Must specify one of factory and required") required = _getAdapterRequired(factory, required) old = self._adapter_registrations.get((required, provided, name)) if (old is None) or ((factory is not None) and (factory != old[0])): return False del self._adapter_registrations[(required, provided, name)] self.adapters.unregister(required, provided, name) notify(Unregistered( AdapterRegistration(self, required, provided, name, *old) )) return True
def registerHandler(self, factory, required=None, name=_u(''), info=_u(''), event=True): if name: raise TypeError("Named handlers are not yet supported") required = _getAdapterRequired(factory, required) self._handler_registrations.append( (required, name, factory, info) ) self.adapters.subscribe(required, None, factory) if event: notify(Registered( HandlerRegistration(self, required, name, factory, info) ))
def unregisterHandler(self, factory=None, required=None, name=_u('')): if name: raise TypeError("Named subscribers are not yet supported") if (required is None) and (factory is None): raise TypeError("Must specify one of factory and required") required = _getAdapterRequired(factory, required) if factory is None: new = [(r, n, f, i) for (r, n, f, i) in self._handler_registrations if r != required ] else: new = [(r, n, f, i) for (r, n, f, i) in self._handler_registrations if not (r == required and f == factory) ] if len(new) == len(self._handler_registrations): return False self._handler_registrations[:] = new self.adapters.unsubscribe(required, None, factory) notify(Unregistered( HandlerRegistration(self, required, name, factory, '') )) return True
def unregisterAdapter( self, factory=None, required=None, provided=None, name=_u(''), ): if provided is None: if factory is None: raise TypeError("Must specify one of factory and provided") provided = _getAdapterProvided(factory) if (required is None) and (factory is None): raise TypeError("Must specify one of factory and required") required = _getAdapterRequired(factory, required) old = self._adapter_registrations.get((required, provided, name)) if (old is None) or ((factory is not None) and (factory != old[0])): return False del self._adapter_registrations[(required, provided, name)] self.adapters.unregister(required, provided, name) notify( Unregistered( AdapterRegistration(self, required, provided, name, *old))) return True
def unregisterHandler(self, factory=None, required=None, name=_u('')): if name: raise TypeError("Named subscribers are not yet supported") if (required is None) and (factory is None): raise TypeError("Must specify one of factory and required") required = _getAdapterRequired(factory, required) if factory is None: new = [(r, n, f, i) for (r, n, f, i) in self._handler_registrations if r != required] else: new = [(r, n, f, i) for (r, n, f, i) in self._handler_registrations if not (r == required and f == factory)] if len(new) == len(self._handler_registrations): return False self._handler_registrations[:] = new self.adapters.unsubscribe(required, None, factory) notify( Unregistered(HandlerRegistration(self, required, name, factory, ''))) return True
def registerUtility(self, component=None, provided=None, name=_u(''), info=_u(''), event=True, factory=None): if factory: if component: raise TypeError("Can't specify factory and component.") component = factory() if provided is None: provided = _getUtilityProvided(component) if name == _u(''): name = _getName(component) reg = self._utility_registrations.get((provided, name)) if reg is not None: if reg[:2] == (component, info): # already registered return self.unregisterUtility(reg[0], provided, name) subscribed = False for ((p, _), data) in iter(self._utility_registrations.items()): if p == provided and data[0] == component: subscribed = True break self._utility_registrations[(provided, name)] = component, info, factory self.utilities.register((), provided, name, component) if not subscribed: self.utilities.subscribe((), provided, component) if event: notify( Registered( UtilityRegistration(self, provided, name, component, info, factory)))
def registerSubscriptionAdapter(self, factory, required=None, provided=None, name=_u(''), info=_u(''), event=True): if name: raise TypeError("Named subscribers are not yet supported") if provided is None: provided = _getAdapterProvided(factory) required = _getAdapterRequired(factory, required) self._subscription_registrations.append( (required, provided, name, factory, info) ) self.adapters.subscribe(required, provided, factory) if event: notify(Registered( SubscriptionRegistration(self, required, provided, name, factory, info) ))
def unregisterUtility(self, component=None, provided=None, name=_u(''), factory=None): if factory: if component: raise TypeError("Can't specify factory and component.") component = factory() if provided is None: if component is None: raise TypeError("Must specify one of component, factory and " "provided") provided = _getUtilityProvided(component) old = self._utility_registrations.get((provided, name)) if (old is None) or ((component is not None) and (component != old[0])): return False if component is None: component = old[0] # Note that component is now the old thing registered del self._utility_registrations[(provided, name)] self.utilities.unregister((), provided, name) subscribed = False for ((p, _), data) in iter(self._utility_registrations.items()): if p == provided and data[0] == component: subscribed = True break if not subscribed: self.utilities.unsubscribe((), provided, component) notify( Unregistered( UtilityRegistration(self, provided, name, component, *old[1:]))) return True
def unregisterUtility(self, component=None, provided=None, name=_u(''), factory=None): if factory: if component: raise TypeError("Can't specify factory and component.") component = factory() if provided is None: if component is None: raise TypeError("Must specify one of component, factory and " "provided") provided = _getUtilityProvided(component) old = self._utility_registrations.get((provided, name)) if (old is None) or ((component is not None) and (component != old[0])): return False if component is None: component = old[0] # Note that component is now the old thing registered del self._utility_registrations[(provided, name)] self.utilities.unregister((), provided, name) subscribed = False for ((p, _), data) in iter(self._utility_registrations.items()): if p == provided and data[0] == component: subscribed = True break if not subscribed: self.utilities.unsubscribe((), provided, component) notify(Unregistered( UtilityRegistration(self, provided, name, component, *old[1:]) )) return True
def _getName(component): try: return component.__component_name__ except AttributeError: return _u('')
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """Interface Package Interfaces """ __docformat__ = 'restructuredtext' from zope.interface.interface import Attribute from zope.interface.interface import Interface from zope.interface.declarations import implementer from zope.interface._compat import _u _BLANK = _u('') class IElement(Interface): """Objects that have basic documentation and tagged values. """ __name__ = Attribute('__name__', 'The object name') __doc__ = Attribute('__doc__', 'The object doc string') def getTaggedValue(tag): """Returns the value associated with `tag`. Raise a `KeyError` of the tag isn't set. """ def queryTaggedValue(tag, default=None):
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS # FOR A PARTICULAR PURPOSE. # ############################################################################## """Adapter management """ import weakref from zope.interface import providedBy from zope.interface import Interface from zope.interface import ro from zope.interface._compat import _u from zope.interface._compat import _normalize_name _BLANK = _u('') class BaseAdapterRegistry(object): # List of methods copied from lookup sub-objects: _delegated = ('lookup', 'queryMultiAdapter', 'lookup1', 'queryAdapter', 'adapter_hook', 'lookupAll', 'names', 'subscriptions', 'subscribers') # All registries maintain a generation that can be used by verifying # registries _generation = 0 def __init__(self, bases=()):
def getMultiAdapter(self, objects, interface, name=_u('')): adapter = self.adapters.queryMultiAdapter(objects, interface, name) if adapter is None: raise ComponentLookupError(objects, interface, name) return adapter
def queryMultiAdapter(self, objects, interface, name=_u(''), default=None): return self.adapters.queryMultiAdapter( objects, interface, name, default)
def getUtility(self, provided, name=_u('')): utility = self.utilities.lookup((), provided, name) if utility is None: raise ComponentLookupError(provided, name) return utility
def queryUtility(self, provided, name=_u(''), default=None): return self.utilities.lookup((), provided, name, default)
def test__normalize_name_unicode(self): from zope.interface.adapter import _normalize_name from zope.interface._compat import _u USTR = _u('ustr') self.assertEqual(_normalize_name(USTR), USTR)
def queryMultiAdapter(self, objects, interface, name=_u(''), default=None): return self.adapters.queryMultiAdapter(objects, interface, name, default)