[Zope3-checkins] SVN: Zope3/trunk/src/z Updated adapter API
Jim Fulton
jim at zope.com
Fri Jul 2 14:14:53 EDT 2004
Log message for revision 26049:
Updated adapter API
as described in:
http://mail.zope.org/pipermail/zope3-dev/2004-July/011537.html
- query/getAdapter now require a name argument and ignore
whether the object being adapted provides or conforms to the
interface.
- New functions 'getAdapterInContext' and 'queryAdapterInContext'
can be used to do content-dependent simple adapation. They
will return the object being adapted if it provides the desired
interface and will return the result of calling __conform__ if the
object conforms to the interface.
IMPORTANT
To do simple adaptation, just call the desired interface:
adapter = iface(ob) or iface(ob, default)
-=-
Modified: Zope3/trunk/src/z3checkins/message.py
===================================================================
--- Zope3/trunk/src/z3checkins/message.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/z3checkins/message.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -22,7 +22,7 @@
from zope.app.datetimeutils import parseDatetimetz, DateTimeError
from zope.app.dublincore.interfaces import IZopeDublinCore
from zope.app.pagetemplate import ViewPageTemplateFile
-from zope.component import getUtility, getAdapter, queryAdapter
+from zope.component import getUtility
from zope.component import getView
from zope.exceptions import DuplicationError
from zope.interface import implements
@@ -361,7 +361,7 @@
for message in messages:
try:
self.add(message)
- dc = queryAdapter(message, IZopeDublinCore)
+ dc = IZopeDublinCore(message, None)
if dc is not None:
# XXX should handle RFC-2047
dc.title = unicode(message.subject)
@@ -384,7 +384,7 @@
Title is obtained from Dublin Core metadata of the folder. If it is
empty, "Zope 3 Checkins" is used.
"""
- dc = queryAdapter(self.context, IZopeDublinCore)
+ dc = IZopeDublinCore(self.context, None)
if dc is not None:
title = dc.title
else:
@@ -420,7 +420,7 @@
if int(self.request.get('start', 0)) > 0:
return # The user can't see the newest checkins
if not hasattr(self, '_archive'):
- self._archive = getAdapter(self.context, IMessageArchive)
+ self._archive = IMessageArchive(self.context)
if not self._archive:
return # No messages -- no bookmarks
bookmarks = self.bookmarks()
@@ -443,7 +443,7 @@
if start is None: start = int(self.request.get('start', 0))
if size is None: size = int(self.request.get('size', 20))
if not hasattr(self, '_archive'):
- self._archive = getAdapter(self.context, IMessageArchive)
+ self._archive = IMessageArchive(self.context)
idx = len(self._archive) - start
items = self._archive[max(0, idx-size):idx]
items = removeAllProxies(items)
@@ -491,7 +491,7 @@
def count(self):
"""Returns the number of checkin messages in the archive."""
if not hasattr(self, '_archive'):
- self._archive = getAdapter(self.context, IMessageArchive)
+ self._archive = IMessageArchive(self.context)
return len(self._archive)
@@ -510,8 +510,7 @@
def _calc_index(self):
if not hasattr(self, '_archive'):
container = self.context.__parent__
- self._archive = container and queryAdapter(container,
- IMessageArchive)
+ self._archive = container and IMessageArchive(container, None)
if not self._archive:
self._index = None
elif not hasattr(self, '_index'):
Modified: Zope3/trunk/src/zope/app/apidoc/viewmodule/__init__.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/viewmodule/__init__.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/apidoc/viewmodule/__init__.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -108,7 +108,7 @@
"""
# Only the global presentation service defines skins
service = zapi.getGlobalService('Presentation')
- skins = [zapi.getAdapter(reg, ISkinDocumentation)
+ skins = [ISkinDocumentation(reg)
for reg in service.registrations()
if isinstance(reg, SkinRegistration)]
skins.sort(lambda x, y: cmp(x.name, y.name))
@@ -174,7 +174,7 @@
Each element of the list is a LayerDocumentation component.
"""
service = zapi.getService('Presentation')
- layers = [zapi.getAdapter(reg, ILayerDocumentation)
+ layers = [ILayerDocumentation(reg)
for reg in service.registrations()
if (isinstance(reg, LayerRegistration) and
reg.layer in self.context.layers)]
@@ -183,7 +183,7 @@
if 'default' in self.context.layers:
default = LayerRegistration('default',
'This is a predefined skin.')
- layers.append(zapi.getAdapter(default, ILayerDocumentation))
+ layers.append(ILayerDocumentation(default))
return layers
# See ISkinDocumentation
Modified: Zope3/trunk/src/zope/app/component/hooks.py
===================================================================
--- Zope3/trunk/src/zope/app/component/hooks.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/component/hooks.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -16,7 +16,7 @@
$Id$
"""
-from zope.component import getService, getAdapter
+from zope.component import getService
from zope.component.interfaces import IServiceService
from zope.app.site.interfaces import ISite
from zope.component.service import serviceManager
@@ -64,18 +64,15 @@
return services
+ # Deprecated support for a context that isn't adaptable to
+ # IServiceService. Return the default service manager.
try:
- # This try-except is just backward compatibility really
- return trustedRemoveSecurityProxy(getAdapter(context, IServiceService))
+ return trustedRemoveSecurityProxy(IServiceService(context,
+ serviceManager))
except ComponentLookupError:
- # Deprecated support for a context that isn't adaptable to
- # IServiceService. Return the default service manager.
- ## warnings.warn("getServices' context arg must be None or"
- ## " adaptable to IServiceService.",
- ## DeprecationWarning, warningLevel())
return serviceManager
+
-
def queryView(object, name, request, default=None,
providing=Interface, context=None):
# XXX test
Modified: Zope3/trunk/src/zope/app/file/browser/image.py
===================================================================
--- Zope3/trunk/src/zope/app/file/browser/image.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/file/browser/image.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -15,7 +15,6 @@
$Id$
"""
-from zope.app import zapi
from zope.app.size import byteDisplay
from zope.app.size.interfaces import ISized
@@ -87,5 +86,5 @@
"""Image edit view mix-in that provides access to image size info"""
def size(self):
- sized = zapi.getAdapter(self.context, ISized)
+ sized = ISized(self.context)
return sized.sizeForDisplay()
Modified: Zope3/trunk/src/zope/app/form/browser/add.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/add.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/form/browser/add.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -25,7 +25,6 @@
from zope.app.form.interfaces import IInputWidget, WidgetsError
from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
-from zope.component import getAdapter
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.schema.interfaces import ValidationError
from zope.security.checker import defineChecker, NamesChecker
@@ -87,7 +86,7 @@
kw[str(name)] = data[name]
content = self.create(*args, **kw)
- adapted = getAdapter(content, self.schema)
+ adapted = self.schema(content)
errors = []
@@ -107,7 +106,7 @@
content = self.add(content)
- adapted = getAdapter(content, self.schema)
+ adapted = self.schema(content)
if self._set_after_add:
for name in self._set_after_add:
Modified: Zope3/trunk/src/zope/app/form/browser/addwizard.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/addwizard.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/form/browser/addwizard.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -24,7 +24,6 @@
from zope.app.form.interfaces import WidgetsError, IInputWidget
from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
-from zope.component import getAdapter
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.schema.interfaces import ValidationError
from zope.security.checker import defineChecker, NamesChecker
@@ -72,7 +71,7 @@
kw[str(name)] = data[name]
content = self.create(*args, **kw)
- adapted = getAdapter(content, self.schema, context=self.context)
+ adapted = self.schema(content)
errors = []
@@ -91,7 +90,7 @@
content = self.context.add(content)
- adapted = getAdapter(content, self.schema)
+ adapted = self.schema(content)
for name in self._set_after_add:
if name in data:
Modified: Zope3/trunk/src/zope/app/form/browser/editview.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/editview.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/form/browser/editview.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -20,7 +20,6 @@
from zope.schema import getFieldNamesInOrder
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.security.checker import defineChecker, NamesChecker
-from zope.component import getAdapter
from zope.app import zapi
from zope.event import notify
@@ -63,7 +62,7 @@
self._setUpWidgets()
def _setUpWidgets(self):
- adapted = getAdapter(self.context, self.schema)
+ adapted = self.schema(self.context)
if adapted is not self.context:
if not ILocation.providedBy(adapted):
adapted = LocationProxy(adapted)
Modified: Zope3/trunk/src/zope/app/form/browser/editwizard.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/editwizard.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/form/browser/editwizard.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -16,7 +16,6 @@
$Id$
"""
-from zope.component import getAdapter
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.security.checker import defineChecker, NamesChecker
@@ -63,7 +62,7 @@
class EditWizardView(EditView):
def _setUpWidgets(self):
- adapted = getAdapter(self.context, self.schema)
+ adapted = self.schema(self.context)
if adapted is not self.context:
if not ILocation.providedBy(adapted):
adapted = LocationProxy(adapted)
Modified: Zope3/trunk/src/zope/app/form/browser/schemadisplay.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/schemadisplay.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/form/browser/schemadisplay.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -24,7 +24,6 @@
from zope.app.location import LocationProxy
from zope.app.publisher.browser import BrowserView
from zope.security.checker import defineChecker, NamesChecker
-from zope.component import getAdapter
from zope.app.form.utility import setUpDisplayWidgets
from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
@@ -49,7 +48,7 @@
self._setUpWidgets()
def _setUpWidgets(self):
- adapted = getAdapter(self.context, self.schema)
+ adapted = self.schema(self.context)
if adapted is not self.context:
if not ILocation.providedBy(adapted):
adapted = LocationProxy(adapted)
Modified: Zope3/trunk/src/zope/app/form/browser/tests/test_editview.py
===================================================================
--- Zope3/trunk/src/zope/app/form/browser/tests/test_editview.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/form/browser/tests/test_editview.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -117,7 +117,7 @@
def test_fail_wo_adapter(self):
c = Foo()
request = TestRequest()
- self.assertRaises(ComponentLookupError, EV, c, request)
+ self.assertRaises(TypeError, EV, c, request)
def test_update_no_update(self):
c = C()
Modified: Zope3/trunk/src/zope/app/fssync/committer.py
===================================================================
--- Zope3/trunk/src/zope/app/fssync/committer.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/fssync/committer.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -18,7 +18,6 @@
import os
-from zope.component import getService
from zope.configuration.name import resolve
from zope.fssync import fsutil
from zope.fssync.metadata import Metadata
@@ -26,6 +25,7 @@
from zope.proxy import removeAllProxies
from zope.xmlpickle import fromxml
+from zope.app import zapi
from zope.app.fssync import fspickle
from zope.app.container.interfaces import IContainer
from zope.app.container.interfaces import IContainer
@@ -381,8 +381,8 @@
else:
location = context
parent = None
+
# No factory; try using IFileFactory or IDirectoryFactory
- as = getService("Adapters")
isuffix = name.rfind(".")
if isuffix >= 0:
suffix = name[isuffix:]
@@ -394,9 +394,9 @@
else:
iface = IFileFactory
- factory = as.queryAdapter(location, iface, suffix)
+ factory = zapi.queryAdapter(location, iface, suffix)
if factory is None:
- factory = as.queryAdapter(location, iface)
+ factory = iface(location, None)
if iface is IDirectoryFactory:
if factory:
Modified: Zope3/trunk/src/zope/app/pagetemplate/engine.py
===================================================================
--- Zope3/trunk/src/zope/app/pagetemplate/engine.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/pagetemplate/engine.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -155,7 +155,7 @@
if namespace is None:
def namespace(object):
try:
- return zapi.getAdapter(object, IPathAdapter, name=name)
+ return zapi.getAdapter(object, IPathAdapter, name)
except ComponentLookupError:
raise KeyError, name
Modified: Zope3/trunk/src/zope/app/presentation/tests/test_presentation.py
===================================================================
--- Zope3/trunk/src/zope/app/presentation/tests/test_presentation.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/presentation/tests/test_presentation.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -468,7 +468,7 @@
# Test add event
self.folder['test'] = registration
- dependents = zapi.getAdapter(self.__template, IDependable)
+ dependents = IDependable(self.__template)
self.assert_('test' in dependents.dependents())
def test_registerRemoveSubscriber_template(self):
@@ -482,7 +482,7 @@
# Test remove event
self.folder['test'] = registration
uncontained(registration, self.folder, 'test')
- dependents = zapi.getAdapter(self.__template, IDependable)
+ dependents = IDependable(self.__template)
self.assert_('test' not in dependents.dependents())
def test_addremoveNotify_attribute(self):
Modified: Zope3/trunk/src/zope/app/security/principalregistry.py
===================================================================
--- Zope3/trunk/src/zope/app/security/principalregistry.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/security/principalregistry.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -36,7 +36,7 @@
# Methods implementing IAuthenticationService
def authenticate(self, request):
- a = zapi.queryAdapter(request, ILoginPassword)
+ a = ILoginPassword(request, None)
if a is not None:
login = a.getLogin()
if login is not None:
@@ -63,9 +63,8 @@
return self.__defaultObject
def unauthorized(self, id, request):
- # XXX This is a mess. request has no place here!
if id is None or id is self.__defaultid:
- a = zapi.getAdapter(request, ILoginPassword)
+ a = ILoginPassword(request)
a.needLogin(realm="zope")
def getPrincipal(self, id):
Modified: Zope3/trunk/src/zope/app/traversing/namespace.py
===================================================================
--- Zope3/trunk/src/zope/app/traversing/namespace.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/traversing/namespace.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -429,7 +429,7 @@
>>> tearDown()
"""
try:
- return component.getAdapter(self.context, IPathAdapter, name=name)
+ return component.getAdapter(self.context, IPathAdapter, name)
except:
raise NotFoundError(self.context, name)
Modified: Zope3/trunk/src/zope/app/uniqueid/__init__.py
===================================================================
--- Zope3/trunk/src/zope/app/uniqueid/__init__.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/uniqueid/__init__.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -59,7 +59,7 @@
return self.refs[id]()
def getId(self, ob):
- ref = zapi.getAdapter(ob, IReference)
+ ref = IReference(ob)
return self.ids[ref]
def _generateId(self):
@@ -80,7 +80,7 @@
def register(self, ob):
ob = trustedRemoveSecurityProxy(ob)
- ref = zapi.getAdapter(ob, IReference)
+ ref = IReference(ob)
if ref in self.ids:
return self.ids[ref]
uid = self._generateId()
@@ -89,7 +89,7 @@
return uid
def unregister(self, ob):
- ref = zapi.getAdapter(ob, IReference)
+ ref = IReference(ob)
uid = self.ids[ref]
del self.refs[uid]
del self.ids[ref]
@@ -105,7 +105,7 @@
def __init__(self, object):
self.object = object
if not getattr(object, '_p_oid', None):
- zapi.getAdapter(object, IConnection).add(object)
+ IConnection(object).add(object)
def __call__(self):
return self.object
Modified: Zope3/trunk/src/zope/app/workflow/browser/definition.py
===================================================================
--- Zope3/trunk/src/zope/app/workflow/browser/definition.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/app/workflow/browser/definition.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -15,7 +15,7 @@
$Id$
"""
-from zope.app import zapi
+
from zope.app.traversing.api import traverse
from zope.app.registration.interfaces import IRegistered
from zope.app.workflow.interfaces import IProcessDefinitionImportHandler
@@ -33,11 +33,8 @@
def importDefinition(self):
xml = self.request.get('definition')
if xml:
- zapi.getAdapter(
- self.context, IProcessDefinitionImportHandler, context=self
- ).doImport(xml)
+ IProcessDefinitionImportHandler(self.context).doImport(xml)
self.request.response.redirect('@@importexport.html?success=1')
def exportDefinition(self):
- return zapi.getAdapter(self.context, IProcessDefinitionExportHandler,
- context=self).doExport()
+ return IProcessDefinitionExportHandler(self.context).doExport()
Modified: Zope3/trunk/src/zope/component/__init__.py
===================================================================
--- Zope3/trunk/src/zope/component/__init__.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/component/__init__.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -67,12 +67,12 @@
# to avoid the recursion implied by using a local getAdapter call.
# We should be using the line of code below.
- ## return getAdapter(context, IServiceService, context=None)
+ ## return IServiceService(context)
#
# Instead, we need to support code that has passed in an object
# as context, at least until the whole component API is fixed up.
# XXX try ripping this code out.
- sm = queryAdapter(context, IServiceService, context=None)
+ sm = IServiceService(context, None)
if sm is None:
# Deprecated support for a context that isn't adaptable to
# IServiceService. Return the default service manager.
@@ -135,13 +135,13 @@
# Adapter service
-def getAdapter(object, interface, name='', context=None):
- adapter = queryAdapter(object, interface, name, None, context)
+def getAdapterInContext(object, interface, context):
+ adapter = queryAdapterInContext(object, interface, context)
if adapter is None:
raise ComponentLookupError(object, interface)
return adapter
-def queryAdapter(object, interface, name='', default=None, context=None):
+def queryAdapterInContext(object, interface, context, default=None):
conform = getattr(object, '__conform__', None)
if conform is not None:
try:
@@ -167,6 +167,16 @@
return object
adapters = getService(Adapters, context)
+ return adapters.queryAdapter(object, interface, '', default)
+
+def getAdapter(object, interface, name, context=None):
+ adapter = queryAdapter(object, interface, name, None, context)
+ if adapter is None:
+ raise ComponentLookupError(object, interface)
+ return adapter
+
+def queryAdapter(object, interface, name, default=None, context=None):
+ adapters = getService(Adapters, context)
return adapters.queryAdapter(object, interface, name, default)
def interfaceAdapterHook(iface, ob):
Modified: Zope3/trunk/src/zope/component/interfaces.py
===================================================================
--- Zope3/trunk/src/zope/component/interfaces.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/component/interfaces.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -106,8 +106,8 @@
# Adapter service
- def getAdapter(object, interface, context=None):
- """Get an adapter to an interface for an object
+ def getAdapter(object, interface, name, context=''):
+ """Get a named adapter to an interface for an object
Returns an adapter that can adapt object to interface. If a matching
adapter cannot be found, raises ComponentLookupError.
@@ -117,7 +117,23 @@
If 'context' is not None, context is adapted to IServiceService,
and this adapter's 'Adapters' service is used.
+ """
+ def getAdapterInContext(object, interface, context):
+ """Get a special adapter to an interface for an object
+
+ NOTE: This method should only be used if a custom context
+ needs to be provided to provide custom component
+ lookup. Otherwise, call the interface, as in::
+
+ interface(object)
+
+ Returns an adapter that can adapt object to interface. If a matching
+ adapter cannot be found, raises ComponentLookupError.
+
+ Context is adapted to IServiceService, and this adapter's
+ 'Adapters' service is used.
+
If the object has a __conform__ method, this method will be
called with the requested interface. If the method returns a
non-None value, that value will be returned. Otherwise, if the
@@ -142,8 +158,8 @@
named adapter methods with an empty string for a name.
"""
- def queryAdapter(object, interface, default=None, context=None):
- """Look for an adapter to an interface for an object
+ def queryAdapter(object, interface, name, default=None, context=None):
+ """Look for a named adapter to an interface for an object
Returns an adapter that can adapt object to interface. If a matching
adapter cannot be found, returns the default.
@@ -153,7 +169,23 @@
If 'context' is not None, context is adapted to IServiceService,
and this adapter's 'Adapters' service is used.
+ """
+ def queryAdapterInContext(object, interface, context, default=None):
+ """Look for a special adapter to an interface for an object
+
+ NOTE: This method should only be used if a custom context
+ needs to be provided to provide custom component
+ lookup. Otherwise, call the interface, as in::
+
+ interface(object, default)
+
+ Returns an adapter that can adapt object to interface. If a matching
+ adapter cannot be found, returns the default.
+
+ Context is adapted to IServiceService, and this adapter's
+ 'Adapters' service is used.
+
If the object has a __conform__ method, this method will be
called with the requested interface. If the method returns a
non-None value, that value will be returned. Otherwise, if the
@@ -451,7 +483,7 @@
class IAdapterService(Interface):
"""A service to manage Adapters."""
- def queryAdapter(object, interface, name='', default=None):
+ def queryAdapter(object, interface, name, default=None):
"""Look for a named adapter to an interface for an object
If a matching adapter cannot be found, returns the default.
@@ -461,7 +493,7 @@
named adapter methods with an empty string for a name.
"""
- def queryMultiAdapter(objects, interface, name='', default=None):
+ def queryMultiAdapter(objects, interface, name, default=None):
"""Look for a multi-adapter to an interface for an object
If a matching adapter cannot be found, returns the default.
Modified: Zope3/trunk/src/zope/component/tests/test_api.py
===================================================================
--- Zope3/trunk/src/zope/component/tests/test_api.py 2004-07-02 17:01:24 UTC (rev 26048)
+++ Zope3/trunk/src/zope/component/tests/test_api.py 2004-07-02 18:14:52 UTC (rev 26049)
@@ -17,6 +17,7 @@
from zope import component
from zope.component import servicenames
from zope.component import getAdapter, queryAdapter
+from zope.component import getAdapterInContext, queryAdapterInContext
from zope.component import getService
from zope.component import getUtility, queryUtility
from zope.component import getDefaultViewName
@@ -152,53 +153,65 @@
##self.assertRaises(ComponentLookupError,
## getService, Adapters, object())
- def testAdapter_via_conform(self):
- ob = Conforming()
+ def testAdapterInContext(self):
+ class I1(Interface):
+ pass
+ class I2(Interface):
+ pass
+ class C:
+ implements(I1)
+ def __conform__(self, iface, default=None):
+ if iface == I2:
+ return 42
+
+ ob = C()
+ servicemanager = StubServiceService()
+ context = ConformsToIServiceService(servicemanager)
+ class I3(Interface):
+ pass
+ class StubAdapterService:
+ def queryAdapter(self, ob, iface, name, default=None):
+ if iface is I3:
+ return 43
+ return default
+ servicemanager.services[Adapters] = StubAdapterService()
+
# If an object implements the interface you want to adapt to,
- # getAdapter should simply return the object.
- self.assertEquals(getAdapter(ob, I1), ob)
+ # getAdapterInContext should simply return the object.
+ self.assertEquals(getAdapterInContext(ob, I1, context), ob)
+ self.assertEquals(queryAdapterInContext(ob, I1, context), ob)
- # If an adapter isn't registered for the given object and interface,
- # and you provide no default, raise ComponentLookupError...
- self.assertRaises(ComponentLookupError, getAdapter, ob, I2)
+ # If an object conforms to the interface you want to adapt to,
+ # getAdapterInContext should simply return the conformed object.
+ self.assertEquals(getAdapterInContext(ob, I2, context), 42)
+ self.assertEquals(queryAdapterInContext(ob, I2, context), 42)
+ class I4(Interface):
+ pass
# If an adapter isn't registered for the given object and interface,
# and you provide no default, raise ComponentLookupError...
- self.assertRaises(ComponentLookupError, getAdapter, Conforming, I2)
+ self.assertRaises(ComponentLookupError,
+ getAdapterInContext, ob, I4, context)
# ...otherwise, you get the default
- self.assertEquals(queryAdapter(ob, I2, '', Test), Test)
+ self.assertEquals(queryAdapterInContext(ob, I4, context, 44), 44)
- # ...otherwise, you get the default
- self.assertEquals(queryAdapter(Conforming, I2, '', Test), Test)
+ # If you ask for an adapter for which something's registered
+ # you get the registered adapter
+ self.assertEquals(getAdapterInContext(ob, I3, context), 43)
+ self.assertEquals(queryAdapterInContext(ob, I3, context), 43)
- # ...otherwise, you get the default
- self.assertEquals(queryAdapter(Conforming, I3, '', Test), Test)
-
- getService(Adapters).register([I1], I2, '', Comp)
- c = getAdapter(ob, I2)
- self.assertEquals(c.__class__, Comp)
- self.assertEquals(c.context, ob)
-
- c = getAdapter(ob, I3)
- self.assertEquals(c.__class__, Comp)
- self.assertEquals(c.context, ob)
-
def testAdapter(self):
- # If an object implements the interface you want to adapt to,
- # getAdapter should simply return the object.
- self.assertEquals(getAdapter(ob, I1), ob)
-
# If an adapter isn't registered for the given object and interface,
# and you provide no default, raise ComponentLookupError...
- self.assertRaises(ComponentLookupError, getAdapter, ob, I2)
+ self.assertRaises(ComponentLookupError, getAdapter, ob, I2, '')
# ...otherwise, you get the default
self.assertEquals(queryAdapter(ob, I2, '', Test), Test)
getService(Adapters).register([I1], I2, '', Comp)
- c = getAdapter(ob, I2)
+ c = getAdapter(ob, I2, '')
self.assertEquals(c.__class__, Comp)
self.assertEquals(c.context, ob)
@@ -208,27 +221,6 @@
self.assertEquals(c.__class__, Comp)
self.assertEquals(c.context, ob)
- def testContextArgument(self):
- # Basically, the same tests as in testAdapter, but with the
- # 'context' argument given. As this is only testing the global
- # service, this is pretty much a no-operation.
-
- self.assertEquals(getAdapter(ob, I1, context=None), ob)
- self.assertEquals(getAdapter(ob, I1, context=ob), ob)
-
- # If an adapter isn't registered for the given object and interface,
- # and you provide no default, raise ComponentLookupError...
- self.assertRaises(ComponentLookupError, getAdapter, ob, I2,
- context=ob)
-
- # ...otherwise, you get the default
- self.assertEquals(queryAdapter(ob, I2, '', Test, context=ob), Test)
-
- getService(Adapters).register([I1], I2, '', Comp)
- c = getAdapter(ob, I2, context=ob)
- self.assertEquals(c.__class__, Comp)
- self.assertEquals(c.context, ob)
-
def testNamedAdapter(self):
self.testAdapter()
@@ -268,7 +260,7 @@
# providing an adapter for None says that your adapter can
# adapt anything to I2.
getService(Adapters).register([None], I2, '', Comp)
- c = getAdapter(ob, I2)
+ c = I2(ob)
self.assertEquals(c.__class__, Comp)
self.assertEquals(c.context, ob)
More information about the Zope3-Checkins
mailing list