Commit 42a9ca9f authored by Stephan Richter's avatar Stephan Richter

Merge pull request #2 from NextThought/master

Restore ``Folder`` pickle forward/backward compatibility with 3.12.0. Fixes #1
parents 88e2eeea 672237d8
...@@ -5,7 +5,8 @@ CHANGES ...@@ -5,7 +5,8 @@ CHANGES
4.0.0a3 (unreleased) 4.0.0a3 (unreleased)
-------------------- --------------------
- Nothing changed yet. - Restore ``Folder`` pickle forward/backward compatibility with
version 3.12.0 after making it inherit from ``BTreeContainer.``
4.0.0a2 (2013-02-21) 4.0.0a2 (2013-02-21)
......
...@@ -21,8 +21,8 @@ from zope.container import btree, interfaces ...@@ -21,8 +21,8 @@ from zope.container import btree, interfaces
class Folder(btree.BTreeContainer): class Folder(btree.BTreeContainer):
"""The standard Zope Folder implementation.""" """The standard Zope Folder implementation."""
# BBB: The data attribute used to be exposed. This should make it also # BBB: The data attribute used to be exposed.
# compatible with old pickles. # For compatibility with existing pickles, we read and write that name
@property @property
def data(self): def data(self):
return self._SampleContainer__data return self._SampleContainer__data
...@@ -30,3 +30,14 @@ class Folder(btree.BTreeContainer): ...@@ -30,3 +30,14 @@ class Folder(btree.BTreeContainer):
@data.setter @data.setter
def data(self, value): def data(self, value):
self._SampleContainer__data = value self._SampleContainer__data = value
def __getstate__(self):
state = super(Folder, self).__getstate__()
data = state.pop('_SampleContainer__data')
state['data'] = data
return state
def __setstate__(self, state):
if 'data' in state and '_SampleContainer__data' not in state:
state['_SampleContainer__data'] = state.pop('data')
super(Folder, self).__setstate__(state)
...@@ -3,6 +3,7 @@ from unittest import TestCase, makeSuite ...@@ -3,6 +3,7 @@ from unittest import TestCase, makeSuite
from zope.container.folder import Folder from zope.container.folder import Folder
from zope.container.tests.test_icontainer import TestSampleContainer from zope.container.tests.test_icontainer import TestSampleContainer
import pickle
class Test(TestSampleContainer, TestCase): class Test(TestSampleContainer, TestCase):
...@@ -15,6 +16,14 @@ class Test(TestSampleContainer, TestCase): ...@@ -15,6 +16,14 @@ class Test(TestSampleContainer, TestCase):
folder.data = 'foo' folder.data = 'foo'
self.assertEqual(folder.data, 'foo') self.assertEqual(folder.data, 'foo')
def testPickleCompatibility(self):
folder = self.makeTestObject()
folder['a'] = 1
self.assertEqual(folder.__getstate__()['data'], folder._SampleContainer__data)
folder_clone = pickle.loads(pickle.dumps(folder))
self.assertEqual(folder_clone['a'], folder['a'])
def test_suite(): def test_suite():
return makeSuite(Test) return makeSuite(Test)
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