[Checkins] SVN: z3c.componentdebug/trunk/src/z3c/componentdebug/ Fix handling of ComponentLookupError on factory call

Ross Patterson me at rpatterson.net
Sat Jun 2 20:07:58 EDT 2007


Log message for revision 76184:
  Fix handling of ComponentLookupError on factory call
  
  Query for components rather than running the original function and
  check for our default so that any inner ComponentLookupError will not
  be handled
  

Changed:
  U   z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/api.py
  U   z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/registry.py
  U   z3c.componentdebug/trunk/src/z3c/componentdebug/tests/lookup.txt

-=-
Modified: z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/api.py
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/api.py	2007-06-02 22:47:21 UTC (rev 76183)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/api.py	2007-06-03 00:07:58 UTC (rev 76184)
@@ -5,42 +5,47 @@
 
 from z3c.componentdebug.lookup import VerboseComponentLookupError
 
+default = object()
+
 origGetAdapterInContext = _api.getAdapterInContext
 def getAdapterInContext(object, interface, context):
-    try:
-        return origGetAdapterInContext(object, interface, context)
-    except ComponentLookupError:
+    adapter = _api.queryAdapterInContext(
+        object, interface, name, context=context, default=default)
+    if adapter is default:
         raise VerboseComponentLookupError(
             (object,), interface, u'', context,
             methods=['registeredAdapters'])
+    return adapter
 
 origGetAdapter = _api.getAdapter
 def getAdapter(object, interface=Interface, name=u'', context=None):
-    try:
-        return origGetAdapter(object, interface, name, context)
-    except ComponentLookupError:
+    adapter = _api.queryAdapter(
+        object, interface, name, context=context, default=default)
+    if adapter is default:
         raise VerboseComponentLookupError(
-            (object,), interface, name, context,
+            (object,), interface, u'', context,
             methods=['registeredAdapters'])
+    return adapter
 
 origGetMultiAdapter = _api.getMultiAdapter
 def getMultiAdapter(objects, interface=Interface, name=u'',
                     context=None):
-    try:
-        return origGetMultiAdapter(objects, interface, name, context)
-    except ComponentLookupError:
+    adapter = _api.queryMultiAdapter(
+        objects, interface, name, context=context, default=default)
+    if adapter is default:
         raise VerboseComponentLookupError(
             objects, interface, name, context,
             methods=['registeredAdapters'])
+    return adapter
 
 origGetUtility = _api.getUtility
 def getUtility(interface, name='', context=None):
-    try:
-        return origGetUtility(interface, name, context)
-    except ComponentLookupError:
+    utility = _api.queryUtility(provided, name, default=default)
+    if utility is default:
         raise VerboseComponentLookupError(
             False, interface, name, context,
             methods=['registeredUtilities'])
+    return utility
 
 def patch():
     _api.getAdapterInContext = getAdapterInContext

Modified: z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/registry.py
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/registry.py	2007-06-02 22:47:21 UTC (rev 76183)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/lookup/registry.py	2007-06-03 00:07:58 UTC (rev 76184)
@@ -4,32 +4,36 @@
 
 from z3c.componentdebug.lookup import VerboseComponentLookupError
 
+default = object()
+
 origGetUtility = Components.getUtility
 def getUtility(self, provided, name=u''):
-    try:
-        return origGetUtility(self, provided, name)
-    except ComponentLookupError:
+    utility = self.queryUtility(provided, name, default=default)
+    if utility is default:
         raise VerboseComponentLookupError(
             False, provided, name, self,
             methods=['registeredUtilities'])
+    return utility
 
 origGetAdapter = Components.getAdapter
 def getAdapter(self, object, interface=Interface, name=u''):
-    try:
-        return origGetAdapter(self, object, interface, name)
-    except ComponentLookupError:
+    adapter = self.queryAdapter(object, interface, name,
+                                default=default)
+    if adapter is default:
         raise VerboseComponentLookupError(
             (object,), interface, name, self,
             methods=['registeredAdapters'])
+    return adapter
 
 origGetMultiAdapter = Components.getMultiAdapter
 def getMultiAdapter(self, objects, interface=Interface, name=u''):
-    try:
-        return origGetMultiAdapter(self, objects, interface, name)
-    except ComponentLookupError:
+    adapter = self.queryMultiAdapter(objects, interface, name,
+                                     default=default)
+    if adapter is default:
         raise VerboseComponentLookupError(
             objects, interface, name, self,
             methods=['registeredAdapters'])
+    return adapter
 
 def patch():
     Components.getUtility = getUtility

Modified: z3c.componentdebug/trunk/src/z3c/componentdebug/tests/lookup.txt
===================================================================
--- z3c.componentdebug/trunk/src/z3c/componentdebug/tests/lookup.txt	2007-06-02 22:47:21 UTC (rev 76183)
+++ z3c.componentdebug/trunk/src/z3c/componentdebug/tests/lookup.txt	2007-06-03 00:07:58 UTC (rev 76184)
@@ -94,3 +94,39 @@
 
     >>> sm.subscribers([foo], Interface)
     ['qux']
+
+Factory Errors
+--------------
+
+If a ComponentLookupError occurs when the factory is called for an "outer"
+lookup, our output should be germaine to the inner error::
+
+    >>> class INoRegistration(Interface): pass
+    >>> class IHasRegistration(Interface): pass
+    >>> def brokenFactory(context):
+    ...     return component.getAdapter('broken', INoRegistration)
+    >>> gsm.registerAdapter(
+    ...     brokenFactory, (Interface,), IHasRegistration)
+
+    >>> gsm.getAdapter('working', IHasRegistration)
+    Traceback (most recent call last):
+    ...
+    ComponentLookupError: ('broken', <InterfaceClass __builtin__.INoRegistration>, u'')
+
+    >>> patch()
+    >>> gsm.getAdapter('working', IHasRegistration)
+    Traceback (most recent call last):
+    ...
+    VerboseComponentLookupError: Lookup failed for...
+    objects: 'broken'
+    provided: <InterfaceClass __builtin__.INoRegistration>
+    name: 
+    Registrations with matching objects:
+    Objects with matching registrations:
+    'broken': UNMATCHED
+
+    >>> cleanup()
+    >>> gsm.getAdapter('working', IHasRegistration)
+    Traceback (most recent call last):
+    ...
+    ComponentLookupError: ('broken', <InterfaceClass __builtin__.INoRegistration>, u'')



More information about the Checkins mailing list