[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