[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