[Checkins] SVN: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/ Start to add some tests on the subscriber story.

Sylvain Viollon sylvain at infrae.com
Wed Jan 26 05:37:11 EST 2011


Log message for revision 119942:
  Start to add some tests on the subscriber story.
  

Changed:
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/__init__.py
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/multisubscribers.py
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_multisubscribers.py
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_subscribers.py
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers.py
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_context.py
  A   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_interface.py
  U   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/test_grok.py
  U   grokcore.component/branches/sylvain-subscribers/src/grokcore/component/util.py

-=-
Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/__init__.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/__init__.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/__init__.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1 @@
+# this is a package


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/__init__.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/multisubscribers.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/multisubscribers.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/multisubscribers.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1,97 @@
+"""
+  >>> grok.testing.grok(__name__)
+
+  >>> cave = Cave('Tilburg cave')
+  >>> martijn = Mammoth('Martijn')
+
+  You can query a subscribers using multiple components. You will get
+  all subscribers registered for office and cave (since office is a
+  base class of cave):
+
+  >>> subscribers = grok.querySubscribers((cave, martijn), IActivity)
+  >>> subscribers
+  [<grokcore.component.tests.subscriber.multisubscribers.Sleep object at ...>,
+   <grokcore.component.tests.subscriber.multisubscribers.Food object at ...>,
+   <grokcore.component.tests.subscriber.multisubscribers.WritingCode object at ...>]
+
+  >>> _ = map(lambda s: s.do(), subscribers)
+  Martijn is sleeping at Tilburg cave.
+  Martijn is feeding himself at Tilburg cave.
+  Martijn is writing code at Tilburg cave!
+
+
+  Now, Martijn goes to the office. You will only get subscribers
+  registered for office:
+
+  >>> office = Office('Grok corp(r)(tm) headquarters')
+  >>> office_subscribers = grok.querySubscribers((office, martijn), IActivity)
+  >>> office_subscribers
+  [<grokcore.component.tests.subscriber.multisubscribers.Sleep object at ...>]
+
+  >>> _ = map(lambda s: s.do(), office_subscribers)
+  Martijn is sleeping at Grok corp(r)(tm) headquarters.
+
+"""
+
+import grokcore.component as grok
+from zope import interface
+
+
+class Office(grok.Context):
+
+    def __init__(self, name):
+        self.name = name
+
+
+# All caves are a kind of office.
+class Cave(Office):
+    pass
+
+
+class Mammoth(grok.Context):
+
+    def __init__(self, name):
+        self.name = name
+
+
+class IActivity(interface.Interface):
+
+    def do():
+        """Do something.
+        """
+
+class Sleep(grok.MultiSubscriber):
+    grok.implements(IActivity)
+    grok.adapts(Office, Mammoth)
+
+    def __init__(self, where, who):
+        self.where = where
+        self.who = who
+
+    def do(self):
+        print '%s is sleeping at %s.' % (self.who.name, self.where.name)
+
+
+class DayTimeActivity(grok.MultiSubscriber):
+    grok.implements(IActivity)
+    grok.adapts(Cave, Mammoth)
+    grok.baseclass()
+
+    def __init__(self, where, who):
+        self.where = where
+        self.who = who
+
+    def do(self):
+        print 'nothing'
+
+
+class Food(DayTimeActivity):
+
+    def do(self):
+        print '%s is feeding himself at %s.' % (self.who.name, self.where.name)
+
+
+class WritingCode(DayTimeActivity):
+
+    def do(self):
+        print '%s is writing code at %s!' % (self.who.name, self.where.name)


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/multisubscribers.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_multisubscribers.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_multisubscribers.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_multisubscribers.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1,77 @@
+"""
+  >>> grok.testing.grok(__name__)
+
+  >>> cave = Cave('Tilburg cave')
+  >>> martijn = Mammoth('Martijn')
+
+  You can query a subscribers using multiple components and sort them
+  using `grok.order` information:
+
+  >>> subscribers = grok.queryOrderedSubscribers((cave, martijn), IActivity)
+  >>> subscribers
+  [<grokcore.component.tests.subscriber.ordered_multisubscribers.Cooking object at ...>,
+   <grokcore.component.tests.subscriber.ordered_multisubscribers.Gardening object at ...>,
+   <grokcore.component.tests.subscriber.ordered_multisubscribers.Cleaning object at ...>]
+
+  >>> _ = map(lambda a: a.do(), subscribers)
+  Martijn is cooking in Tilburg cave!
+  Martijn is growing pumpkins in Tilburg cave!
+  Martijn is cleaning the Tilburg cave.
+
+"""
+
+import grokcore.component as grok
+from zope import interface
+
+
+class Cave(grok.Context):
+
+    def __init__(self, name):
+        self.name = name
+
+
+class Mammoth(grok.Context):
+
+    def __init__(self, name):
+        self.name = name
+
+
+class IActivity(interface.Interface):
+
+    def do():
+        """Do something.
+        """
+
+
+class DayTimeActivity(grok.MultiSubscriber):
+    grok.provides(IActivity)
+    grok.adapts(Cave, Mammoth)
+    grok.baseclass()
+
+    def __init__(self, where, who):
+        self.where = where
+        self.who = who
+
+    def do(self):
+        print 'Doing nothing.'
+
+
+class Cleaning(DayTimeActivity):
+    grok.order(99)
+
+    def do(self):
+        print '%s is cleaning the %s.' % (self.who.name, self.where.name)
+
+
+class Cooking(DayTimeActivity):
+    grok.order(10)
+
+    def do(self):
+        print '%s is cooking in %s!' % (self.who.name, self.where.name)
+
+
+class Gardening(DayTimeActivity):
+    grok.order(15)
+
+    def do(self):
+        print '%s is growing pumpkins in %s!' % (self.who.name, self.where.name)


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_multisubscribers.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_subscribers.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_subscribers.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_subscribers.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1,71 @@
+"""
+  >>> grok.testing.grok(__name__)
+
+  >>> cave = Cave()
+
+  You can query the subscribers and sort them with the information
+  provided by grok.order:
+
+  >>> ordered_subscribers = grok.queryOrderedSubscribers((cave,), ICleaner)
+  >>> ordered_subscribers
+  [<grokcore.component.tests.subscriber.ordered_subscribers.MondayCleaner object at ...>,
+   <grokcore.component.tests.subscriber.ordered_subscribers.WednesdayCleaner object at ...>,
+   <grokcore.component.tests.subscriber.ordered_subscribers.SaturdayCleaner object at ...>]
+
+  >>> _ = map(lambda s: s.work(), ordered_subscribers)
+  Monday cleaning!
+  Wednesday cleaning!
+  Saturday cleaning!
+
+  If you use the regular query method, they won't be sorted:
+
+  >>> subscribers = grok.querySubscribers((cave,), ICleaner)
+  >>> subscribers
+  [<grokcore.component.tests.subscriber.ordered_subscribers.MondayCleaner object at ...>,
+   <grokcore.component.tests.subscriber.ordered_subscribers.SaturdayCleaner object at ...>,
+   <grokcore.component.tests.subscriber.ordered_subscribers.WednesdayCleaner object at ...>]
+
+  >>> _ = map(lambda s: s.work(), subscribers)
+  Monday cleaning!
+  Saturday cleaning!
+  Wednesday cleaning!
+
+"""
+
+import grokcore.component as grok
+from zope import interface
+
+
+class Cave(grok.Context):
+    pass
+
+
+class ICleaner(interface.Interface):
+
+    def work():
+        """Clean that cave.
+        """
+
+class MondayCleaner(grok.Subscriber):
+    grok.implements(ICleaner)
+    grok.order(1)
+
+    def work(self):
+        print 'Monday cleaning!'
+
+
+class WednesdayCleaner(grok.Subscriber):
+    grok.implements(ICleaner)
+    grok.order(3)
+
+    def work(self):
+        print 'Wednesday cleaning!'
+
+
+class SaturdayCleaner(grok.Subscriber):
+    grok.implements(ICleaner)
+    grok.order(6)
+
+    def work(self):
+        print 'Saturday cleaning!'
+


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/ordered_subscribers.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1,54 @@
+"""
+  >>> grok.testing.grok(__name__)
+
+  >>> cave = Cave('sweet home')
+
+  >>> subscribers = grok.querySubscribers((cave,), ICleaner)
+  >>> subscribers
+  [<grokcore.component.tests.subscriber.subscribers.MondayCleaner object at ...>,
+   <grokcore.component.tests.subscriber.subscribers.SaturdayCleaner object at ...>,
+   <grokcore.component.tests.subscriber.subscribers.WednesdayCleaner object at ...>]
+
+  >>> _ = map(lambda s: s.work(), subscribers)
+  Monday cleaning sweet home!
+  Saturday cleaning sweet home!
+  Wednesday cleaning sweet home!
+
+"""
+
+import grokcore.component as grok
+from zope import interface
+
+
+class Cave(grok.Context):
+
+    def __init__(self, name):
+        self.name = name
+
+
+class ICleaner(interface.Interface):
+
+    def work():
+        """Clean that cave.
+        """
+
+class MondayCleaner(grok.Subscriber):
+    grok.implements(ICleaner)
+
+    def work(self):
+        print 'Monday cleaning %s!' % self.context.name
+
+
+class WednesdayCleaner(grok.Subscriber):
+    grok.provides(ICleaner)
+
+    def work(self):
+        print 'Wednesday cleaning %s!' % self.context.name
+
+
+class SaturdayCleaner(grok.Subscriber):
+    grok.implements(ICleaner)
+
+    def work(self):
+        print 'Saturday cleaning %s!' % self.context.name
+


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_context.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_context.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_context.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1,20 @@
+"""
+  >>> grok.testing.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  GrokError: No module-level context for
+  <class 'grokcore.component.tests.subscriber.subscribers_no_context.CaveProcessor'>,
+  please use the 'context' directive.
+
+"""
+
+import grokcore.component as grok
+from zope import interface
+
+class ITask(interface.Interface):
+
+    def finish():
+        pass
+
+class CaveProcessor(grok.Subscriber):
+    grok.provides(ITask)


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_context.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_interface.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_interface.py	                        (rev 0)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_interface.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -0,0 +1,17 @@
+"""
+  >>> grok.testing.grok(__name__)
+  Traceback (most recent call last):
+    ...
+  GrokError: <class 'grokcore.component.tests.subscriber.subscribers_no_interface.CaveProcessor'>
+  must implement at least one interface (use grok.implements to specify).
+
+"""
+
+import grokcore.component as grok
+
+
+class Cave(grok.Context):
+    pass
+
+class CaveProcessor(grok.Subscriber):
+    pass


Property changes on: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/subscriber/subscribers_no_interface.py
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Modified: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/test_grok.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/test_grok.py	2011-01-26 02:49:11 UTC (rev 119941)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/tests/test_grok.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -39,7 +39,7 @@
                                         checker=checker,
                                         optionflags=doctest.ELLIPSIS+
                                         doctest.NORMALIZE_WHITESPACE)
-        except ImportError, e:  # or should this accept anything?
+        except ImportError:  # or should this accept anything?
             traceback.print_exc()
             raise
         suite.addTest(test)
@@ -48,7 +48,7 @@
 def test_suite():
     suite = unittest.TestSuite()
     for name in ['adapter', 'directive', 'grokker', 'utility', 'view',
-                 'event', 'inherit', 'order']:
+                 'event', 'inherit', 'order', 'subscriber']:
         suite.addTest(suiteFromPackage(name))
 
     api = doctest.DocFileSuite('api.txt')

Modified: grokcore.component/branches/sylvain-subscribers/src/grokcore/component/util.py
===================================================================
--- grokcore.component/branches/sylvain-subscribers/src/grokcore/component/util.py	2011-01-26 02:49:11 UTC (rev 119941)
+++ grokcore.component/branches/sylvain-subscribers/src/grokcore/component/util.py	2011-01-26 10:37:10 UTC (rev 119942)
@@ -26,10 +26,18 @@
 
 
 def sort_components(components):
+    """Sort a list of components using the information provided by
+    `grok.order`.
+    """
     return sorted(components, key=_sort_key)
 
 
-def queryOrderedSubscribers(objects, interface):
-    return sort_components(component.subscribers(objects, interface))
+def queryOrderedSubscribers(components, interface):
+    return sort_components(component.subscribers(components, interface))
 
-querySubscribers = component.subscribers
+
+def querySubscribers(components, interface):
+    """Query a list of subscribers on `component` which implements
+    `interface`
+    """
+    return component.subscribers(components, interface)



More information about the checkins mailing list