[Checkins] SVN: zope.app.intid/trunk/ Dispatch IntId events rather than making them IObjectEvents.
Dan Korostelev
nadako at gmail.com
Thu Dec 11 09:06:12 EST 2008
Log message for revision 93901:
Dispatch IntId events rather than making them IObjectEvents.
Include utility->uid map for added int ids.
Changed:
U zope.app.intid/trunk/CHANGES.txt
U zope.app.intid/trunk/src/zope/app/intid/__init__.py
U zope.app.intid/trunk/src/zope/app/intid/interfaces.py
U zope.app.intid/trunk/src/zope/app/intid/subscribers.zcml
U zope.app.intid/trunk/src/zope/app/intid/tests.py
-=-
Modified: zope.app.intid/trunk/CHANGES.txt
===================================================================
--- zope.app.intid/trunk/CHANGES.txt 2008-12-11 12:05:12 UTC (rev 93900)
+++ zope.app.intid/trunk/CHANGES.txt 2008-12-11 14:06:11 UTC (rev 93901)
@@ -4,9 +4,11 @@
3.5.1 (unreleased)
-- Make IIntIdAddedEvent and IIntIdRemovedEvent subclass
- zope.component.interfaces.IObjectEvent to make subscribers
- for like (ISomeObject, IIntIdAddedEvent) work.
+- Make it possible to subscribe object-specific handlers
+ for IntIdAddedEvent/IntIdRemovedEvent. Use them like
+ the zope.app.container.interfaces.IObjectAddedEvent.
+- Include utility->id mapping of added ids to the
+ IntIdAddedEvent.
3.5.0 (2008-06-19)
------------------
Modified: zope.app.intid/trunk/src/zope/app/intid/__init__.py
===================================================================
--- zope.app.intid/trunk/src/zope/app/intid/__init__.py 2008-12-11 12:05:12 UTC (rev 93900)
+++ zope.app.intid/trunk/src/zope/app/intid/__init__.py 2008-12-11 14:06:11 UTC (rev 93901)
@@ -30,7 +30,7 @@
from zope.interface import implements
from zope.security.proxy import removeSecurityProxy
from zope.location.interfaces import ILocation
-from zope.component import adapter, getAllUtilitiesRegisteredFor, queryUtility
+from zope.component import adapter, getAllUtilitiesRegisteredFor, queryUtility, subscribers
from zope.component.interfaces import IFactory
from zope.app.container.interfaces import IObjectRemovedEvent
@@ -38,7 +38,7 @@
from zope.app.container.contained import Contained
from zope.app.keyreference.interfaces import IKeyReference, NotYet
-from zope.app.intid.interfaces import IIntIds
+from zope.app.intid.interfaces import IIntIds, IIntIdEvent
from zope.app.intid.interfaces import IntIdRemovedEvent
from zope.app.intid.interfaces import IntIdAddedEvent
@@ -170,8 +170,15 @@
key = IKeyReference(ob, None)
# Register only objects that adapt to key reference
if key is not None:
+ idmap = {}
for utility in utilities:
- utility.register(key)
+ idmap[utility] = utility.register(key)
# Notify the catalogs that this object was added.
- notify(IntIdAddedEvent(ob, event))
+ notify(IntIdAddedEvent(ob, event, idmap))
+ at adapter(IIntIdEvent)
+def intIdEventNotify(event):
+ """Event subscriber to dispatch IntIdEvent to interested adapters."""
+ adapters = subscribers((event.object, event), None)
+ for adapter in adapters:
+ pass # getting them does the work
Modified: zope.app.intid/trunk/src/zope/app/intid/interfaces.py
===================================================================
--- zope.app.intid/trunk/src/zope/app/intid/interfaces.py 2008-12-11 12:05:12 UTC (rev 93900)
+++ zope.app.intid/trunk/src/zope/app/intid/interfaces.py 2008-12-11 14:06:11 UTC (rev 93901)
@@ -4,7 +4,6 @@
$Id$
"""
from zope.interface import Interface, Attribute, implements
-from zope.component.interfaces import IObjectEvent
class IIntIdsQuery(Interface):
@@ -65,16 +64,22 @@
"""
-class IIntIdRemovedEvent(IObjectEvent):
+class IIntIdEvent(Interface):
+ """Generic base interface for IntId-related events"""
+
+ object = Attribute("The object related to this event")
+
+ original_event = Attribute("The ObjectEvent related to this event")
+
+
+class IIntIdRemovedEvent(IIntIdEvent):
"""A unique id will be removed
The event is published before the unique id is removed
from the utility so that the indexing objects can unindex the object.
"""
- original_event = Attribute("The IObjectRemoveEvent related to this event")
-
class IntIdRemovedEvent:
"""The event which is published before the unique id is removed
from the utility so that the catalogs can unindex the object.
@@ -87,16 +92,16 @@
self.original_event = event
-class IIntIdAddedEvent(IObjectEvent):
+class IIntIdAddedEvent(IIntIdEvent):
"""A unique id has been added
The event gets sent when an object is registered in a
unique id utility.
"""
+
+ idmap = Attribute("The dictionary that holds an (utility -> id) mapping of created ids")
- original_event = Attribute("The ObjectAddedEvent related to this event")
-
class IntIdAddedEvent:
"""The event which gets sent when an object is registered in a
unique id utility.
@@ -104,6 +109,7 @@
implements(IIntIdAddedEvent)
- def __init__(self, object, event):
+ def __init__(self, object, event, idmap=None):
self.object = object
self.original_event = event
+ self.idmap = idmap
Modified: zope.app.intid/trunk/src/zope/app/intid/subscribers.zcml
===================================================================
--- zope.app.intid/trunk/src/zope/app/intid/subscribers.zcml 2008-12-11 12:05:12 UTC (rev 93900)
+++ zope.app.intid/trunk/src/zope/app/intid/subscribers.zcml 2008-12-11 14:06:11 UTC (rev 93901)
@@ -5,5 +5,6 @@
<subscriber handler=".removeIntIdSubscriber" />
<subscriber handler=".addIntIdSubscriber" />
+ <subscriber handler=".intIdEventNotify" />
</configure>
Modified: zope.app.intid/trunk/src/zope/app/intid/tests.py
===================================================================
--- zope.app.intid/trunk/src/zope/app/intid/tests.py 2008-12-11 12:05:12 UTC (rev 93900)
+++ zope.app.intid/trunk/src/zope/app/intid/tests.py 2008-12-11 14:06:11 UTC (rev 93901)
@@ -36,7 +36,7 @@
from zope.app.testing import setup, ztapi
from zope.app.component.hooks import setSite
-from zope.app.intid import IntIds
+from zope.app.intid import IntIds, intIdEventNotify
from zope.app.intid.interfaces import IIntIds
from zope.app.intid.testing import IntIdLayer
from zope.app.keyreference.persistent import KeyReferenceToPersistent
@@ -190,6 +190,7 @@
def setUp(self):
from zope.app.folder import Folder, rootFolder
+ from zope.component import provideHandler
ReferenceSetupMixin.setUp(self)
@@ -203,6 +204,7 @@
sm1_1 = setup.createSiteManager(self.folder1_1)
self.utility1 = setup.addUtility(sm1_1, '2', IIntIds, IntIds())
+ provideHandler(intIdEventNotify)
def test_removeIntIdSubscriber(self):
from zope.app.intid import removeIntIdSubscriber
@@ -218,9 +220,10 @@
setSite(self.folder1_1)
events = []
+ objevents = []
def appendObjectEvent(obj, event):
- events.append((obj, event))
+ objevents.append((obj, event))
ztapi.subscribe([IIntIdRemovedEvent], None, events.append)
ztapi.subscribe([IFolder, IIntIdRemovedEvent], None, appendObjectEvent)
@@ -232,13 +235,15 @@
self.assertRaises(KeyError, self.utility.getObject, id)
self.assertRaises(KeyError, self.utility1.getObject, id1)
- self.assertEquals(len(events), 2)
- self.assertEquals(events[0][0], folder)
- self.assertEquals(events[0][1].object, folder)
- self.assertEquals(events[0][1].original_event.object, parent_folder)
- self.assertEquals(events[1].object, folder)
- self.assertEquals(events[1].original_event.object, parent_folder)
+ self.assertEquals(len(events), 1)
+ self.assertEquals(events[0].object, folder)
+ self.assertEquals(events[0].original_event.object, parent_folder)
+ self.assertEquals(len(objevents), 1)
+ self.assertEquals(objevents[0][0], folder)
+ self.assertEquals(objevents[0][1].object, folder)
+ self.assertEquals(objevents[0][1].original_event.object, parent_folder)
+
def test_addIntIdSubscriber(self):
from zope.app.intid import addIntIdSubscriber
from zope.app.container.contained import ObjectAddedEvent
@@ -249,9 +254,10 @@
setSite(self.folder1_1)
events = []
+ objevents = []
def appendObjectEvent(obj, event):
- events.append((obj, event))
+ objevents.append((obj, event))
ztapi.subscribe([IIntIdAddedEvent], None, events.append)
ztapi.subscribe([IFolder, IIntIdAddedEvent], None, appendObjectEvent)
@@ -264,14 +270,21 @@
id = self.utility.getId(folder)
id1 = self.utility1.getId(folder)
- self.assertEquals(len(events), 2)
- self.assertEquals(events[0][1].original_event.object, parent_folder)
- self.assertEquals(events[0][1].object, folder)
- self.assertEquals(events[0][0], folder)
- self.assertEquals(events[1].original_event.object, parent_folder)
- self.assertEquals(events[1].object, folder)
+ self.assertEquals(len(events), 1)
+ self.assertEquals(events[0].original_event.object, parent_folder)
+ self.assertEquals(events[0].object, folder)
+ self.assertEquals(len(objevents), 1)
+ self.assertEquals(objevents[0][1].original_event.object, parent_folder)
+ self.assertEquals(objevents[0][1].object, folder)
+ self.assertEquals(objevents[0][0], folder)
+ idmap = events[0].idmap
+ self.assert_(idmap is objevents[0][1].idmap)
+ self.assertEquals(len(idmap), 2)
+ self.assertEquals(idmap[self.utility], id)
+ self.assertEquals(idmap[self.utility1], id1)
+
class TestIntIds64(TestIntIds):
def createIntIds(self):
More information about the Checkins
mailing list