[Checkins] SVN: z3c.componentdebug/trunk/src/z3c/componentdebug/ Better interface for listing registrations

Ross Patterson me at rpatterson.net
Wed May 30 20:14:19 EDT 2007


Log message for revision 76025:
  Better interface for listing registrations
  

Changed:
  U   z3c.componentdebug/trunk/src/z3c/componentdebug/README.txt
  U   z3c.componentdebug/trunk/src/z3c/componentdebug/__init__.py
  U   z3c.componentdebug/trunk/src/z3c/componentdebug/component.py
  A   z3c.componentdebug/trunk/src/z3c/componentdebug/interfaces.py

-=-
Modified: z3c.componentdebug/trunk/src/z3c/componentdebug/README.txt
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/README.txt	2007-05-31 00:12:29 UTC (rev 76024)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/README.txt	2007-05-31 00:14:18 UTC (rev 76025)
@@ -57,8 +57,9 @@
     >>> queryMultiAdapter((foo, bar), IBaz)
 
     >>> from pprint import pprint
-    >>> from z3c.componentdebug import inspectRequiredAdapters
-    >>> pprint([i for i in inspectRequiredAdapters((foo, bar), IBaz)])
+    >>> from z3c.componentdebug import inspect
+    >>> registrations = inspect((foo, bar), IBaz)
+    >>> pprint([i for i in registrations.byObjects()])
     [(<Foo object at ...>, {}), (<Bar object at ...>, {})]
 
 Register a factory for this lookup::
@@ -72,7 +73,8 @@
     >>> queryMultiAdapter((foo, bar), IBaz)
     'baz'
     
-    >>> pprint([i for i in inspectRequiredAdapters((foo, bar), IBaz)])
+    >>> registrations = inspect((foo, bar), IBaz)
+    >>> pprint([i for i in registrations.byObjects()])
     [(<Foo object at ...>,
       {<InterfaceClass __builtin__.IFoo>:
       AdapterRegistration(<BaseGlobalComponents base>, [IFoo, IBar],
@@ -91,7 +93,8 @@
 
     >>> queryMultiAdapter((foo, bar), IBaz)
     
-    >>> pprint([i for i in inspectRequiredAdapters((foo, bar), IBaz)])
+    >>> registrations = inspect((foo, bar), IBaz)
+    >>> pprint([i for i in registrations.byObjects()])
     [(<Foo object at ...>,
       {<InterfaceClass __builtin__.IFoo>:
       AdapterRegistration(<BaseGlobalComponents base>, [IFoo, IBar],

Modified: z3c.componentdebug/trunk/src/z3c/componentdebug/__init__.py
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/__init__.py	2007-05-31 00:12:29 UTC (rev 76024)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/__init__.py	2007-05-31 00:14:18 UTC (rev 76025)
@@ -1,3 +1,3 @@
 """Tools for debgging the Zope component registry."""
 
-from component import inspectRequiredAdapters
+from component import Registrations as inspect

Modified: z3c.componentdebug/trunk/src/z3c/componentdebug/component.py
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/component.py	2007-05-31 00:12:29 UTC (rev 76024)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/component.py	2007-05-31 00:14:18 UTC (rev 76025)
@@ -4,50 +4,59 @@
 from zope.component import getSiteManager
 from zope.app.component import queryNextSiteManager
 
+all_methods=('registeredAdapters',
+             'registeredSubscriptionAdapters',
+             'registeredHandlers',
+             'registeredUtilities')
+
 _marker = object()
-def getSiteManagers(context=None, sm=None):
+def getSiteManagers(context=None):
     """Return an iterator over the chain of site managers."""
-    assert None in (context, sm)
-    if sm is None:
-        sm = getSiteManager(context)
+    sm = getSiteManager(context)
     while sm is not _marker:
         yield sm
         sm = queryNextSiteManager(sm, _marker)
 
-def getRegistrations(methods, context=None, sm=None):
-    for sm_ in getSiteManagers(context, sm):
+def getRegistrations(methods, context=None):
+    for sm in getSiteManagers(context):
         for method in methods:
-            for reg in getattr(sm_, method)():
+            for reg in getattr(sm, method)():
                 yield reg
 
-def inspectRequired(regs, objects, iface, name=u''):
-    order = len(objects)
-    idxs = xrange(order)
+class Registrations(list):
 
-    # Only bother with registrations that provide the interface and
-    # require the same number of objects, and has the right name
-    regs = [reg for reg in regs
-            if reg.provided is iface
-            and len(reg.required) == order
-            and reg.name == name]
+    def __init__(self, objects=False, provided=False, name=False,
+                 context=None, methods=all_methods):
+        self.methods = methods
 
-    for idx in idxs:
-        object = objects[idx]
-        provided = providedBy(object)
-        result = {}
-        for reg in regs:
-            req = reg.required[idx]
-            for prov in provided:
-                if prov.isOrExtends(req):
-                    result[req] = reg
-                    break
-        yield object, result
+        if objects is not False:
+            self.objects = objects
+            self.order = len(objects)
+        if provided is not False:
+            self.provided = provided
+        if name is not False:
+            self.name = name
+        if context is not None:
+            self.context = context
+        
+        super(Registrations, self).__init__(
+            reg for reg in getRegistrations(self.methods, context)
+            if (provided is False or reg.provided is provided)
+            and (objects is False or len(reg.required) == self.order)
+            and (name is False or reg.name == name))
 
-adapter_methods=('registeredAdapters',
-                 'registeredSubscriptionAdapters',
-                 'registeredHandlers')
-def inspectRequiredAdapters(objects, iface, name=u'',
-                              context=None, sm=None):
-    return inspectRequired(
-        getRegistrations(adapter_methods, context, sm),
-        objects, iface, name)
+    def byObjects(self):
+        assert hasattr(self, 'objects')
+        
+        idxs = xrange(self.order)
+        for idx in idxs:
+            object = self.objects[idx]
+            provided = providedBy(object)
+            result = {}
+            for reg in self:
+                required = reg.required[idx]
+                for prov in provided:
+                    if prov.isOrExtends(required):
+                        result[required] = reg
+                        break
+            yield object, result

Added: z3c.componentdebug/trunk/src/z3c/componentdebug/interfaces.py
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/interfaces.py	                        (rev 0)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/interfaces.py	2007-05-31 00:14:18 UTC (rev 76025)
@@ -0,0 +1,7 @@
+from zope.interface import Interface
+
+class IRegistrations(Interface):
+    """Registrations that qualify for the given lookup."""
+
+    def byObjects():
+        """Return the registrations grouped by the objects."""



More information about the Checkins mailing list