[Checkins] SVN: zope.container/trunk/ Send ``IContainerModifiedEvent`` *after* the container is modified.

Marius Gedminas marius at pov.lt
Thu Jan 20 15:59:04 EST 2011


Log message for revision 119803:
  Send ``IContainerModifiedEvent`` *after* the container is modified.
  
  Fixes https://bugs.launchpad.net/zope.container/+bug/705600.
  
  

Changed:
  U   zope.container/trunk/CHANGES.txt
  U   zope.container/trunk/src/zope/container/btree.py
  U   zope.container/trunk/src/zope/container/tests/test_btree.py

-=-
Modified: zope.container/trunk/CHANGES.txt
===================================================================
--- zope.container/trunk/CHANGES.txt	2011-01-20 20:57:16 UTC (rev 119802)
+++ zope.container/trunk/CHANGES.txt	2011-01-20 20:59:03 UTC (rev 119803)
@@ -5,7 +5,10 @@
 3.12.1 (unreleased)
 -------------------
 
+- Send ``IContainerModifiedEvent`` *after* the container is modified
+  (LP#705600).
 
+
 3.12.0 (2010-12-14)
 -------------------
 

Modified: zope.container/trunk/src/zope/container/btree.py
===================================================================
--- zope.container/trunk/src/zope/container/btree.py	2011-01-20 20:57:16 UTC (rev 119802)
+++ zope.container/trunk/src/zope/container/btree.py	2011-01-20 20:59:03 UTC (rev 119803)
@@ -107,16 +107,17 @@
     def get(self, key, default=None):
         '''See interface `IReadContainer`'''
         return self._SampleContainer__data.get(key, default)
-        
+
     def __setitem__(self, key, value):
         setitem(self, self._setitemf, key, value)
 
     def __delitem__(self, key):
         # make sure our lazy property gets set
         l = self.__len
-        uncontained(self._SampleContainer__data[key], self, key)
+        item = self._SampleContainer__data[key]
         del self._SampleContainer__data[key]
         l.change(-1)
+        uncontained(item, self, key)
 
     has_key = __contains__
 

Modified: zope.container/trunk/src/zope/container/tests/test_btree.py
===================================================================
--- zope.container/trunk/src/zope/container/tests/test_btree.py	2011-01-20 20:57:16 UTC (rev 119802)
+++ zope.container/trunk/src/zope/container/tests/test_btree.py	2011-01-20 20:59:03 UTC (rev 119803)
@@ -20,6 +20,9 @@
 from zope.container.tests.test_icontainer import TestSampleContainer
 from zope.container.btree import BTreeContainer
 from zope.container.interfaces import IBTreeContainer
+from zope.container.interfaces import IContainerModifiedEvent
+from zope.container.contained import Contained
+from zope.lifecycleevent.interfaces import IObjectRemovedEvent
 
 
 class TestBTreeContainer(TestSampleContainer, TestCase):
@@ -162,10 +165,44 @@
         self.assertEqual(list(iterable), first_time)
 
 
+class TestBTreeEvents(TestCase):
+
+    def setUp(self):
+        from zope.event import subscribers
+        self._old_subscribers = subscribers[:]
+        subscribers[:] = []
+
+    def tearDown(self):
+        from zope.event import subscribers
+        subscribers[:] = self._old_subscribers
+
+    def testDeletion(self):
+        from zope.event import subscribers
+        tree = BTreeContainer()
+        item = Contained()
+        tree['42'] = item
+        events = []
+        def subscriber(event):
+            events.append(event)
+            # events should happen after the deletion, not before)
+            self.assertEqual(len(tree), 0)
+            self.assertEqual(list(tree), [])
+        subscribers.append(subscriber)
+
+        del tree['42']
+        self.assertEqual(item.__name__, None)
+        self.assertEqual(item.__parent__, None)
+
+        self.assertEqual(len(events), 2)
+        self.assertTrue(IObjectRemovedEvent.providedBy(events[0]))
+        self.assertTrue(IContainerModifiedEvent.providedBy(events[1]))
+
+
 def test_suite():
     return TestSuite((
         makeSuite(TestBTreeContainer),
         makeSuite(TestBTreeSpecials),
+        makeSuite(TestBTreeEvents),
         DocTestSuite('zope.container.btree',
                      setUp=setUp,
                      tearDown=tearDown),



More information about the checkins mailing list