[Checkins] SVN: zope.component/tseaver-test_cleanup/ Moar {get, query}MultiAdapter doctest to Sphinx + unittests conversion.
Tres Seaver
cvs-admin at zope.org
Mon Jun 18 18:17:19 UTC 2012
Log message for revision 126957:
Moar {get,query}MultiAdapter doctest to Sphinx + unittests conversion.
Changed:
_U zope.component/tseaver-test_cleanup/
U zope.component/tseaver-test_cleanup/docs/api.rst
U zope.component/tseaver-test_cleanup/src/zope/component/tests/test___init__.py
U zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py
-=-
Modified: zope.component/tseaver-test_cleanup/docs/api.rst
===================================================================
--- zope.component/tseaver-test_cleanup/docs/api.rst 2012-06-18 18:17:11 UTC (rev 126956)
+++ zope.component/tseaver-test_cleanup/docs/api.rst 2012-06-18 18:17:15 UTC (rev 126957)
@@ -586,7 +586,7 @@
True
Invoking an Interface to Perform Adapter Lookup
-===============================================
+###############################################
:mod:`zope.component` registers an adapter hook with
:mod:`zope.interface.interface`, allowing a convenient spelling for
@@ -618,16 +618,99 @@
>>> adapted is marker
True
+Looking Up Adapters Using Multiple Objects
+##########################################
+
.. autofunction:: zope.component.getMultiAdapter
.. autofunction:: zope.component.queryMultiAdapter
+Multi-adapters adapt one or more objects to another interface. To make
+this demonstration non-trivial, we need to create a second object to be
+adapted:
+
+.. doctest::
+
+ >>> from zope.component.tests.test_doctests import Ob2
+ >>> ob2 = Ob2()
+
+As with regular adapters, if an adapter isn't registered for the given
+objects and interface, the :func:`~zope.component.getMultiAdapter` API
+raises `ComponentLookupError`:
+
+.. doctest::
+
+ >>> from zope.component import getMultiAdapter
+ >>> getMultiAdapter((ob, ob2), I3)
+ Traceback (most recent call last):
+ ...
+ ComponentLookupError:
+ ((<instance Ob>, <instance Ob2>),
+ <InterfaceClass zope.component.tests.test_doctests.I3>,
+ u'')
+
+while the :func:`~zope.component.queryMultiAdapter` API returns the default:
+
+.. doctest::
+
+ >>> from zope.component import queryMultiAdapter
+ >>> queryMultiAdapter((ob, ob2), I3, default='<default>')
+ '<default>'
+
+Note that ``name`` is not a required attribute here.
+
+To test multi-adapters, we also have to create an adapter class that
+handles to context objects:
+
+.. doctest::
+
+ >>> from zope.interface import implementer
+ >>> @implementer(I3)
+ ... class DoubleAdapter(object):
+ ... def __init__(self, first, second):
+ ... self.first = first
+ ... self.second = second
+
+Now we can register the multi-adapter:
+
+.. doctest::
+
+ >>> from zope.component import getGlobalSiteManager
+ >>> getGlobalSiteManager().registerAdapter(DoubleAdapter, (I1, I2), I3, '')
+
+Notice how the required interfaces are simply provided by a tuple.
+
+Now we can get the adapter:
+
+.. doctest::
+
+ >>> adapter = getMultiAdapter((ob, ob2), I3)
+ >>> adapter.__class__ is DoubleAdapter
+ True
+ >>> adapter.first is ob
+ True
+ >>> adapter.second is ob2
+ True
+
+
+Finding More Than One Adapter
+#############################
+
.. autofunction:: zope.component.getAdapters
+Subscription Adapters
+#####################
+
.. autofunction:: zope.component.subscribers
+Event handlers
+##############
+
.. autofunction:: zope.component.handle
+Helpers for Declaring / Testing Adapters
+########################################
+
.. autofunction:: zope.component.adapter
.. autofunction:: zope.component.adaptedBy
Modified: zope.component/tseaver-test_cleanup/src/zope/component/tests/test___init__.py
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/tests/test___init__.py 2012-06-18 18:17:11 UTC (rev 126956)
+++ zope.component/tseaver-test_cleanup/src/zope/component/tests/test___init__.py 2012-06-18 18:17:15 UTC (rev 126957)
@@ -307,7 +307,7 @@
class IFoo(Interface):
pass
self.assertRaises(ComponentLookupError,
- getAdapterInContext, object, IFoo, context=None)
+ getAdapterInContext, object(), IFoo, context=None)
def test_getAdapterInContext_hit_via_sm(self):
from zope.interface import Interface
@@ -350,7 +350,7 @@
class IFoo(Interface):
pass
self.assertEqual(
- queryAdapterInContext(object, IFoo, context=None), None)
+ queryAdapterInContext(object(), IFoo, context=None), None)
def test_queryAdapterInContext_w_object_conforming(self):
from zope.interface import Interface
@@ -411,7 +411,8 @@
from zope.component.interfaces import ComponentLookupError
class IFoo(Interface):
pass
- self.assertRaises(ComponentLookupError, getAdapter, object, IFoo, '')
+ self.assertRaises(ComponentLookupError,
+ getAdapter, object(), IFoo, '')
def test_getAdapter_named_nonesuch(self):
from zope.interface import Interface
@@ -419,7 +420,8 @@
from zope.component.interfaces import ComponentLookupError
class IFoo(Interface):
pass
- self.assertRaises(ComponentLookupError, getAdapter, object, IFoo, 'bar')
+ self.assertRaises(ComponentLookupError,
+ getAdapter, object(), IFoo, 'bar')
def test_getAdapter_anonymous_hit(self):
from zope.interface import Interface
@@ -593,7 +595,204 @@
self.assertTrue(adapted.__class__ is Baz)
self.assertTrue(adapted.context is bar)
+ def test_getMultiAdapter_anonymous_nonesuch(self):
+ from zope.interface import Interface
+ from zope.component import getMultiAdapter
+ from zope.component.interfaces import ComponentLookupError
+ class IFoo(Interface):
+ pass
+ self.assertRaises(ComponentLookupError,
+ getMultiAdapter, (object(), object()), IFoo, '')
+ def test_getMultiAdapter_named_nonesuch(self):
+ from zope.interface import Interface
+ from zope.component import getMultiAdapter
+ from zope.component.interfaces import ComponentLookupError
+ class IFoo(Interface):
+ pass
+ self.assertRaises(ComponentLookupError,
+ getMultiAdapter, (object(), object()), IFoo, 'bar')
+
+ def test_getMultiAdapter_anonymous_hit(self):
+ from zope.interface import Interface
+ from zope.interface import implementer
+ from zope.component import getGlobalSiteManager
+ from zope.component import getMultiAdapter
+ class IFoo(Interface):
+ pass
+ class IBar(Interface):
+ pass
+ class IBaz(Interface):
+ pass
+ @implementer(IBar)
+ class Bar(object):
+ pass
+ @implementer(IBaz)
+ class Baz(object):
+ pass
+ @implementer(IFoo)
+ class FooAdapter(object):
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+ getGlobalSiteManager().registerAdapter(
+ FooAdapter, (IBar, IBaz), IFoo, '')
+ bar = Bar()
+ baz = Baz()
+ adapted = getMultiAdapter((bar, baz), IFoo, '')
+ self.assertTrue(adapted.__class__ is FooAdapter)
+ self.assertTrue(adapted.first is bar)
+ self.assertTrue(adapted.second is baz)
+
+ def test_getMultiAdapter_named_hit(self):
+ from zope.interface import Interface
+ from zope.interface import implementer
+ from zope.component import getMultiAdapter
+ from zope.component import getGlobalSiteManager
+ class IFoo(Interface):
+ pass
+ class IBar(Interface):
+ pass
+ class IBaz(Interface):
+ pass
+ @implementer(IBar)
+ class Bar(object):
+ pass
+ @implementer(IBaz)
+ class Baz(object):
+ pass
+ @implementer(IFoo)
+ class FooAdapter(object):
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+ getGlobalSiteManager().registerAdapter(
+ FooAdapter, (IBar, IBaz), IFoo, 'named')
+ bar = Bar()
+ baz = Baz()
+ adapted = getMultiAdapter((bar, baz), IFoo, 'named')
+ self.assertTrue(adapted.__class__ is FooAdapter)
+ self.assertTrue(adapted.first is bar)
+ self.assertTrue(adapted.second is baz)
+
+ def test_queryMultiAdapter_anonymous_nonesuch(self):
+ from zope.interface import Interface
+ from zope.component import queryMultiAdapter
+ class IFoo(Interface):
+ pass
+ self.assertEqual(queryMultiAdapter((object(), object()), IFoo, '',
+ '<default>'),
+ '<default>')
+
+ def test_queryMultiAdapter_named_nonesuch(self):
+ from zope.interface import Interface
+ from zope.component import queryMultiAdapter
+ class IFoo(Interface):
+ pass
+ self.assertEqual(queryMultiAdapter((object(), object()), IFoo, 'bar'),
+ None)
+
+ def test_queryMultiAdapter_anonymous_hit(self):
+ from zope.interface import Interface
+ from zope.interface import implementer
+ from zope.component import getGlobalSiteManager
+ from zope.component import queryMultiAdapter
+ class IFoo(Interface):
+ pass
+ class IBar(Interface):
+ pass
+ class IBaz(Interface):
+ pass
+ @implementer(IBar)
+ class Bar(object):
+ pass
+ @implementer(IBaz)
+ class Baz(object):
+ pass
+ @implementer(IFoo)
+ class FooAdapter(object):
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+ getGlobalSiteManager().registerAdapter(
+ FooAdapter, (IBar, IBaz), IFoo, '')
+ bar = Bar()
+ baz = Baz()
+ adapted = queryMultiAdapter((bar, baz), IFoo, '')
+ self.assertTrue(adapted.__class__ is FooAdapter)
+ self.assertTrue(adapted.first is bar)
+ self.assertTrue(adapted.second is baz)
+
+ def test_queryMultiAdapter_named_hit(self):
+ from zope.interface import Interface
+ from zope.interface import implementer
+ from zope.component import getGlobalSiteManager
+ from zope.component import queryMultiAdapter
+ class IFoo(Interface):
+ pass
+ class IBar(Interface):
+ pass
+ class IBaz(Interface):
+ pass
+ @implementer(IBar)
+ class Bar(object):
+ pass
+ @implementer(IBaz)
+ class Baz(object):
+ pass
+ @implementer(IFoo)
+ class FooAdapter(object):
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+ getGlobalSiteManager().registerAdapter(
+ FooAdapter, (IBar, IBaz), IFoo, 'named')
+ bar = Bar()
+ baz = Baz()
+ adapted = queryMultiAdapter((bar, baz), IFoo, 'named')
+ self.assertTrue(adapted.__class__ is FooAdapter)
+ self.assertTrue(adapted.first is bar)
+ self.assertTrue(adapted.second is baz)
+
+ def test_queryMultiAdapter_nested(self):
+ from zope.interface import Interface
+ from zope.interface import implementer
+ from zope.interface.registry import Components
+ from zope.component import getGlobalSiteManager
+ from zope.component import queryMultiAdapter
+ from zope.component.tests.test_doctests \
+ import ConformsToIComponentLookup
+ class IFoo(Interface):
+ pass
+ class IBar(Interface):
+ pass
+ class IBaz(Interface):
+ pass
+ @implementer(IBar)
+ class Bar(object):
+ pass
+ @implementer(IBaz)
+ class Baz(object):
+ pass
+ @implementer(IFoo)
+ class Global(object):
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+ @implementer(IFoo)
+ class Local(object):
+ def __init__(self, first, second):
+ self.first, self.second = first, second
+ class Context(ConformsToIComponentLookup):
+ def __init__(self, sm):
+ self.sitemanager = sm
+ gsm = getGlobalSiteManager()
+ gsm.registerAdapter(Global, (IBar, IBaz), IFoo, '')
+ sm1 = Components('sm1', bases=(gsm, ))
+ sm1.registerAdapter(Local, (IBar, IBaz), IFoo, '')
+ bar = Bar()
+ baz = Baz()
+ adapted = queryMultiAdapter((bar, baz), IFoo, '', context=Context(sm1))
+ self.assertTrue(adapted.__class__ is Local)
+ self.assertTrue(adapted.first is bar)
+ self.assertTrue(adapted.second is baz)
+
+
IMyUtility = None
def _makeMyUtility(name, sm):
global IMyUtility
Modified: zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py
===================================================================
--- zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py 2012-06-18 18:17:11 UTC (rev 126956)
+++ zope.component/tseaver-test_cleanup/src/zope/component/tests/test_doctests.py 2012-06-18 18:17:15 UTC (rev 126957)
@@ -165,64 +165,6 @@
if interface is IComponentLookup:
return self.sitemanager
-def testMultiAdapter():
- """Adapting a combination of 2 objects to an interface
-
- Multi-adapters adapt one or more objects to another interface. To make
- this demonstration non-trivial, we need to create a second object to be
- adapted:
-
- >>> from zope.component.testing import setUp, tearDown
- >>> setUp()
- >>> ob2 = Ob2()
-
- Like for regular adapters, if an adapter isn't registered for the given
- objects and interface, and you provide no default, raise
- `ComponentLookupError`...
-
- >>> component.getMultiAdapter((ob, ob2), I3) \\
- ... #doctest: +NORMALIZE_WHITESPACE
- Traceback (most recent call last):
- ...
- ComponentLookupError:
- ((<instance Ob>, <instance Ob2>),
- <InterfaceClass zope.component.tests.test_doctests.I3>,
- u'')
-
- ...otherwise, you get the default
-
- >>> component.queryMultiAdapter((ob, ob2), I3, default='<default>')
- '<default>'
-
- Note that the name is not a required attribute here.
-
- To test multi-adapters, we also have to create an adapter class that
- handles to context objects:
-
- >>> class DoubleAdapter(object):
- ... interface.implements(I3)
- ... def __init__(self, first, second):
- ... self.first = first
- ... self.second = second
-
- Now we can register the multi-adapter using
-
- >>> component.getGlobalSiteManager().registerAdapter(
- ... DoubleAdapter, (I1, I2), I3, '')
-
- Notice how the required interfaces are simply provided by a tuple. Now we
- can get the adapter:
-
- >>> adapter = component.getMultiAdapter((ob, ob2), I3)
- >>> adapter.__class__ is DoubleAdapter
- True
- >>> adapter.first is ob
- True
- >>> adapter.second is ob2
- True
- >>> tearDown()
- """
-
def testAdapterForInterfaceNone():
"""Providing an adapter for None says that your adapter can adapt anything
to `I2`.
More information about the checkins
mailing list