[Zope3-checkins] SVN: Zope3/branches/jim-adapter/src/zope/component/ Global component registries (including BBB for global site managers). There

Philipp von Weitershausen philikon at philikon.de
Tue Feb 28 11:04:58 EST 2006


Log message for revision 65586:
  Global component registries (including BBB for global site managers).  There
  is the base global component registry of which we only have a singleton (it's
  like the global site manager). And then there are named global component
  registries which are also global but are not the mother of everything.
  They are in fact utilities on the singleton.
  

Changed:
  A   Zope3/branches/jim-adapter/src/zope/component/globalregistry.py
  UU  Zope3/branches/jim-adapter/src/zope/component/site.py

-=-
Added: Zope3/branches/jim-adapter/src/zope/component/globalregistry.py
===================================================================
--- Zope3/branches/jim-adapter/src/zope/component/globalregistry.py	2006-02-28 15:55:08 UTC (rev 65585)
+++ Zope3/branches/jim-adapter/src/zope/component/globalregistry.py	2006-02-28 16:04:57 UTC (rev 65586)
@@ -0,0 +1,163 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# 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.
+#
+##############################################################################
+"""Global components support
+
+$Id$
+"""
+import types
+from zope.interface import implements
+from zope.interface.adapter import AdapterRegistry
+from zope.deprecation.deprecation import deprecate, deprecated
+from zope.component.components import Components
+from zope.component.interfaces import Invalid, IComponentLookup, IRegistry
+from zope.interface.interfaces import ISpecification
+
+def GAR(components, registryName):
+    return getattr(components, registryName)
+
+class GlobalAdapterRegistry(AdapterRegistry):
+    """A global adapter registry
+
+    This adapter registry's main purpose is to be picklable in combination
+    with a site manager."""
+
+    def __init__(self, parent, name):
+        self.__parent__ = parent
+        self.__name__ = name
+        super(GlobalAdapterRegistry, self).__init__()
+
+    def __reduce__(self):
+        return GAR, (self.__parent__, self.__name__)
+
+def NGC(components, registryName):
+    return components.getUtility(IComponents, registryName)
+
+########################################################################
+#
+# BBB 2006/02/28 -- to be removed after 12 months
+
+class IGlobalSiteManager(IComponentLookup, IRegistry):
+
+    def provideAdapter(required, provided, name, factory, info=''):
+        """Register an adapter factory
+
+        :Parameters:
+          - `required`: a sequence of specifications for objects to be
+             adapted.
+          - `provided`: The interface provided by the adapter
+          - `name`: The adapter name
+          - `factory`: The object used to compute the adapter
+          - `info`: Provide some info about this particular adapter.
+        """
+
+    def subscribe(required, provided, factory, info=''):
+        """Register a subscriber factory
+
+        :Parameters:
+          - `required`: a sequence of specifications for objects to be
+             adapted.
+          - `provided`: The interface provided by the adapter
+          - `name`: The adapter name
+          - `factory`: The object used to compute the subscriber
+          - `info`: Provide some info about this particular adapter.
+        """
+
+    def provideUtility(providedInterface, component, name='', info='',
+                       strict=True):
+        """Register a utility
+
+        If strict is true, then the specified component *must* implement the
+        `providedInterface`. Turning strict off is particularly useful for
+        tests."""
+
+deprecated("IGlobalSiteManager", "The IGlobalSiteManager interface has been "
+           "deprecated and will be removed.  Use the zope.component.interfaces."
+           "IComponents instead")
+#
+########################################################################
+
+
+class BaseGlobalComponents(Components):
+    implements(IGlobalSiteManager)
+
+    def __init__(self, name):
+        self.__name__ = name
+        super(BaseGlobalComponents, self).__init__()
+
+    def _init_registries(self):
+        self.adapters = GlobalAdapterRegistry(self, 'adapters')
+        self.utilities = GlobalAdapterRegistry(self, 'utilities')
+
+    def __reduce__(self):
+        # Global site managers are pickled as global objects
+        return self.__name__
+
+    ####################################################################
+    #
+    # BBB 2006/02/28 -- to be removed after 12 months
+
+    @deprecate("The provideAdapter method of the global site manager has been "
+               "deprecated. Use registerAdapter instead.")
+    def provideAdapter(self, required, provided, name, factory, info=''):
+        self.registerAdapter(factory, required, provided, name, info)
+
+    @deprecate("The subscribe method of the global site manager has been "
+               "deprecated. Use registerSubscrirptionAdapter instead.")
+    def subscribe(self, required, provided, factory, info=''):
+        self.registerSubscriptionAdapter(factory, required, provided,
+                                         u'', info)
+
+    @deprecate("The provideUtility method of the global site manager has been "
+               "deprecated. Use registerUtility instead.")
+    def provideUtility(self, providedInterface, component, name='', info='',
+                       strict=True):
+        if strict and not providedInterface.providedBy(component):
+            raise Invalid("The registered component doesn't provide "
+                          "the promised interface.")
+
+        self.registerUtility(component, providedInterface, name, info)
+
+    @deprecate("The registrations method of the global site manager has been "
+               "deprecate. Use either registeredAdapters, registeredUtilities, "
+               "or registeredSubscriptionAdapters instead.")
+    def registrations(self):
+        for reg in self.registeredAdapters():
+            yield reg
+        for reg in registeredSubscriptionAdapters():
+            yield reg
+        for reg in self.registeredUtilities():
+            yield reg
+    #
+    ####################################################################    
+
+def _resetBase():
+    # globally available singleton
+    global base
+    base = BaseGlobalComponents('base')
+
+from zope.testing.cleanup import addCleanUp
+addCleanUp(_resetBase)
+del addCleanUp
+
+# set it up for the first time
+_resetBase()
+
+class NamedGlobalComponents(BaseGlobalComponents):
+
+    def __init__(self, parent, name):
+        self.__parent__ = parent
+        super(NamedGlobalComponents, self).__init__(name)
+
+    def __reduce__(self):
+        return NGC, (self.__parent__, self.__name__)


Property changes on: Zope3/branches/jim-adapter/src/zope/component/globalregistry.py
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: Zope3/branches/jim-adapter/src/zope/component/site.py
===================================================================
--- Zope3/branches/jim-adapter/src/zope/component/site.py	2006-02-28 15:55:08 UTC (rev 65585)
+++ Zope3/branches/jim-adapter/src/zope/component/site.py	2006-02-28 16:04:57 UTC (rev 65586)
@@ -13,318 +13,24 @@
 ##############################################################################
 """Global Site Manager
 
+This module has been deprecated and will be removed.  Most of the
+functionality now resides in the zope.component.globalregistry module.
+
 $Id$
 """
 __docformat__ = "reStructuredText"
-import types
 
-from zope import interface
-from zope.interface import implements, providedBy, implementedBy, declarations
-from zope.interface.adapter import AdapterRegistry
-from zope.interface.interfaces import ISpecification
+import warnings
+warnings.warn("The zope.component.site module has been deprecated and "
+              "will be removed.  Most of the functionality now resides "
+              "in the zope.component.globalregistry module.",
+              DeprecationWarning, stacklevel=1)
 
-from zope.component.interfaces import ISiteManager, IRegistry
-from zope.component.interfaces import ComponentLookupError, Invalid
-
-
-class IGlobalSiteManager(ISiteManager, IRegistry):
-
-    def provideAdapter(required, provided, name, factory, info=''):
-        """Register an adapter factory
-
-        :Parameters:
-          - `required`: a sequence of specifications for objects to be
-             adapted.
-          - `provided`: The interface provided by the adapter
-          - `name`: The adapter name
-          - `factory`: The object used to compute the adapter
-          - `info`: Provide some info about this particular adapter.
-        """
-
-    def subscribe(required, provided, factory, info=''):
-        """Register a subscriber factory
-
-        :Parameters:
-          - `required`: a sequence of specifications for objects to be
-             adapted.
-          - `provided`: The interface provided by the adapter
-          - `name`: The adapter name
-          - `factory`: The object used to compute the subscriber
-          - `info`: Provide some info about this particular adapter.
-        """
-
-    def provideUtility(providedInterface, component, name='', info='',
-                       strict=True):
-        """Register a utility
-
-        If strict is true, then the specified component *must* implement the
-        `providedInterface`. Turning strict off is particularly useful for
-        tests.
-        """
-
-
-class SiteManager(object):
-    """Site Manager implementation"""
-
-    def queryAdapter(self, object, interface, name, default=None):
-        """See ISiteManager interface"""
-        return self.adapters.queryAdapter(object, interface, name, default)
-
-    def queryMultiAdapter(self, objects, interface, name='', default=None):
-        """See ISiteManager interface"""
-        return self.adapters.queryMultiAdapter(objects, interface, name,
-                                               default)
-
-    def getAdapters(self, objects, provided):
-        """See ISiteManager interface"""
-        result = []
-        for name, factory in self.adapters.lookupAll(map(providedBy, objects),
-                                                     provided):
-            adapter = factory(*objects)
-            if adapter is not None:
-                result.append((name, adapter))
-        return result
-
-    def subscribers(self, required, provided):
-        """See ISiteManager interface"""
-        return self.adapters.subscribers(required, provided)
-
-    def queryUtility(self, interface, name='', default=None):
-        """See ISiteManager interface"""
-        return self.utilities.lookup((), interface, name, default)
-
-    def getUtilitiesFor(self, interface):
-        return self.utilities.lookupAll((), interface)
-
-    def getAllUtilitiesRegisteredFor(self, interface):
-        return self.utilities.subscriptions((), interface)
-
-
-class GlobalSiteManager(SiteManager):
-    """Global Site Manager implementation."""
-
-    implements(IGlobalSiteManager)
-
-    def __init__(self, name=None):
-        self.__name__ = name
-
-        # we use a dict for registrations so that overriding
-        # registrations for adapters and utilities make us forget
-        # overridden registrations
-        self._registrations = {}
-
-        self.adapters = GlobalAdapterRegistry(self, 'adapters')
-        self.utilities = GlobalAdapterRegistry(self, 'utilities')
-
-
-    def provideAdapter(self, required, provided, name, factory, info=''):
-        """Register an adapter
-
-        >>> from zope.interface import Interface
-        >>> registry = GlobalSiteManager()
-        >>> class R1(Interface):
-        ...     pass
-        >>> class R2(R1):
-        ...     pass
-        >>> class P1(Interface):
-        ...     pass
-        >>> class P2(P1):
-        ...     pass
-
-        >>> registry.provideAdapter((R1, ), P2, 'bob', 'c1', 'd1')
-        >>> registry.provideAdapter((R1, ), P2,    '', 'c2', 'd2')
-        >>> registry.adapters.lookup((R2, ), P1, '')
-        'c2'
-
-        >>> registrations = map(repr, registry.registrations())
-        >>> registrations.sort()
-        >>> for registration in registrations:
-        ...    print registration
-        AdapterRegistration(('R1',), 'P2', '', 'c2', 'd2')
-        AdapterRegistration(('R1',), 'P2', 'bob', 'c1', 'd1')
-
-        Let's make sure that we can also register regular classes for
-        adaptation.
-
-        >>> class O1(object):
-        ...     pass
-        >>> class O2(object):
-        ...     pass
-        >>> class O3(object):
-        ...     def __init__(self, obj1, obj2=None):
-        ...         pass
-
-        >>> registry.provideAdapter((O1, ), R1, '', O3)
-        >>> registry.queryAdapter(O1(), R1, '').__class__
-        <class 'zope.component.site.O3'>
-
-        >>> registry.provideAdapter((O1, O2), R1, '', O3)
-        >>> registry.queryMultiAdapter((O1(), O2()), R1, '').__class__
-        <class 'zope.component.site.O3'>
-        """
-        if ISpecification.providedBy(required):
-            raise TypeError('the required argument should be a list of'
-                            ' interfaces, not a single interface')
-        required = tuple(map(_spec, required))
-        self._registrations[(required, provided, name)] = AdapterRegistration(
-            required, provided, name, factory, info)
-        self.adapters.register(required, provided, name, factory)
-
-    def subscribe(self, required, provided, factory, info=''):
-        """Register an subscriptions adapter
-
-        >>> from zope.interface import Interface
-        >>> registry = GlobalSiteManager()
-        >>> class R1(Interface):
-        ...     pass
-        >>> class R2(R1):
-        ...     pass
-        >>> class P1(Interface):
-        ...     pass
-        >>> class P2(P1):
-        ...     pass
-
-        >>> registry.subscribe((R1, ), P2, 'c1', 'd1')
-        >>> registry.subscribe((R1, ), P2, 'c2', 'd2')
-        >>> subscriptions = map(str,
-        ...                     registry.adapters.subscriptions((R2, ), P1))
-        >>> subscriptions.sort()
-        >>> subscriptions
-        ['c1', 'c2']
-
-        >>> registrations = map(repr, registry.registrations())
-        >>> registrations.sort()
-        >>> for registration in registrations:
-        ...    print registration
-        SubscriptionRegistration(('R1',), 'P2', 'c1', 'd1')
-        SubscriptionRegistration(('R1',), 'P2', 'c2', 'd2')
-        """
-        if ISpecification.providedBy(required):
-            raise TypeError('the required argument should be a list of'
-                            ' interfaces, not a single interface')
-
-        required = tuple(map(_spec, required))
-
-        # Note that subscriptions of the same time can be repeated
-        # so we just use the rgistration itself as the key.
-        registration = SubscriptionRegistration(
-            required, provided, factory, info)
-        self._registrations[registration] = registration
-
-        self.adapters.subscribe(required, provided, factory)
-
-    def provideUtility(self, providedInterface, component, name='', info='',
-                        strict=True):
-
-        if strict and not providedInterface.providedBy(component):
-            raise Invalid("The registered component doesn't provide "
-                          "the promised interface.")
-
-        self.utilities.register((), providedInterface, name, component)
-
-        # Also subscribe to support getAllUtilitiesRegisteredFor:
-        self.utilities.subscribe((), providedInterface, component)
-
-        self._registrations[(providedInterface, name)] = UtilityRegistration(
-            providedInterface, name, component, info)
-
-    def registrations(self):
-        return self._registrations.itervalues()
-
-    def __reduce__(self):
-        # Global site managers are pickled as global objects
-        return self.__name__
-
-_class_types = (type, types.ClassType)
-def _spec(iface_or_class):
-    if ISpecification.providedBy(iface_or_class):
-        return iface_or_class
-    if iface_or_class is None:
-        return interface.Interface
-    if isinstance(iface_or_class, _class_types):
-        return interface.implementedBy(iface_or_class)
-    raise TypeError(iface_or_class, ISpecification)
-
-
-def GAR(siteManager, registryName):
-    return getattr(siteManager, registryName)
-
-class GlobalAdapterRegistry(AdapterRegistry):
-    """A global adapter registry
-
-    This adapter registry's main purpose is to be picklable in combination
-    with a site manager.
-    """
-    def __init__(self, parent=None, name=None):
-       self.__parent__ = parent
-       self.__name__ = name
-       super(GlobalAdapterRegistry, self).__init__()
-
-    def __reduce__(self):
-        return GAR, (self.__parent__, self.__name__)
-
-
-# Global Site Manager Instance
-globalSiteManager = GlobalSiteManager('globalSiteManager')
-
-# Register our cleanup with zope.testing.cleanup to make writing unit tests
-# simpler.
-from zope.testing.cleanup import addCleanUp
-addCleanUp(lambda : globalSiteManager.__init__(globalSiteManager.__name__))
-del addCleanUp
-
-
-
-class AdapterRegistration(object):
-    """Registration for a simple adapter."""
-
-    def __init__(self, required, provided, name, value, doc=''):
-        (self.required, self.provided, self.name, self.value, self.doc
-         ) = required, provided, name, value, doc
-
-    def __repr__(self):
-        return '%s(%r, %r, %r, %r, %r)' % (
-            self.__class__.__name__,
-            tuple([getattr(r, '__name__', None) for r in self.required]),
-            getattr(self.provided, '__name__', None), self.name,
-            self.value, self.doc,
-            )
-
-    def __cmp__(self, other):
-        return cmp(self.__repr__(), other.__repr__())
-
-
-class SubscriptionRegistration(object):
-    """Registration for a subscription adapter."""
-
-    def __init__(self, required, provided, value, doc):
-        (self.required, self.provided, self.value, self.doc
-         ) = required, provided, value, doc
-
-    def __repr__(self):
-        return '%s(%r, %r, %r, %r)' % (
-            self.__class__.__name__,
-            tuple([getattr(r, '__name__', None) for r in self.required]),
-            getattr(self.provided, '__name__', None), self.value, self.doc,
-            )
-
-    def __cmp__(self, other):
-        return cmp(self.__repr__(), other.__repr__())
-
-
-class UtilityRegistration(object):
-
-    def __init__(self, provided, name, component, doc):
-        (self.provided, self.name, self.component, self.doc
-         ) = provided, name, component, doc
-
-    def __repr__(self):
-        return '%s(%r, %r, %r, %r)' % (
-            self.__class__.__name__,
-            getattr(self.provided, '__name__', None), self.name,
-            getattr(self.component, '__name__', self.component), self.doc,
-            )
-
-    def __cmp__(self, other):
-        return cmp(self.__repr__(), other.__repr__())
-
+from zope.component.components import Components as SiteManager
+from zope.component.components import AdapterRegistration
+from zope.component.components import SubscriptionRegistration
+from zope.component.components import UtilityRegistration
+from zope.component.globalregistry import BaseGlobalComponents \
+     as GlobalSiteManager
+from zope.component.globalregistry import base as globalSiteManager
+from zope.component.globalregistry import IGlobalSiteManager


Property changes on: Zope3/branches/jim-adapter/src/zope/component/site.py
___________________________________________________________________
Name: svn:keywords
   + Id



More information about the Zope3-Checkins mailing list