[Checkins] SVN: z3c.discriminator/trunk/z3c/discriminator/
Discriminator is now a shadow copy of the discriminated
interface; this will allow for better generalization.
Malthe Borch
mborch at gmail.com
Sun Nov 25 12:29:08 EST 2007
Log message for revision 81984:
Discriminator is now a shadow copy of the discriminated interface; this will allow for better generalization.
Changed:
U z3c.discriminator/trunk/z3c/discriminator/README.txt
U z3c.discriminator/trunk/z3c/discriminator/__init__.py
U z3c.discriminator/trunk/z3c/discriminator/tests.py
U z3c.discriminator/trunk/z3c/discriminator/zcml.py
-=-
Modified: z3c.discriminator/trunk/z3c/discriminator/README.txt
===================================================================
--- z3c.discriminator/trunk/z3c/discriminator/README.txt 2007-11-25 09:42:41 UTC (rev 81983)
+++ z3c.discriminator/trunk/z3c/discriminator/README.txt 2007-11-25 17:29:08 UTC (rev 81984)
@@ -21,6 +21,9 @@
>>> class Bar(object):
... interface.implements(IBar)
+ >>> foo = Foo()
+ >>> bar = Bar()
+
Let's say we want to register an adapter for IFoo that also discriminates
on IBar.
@@ -35,13 +38,18 @@
>>> from z3c.discriminator import discriminator
>>> from z3c.discriminator import provideAdapter
+Let's look at the properties of a discriminator.
+
+ >>> discriminator(IFoo).providedBy(foo)
+ True
+
+We designate that IBar is a discriminator by wrapping it using the
+``discriminator`` method:
+
>>> provideAdapter(give_me_foo, (IFoo, discriminator(IBar)), IFoo)
Let's look up the adapter with the proper arguments.
- >>> foo = Foo()
- >>> bar = Bar()
-
>>> from zope import component
>>> component.getMultiAdapter((foo, bar), IFoo)
<Foo object at ...>
Modified: z3c.discriminator/trunk/z3c/discriminator/__init__.py
===================================================================
--- z3c.discriminator/trunk/z3c/discriminator/__init__.py 2007-11-25 09:42:41 UTC (rev 81983)
+++ z3c.discriminator/trunk/z3c/discriminator/__init__.py 2007-11-25 17:29:08 UTC (rev 81984)
@@ -1,22 +1,22 @@
from zope import interface
from zope import component
-class discriminator(object):
- interface.implements(interface.interfaces.ISpecification,
- interface.interfaces.IInterface)
-
- def __init__(self, iface):
- self.iface = iface
- self.__name__ = iface.__name__
- interface.alsoProvides(self, iface)
+def discriminator(iface):
+ class _(iface):
+ pass
+
+ _.__discriminated__ = iface
+ _.providedBy = iface.providedBy
+ return _
+
def provideAdapter(factory, adapts=None, provides=None, name=''):
def _factory(*args):
_ = [provided for (provided, implemented) in zip(args, adapts)
- if not isinstance(implemented, discriminator)]
+ if not hasattr(implemented, '__discriminated__')]
return factory(*_)
# unwrap discriminators
- _adapts = [isinstance(a, discriminator) and a.iface or a for a in adapts]
+ _adapts = [getattr(a, '__discriminated__', a) for a in adapts]
component.provideAdapter(_factory, _adapts, provides, name)
Modified: z3c.discriminator/trunk/z3c/discriminator/tests.py
===================================================================
--- z3c.discriminator/trunk/z3c/discriminator/tests.py 2007-11-25 09:42:41 UTC (rev 81983)
+++ z3c.discriminator/trunk/z3c/discriminator/tests.py 2007-11-25 17:29:08 UTC (rev 81984)
@@ -1,7 +1,8 @@
from zope.testing import doctest
import unittest
-OPTIONFLAGS = (doctest.ELLIPSIS |
+OPTIONFLAGS = (doctest.REPORT_ONLY_FIRST_FAILURE |
+ doctest.ELLIPSIS |
doctest.NORMALIZE_WHITESPACE)
import zope.component
Modified: z3c.discriminator/trunk/z3c/discriminator/zcml.py
===================================================================
--- z3c.discriminator/trunk/z3c/discriminator/zcml.py 2007-11-25 09:42:41 UTC (rev 81983)
+++ z3c.discriminator/trunk/z3c/discriminator/zcml.py 2007-11-25 17:29:08 UTC (rev 81984)
@@ -33,10 +33,10 @@
@zope.interface.implementer(zope.interface.implementedBy(factory))
def _factory(*args):
_ = [provided for (provided, implemented) in zip(args, for_)
- if not isinstance(implemented, discriminator)]
+ if not hasattr(implemented, '__discriminated__')]
return factory(*_)
# unwrap discriminators
- adapts = [isinstance(a, discriminator) and a.iface or a for a in for_]
+ adapts = [getattr(a, '__discriminated__', a) for a in for_]
zope.component.zcml.adapter(_context, [_factory], provides=provides, for_=adapts, **kwargs)
More information about the Checkins
mailing list