[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