[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