Commit 14068feb authored by Marius Gedminas's avatar Marius Gedminas

Send ``IContainerModifiedEvent`` *after* the container is modified.

Fixes https://bugs.launchpad.net/zope.container/+bug/705600.
parent 6e08c630
...@@ -5,6 +5,9 @@ CHANGES ...@@ -5,6 +5,9 @@ CHANGES
3.12.1 (unreleased) 3.12.1 (unreleased)
------------------- -------------------
- Send ``IContainerModifiedEvent`` *after* the container is modified
(LP#705600).
3.12.0 (2010-12-14) 3.12.0 (2010-12-14)
------------------- -------------------
......
...@@ -107,16 +107,17 @@ class BTreeContainer(Contained, Persistent): ...@@ -107,16 +107,17 @@ class BTreeContainer(Contained, Persistent):
def get(self, key, default=None): def get(self, key, default=None):
'''See interface `IReadContainer`''' '''See interface `IReadContainer`'''
return self._SampleContainer__data.get(key, default) return self._SampleContainer__data.get(key, default)
def __setitem__(self, key, value): def __setitem__(self, key, value):
setitem(self, self._setitemf, key, value) setitem(self, self._setitemf, key, value)
def __delitem__(self, key): def __delitem__(self, key):
# make sure our lazy property gets set # make sure our lazy property gets set
l = self.__len l = self.__len
uncontained(self._SampleContainer__data[key], self, key) item = self._SampleContainer__data[key]
del self._SampleContainer__data[key] del self._SampleContainer__data[key]
l.change(-1) l.change(-1)
uncontained(item, self, key)
has_key = __contains__ has_key = __contains__
......
...@@ -20,6 +20,9 @@ from zope.component.testing import setUp, tearDown ...@@ -20,6 +20,9 @@ from zope.component.testing import setUp, tearDown
from zope.container.tests.test_icontainer import TestSampleContainer from zope.container.tests.test_icontainer import TestSampleContainer
from zope.container.btree import BTreeContainer from zope.container.btree import BTreeContainer
from zope.container.interfaces import IBTreeContainer 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): class TestBTreeContainer(TestSampleContainer, TestCase):
...@@ -162,10 +165,44 @@ class TestBTreeSpecials(TestCase): ...@@ -162,10 +165,44 @@ class TestBTreeSpecials(TestCase):
self.assertEqual(list(iterable), first_time) 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(): def test_suite():
return TestSuite(( return TestSuite((
makeSuite(TestBTreeContainer), makeSuite(TestBTreeContainer),
makeSuite(TestBTreeSpecials), makeSuite(TestBTreeSpecials),
makeSuite(TestBTreeEvents),
DocTestSuite('zope.container.btree', DocTestSuite('zope.container.btree',
setUp=setUp, setUp=setUp,
tearDown=tearDown), tearDown=tearDown),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment