[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