summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2021-07-09 06:52:19 -0500
committerGitHub <noreply@github.com>2021-07-09 06:52:19 -0500
commit885eb7bd68d5a0b273f0d5dd9cbb22359ccec8b6 (patch)
treeca7bd13aba18f4b06ec16df1415f915f771f10e3
parentaf09e48f234cb61307efeb7e5227108a85a5fd89 (diff)
parented6d9b02736348aa2a683d2d7c1b91742684bf11 (diff)
downloadzope-component-885eb7bd68d5a0b273f0d5dd9cbb22359ccec8b6.tar.gz
Merge pull request #63 from zopefoundation/issue62
Fix unregistering utilities on old persistent adapter registries.
-rw-r--r--CHANGES.rst4
-rw-r--r--src/zope/component/persistentregistry.py6
-rw-r--r--src/zope/component/tests/test_persistentregistry.py39
3 files changed, 47 insertions, 2 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index 6df82ea..061ace3 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -5,7 +5,9 @@
5.0.1 (unreleased)
==================
-- Nothing changed yet.
+- Fix unregistering utilities on old persistent adapter registries.
+ Previously this could raise ``TypeError``. See `issue 62
+ <https://github.com/zopefoundation/zope.component/issues/62>`_.
5.0.0 (2021-03-19)
diff --git a/src/zope/component/persistentregistry.py b/src/zope/component/persistentregistry.py
index f01111c..4f61e3d 100644
--- a/src/zope/component/persistentregistry.py
+++ b/src/zope/component/persistentregistry.py
@@ -23,7 +23,7 @@ class PersistentAdapterRegistry(VerifyingAdapterRegistry, Persistent):
"""
An adapter registry that is also a persistent object.
- .. versionchanged:: 4.7.0
+ .. versionchanged:: 5.0.0
Internal data structures are now composed of
:class:`persistent.mapping.PersistentMapping` and
:class:`persistent.list.PersistentList`. This helps scale to
@@ -68,6 +68,10 @@ class PersistentAdapterRegistry(VerifyingAdapterRegistry, Persistent):
return existing_leaf_sequence
def _removeValueFromLeaf(self, existing_leaf_sequence, to_remove):
+ if isinstance(existing_leaf_sequence, tuple):
+ # Converting from old state
+ existing_leaf_sequence = self._leafSequenceType(existing_leaf_sequence)
+
without_removed = VerifyingAdapterRegistry._removeValueFromLeaf(
self,
existing_leaf_sequence,
diff --git a/src/zope/component/tests/test_persistentregistry.py b/src/zope/component/tests/test_persistentregistry.py
index 606ce10..46224cc 100644
--- a/src/zope/component/tests/test_persistentregistry.py
+++ b/src/zope/component/tests/test_persistentregistry.py
@@ -136,9 +136,48 @@ class PersistentAdapterRegistryTests(unittest.TestCase):
def test__addValueToLeaf_existing_is_tuple_converts(self):
from persistent.list import PersistentList
registry = self._makeOne()
+ # It converts when the tuple is not empty...
result = registry._addValueToLeaf(('a',), 'b')
self.assertIsInstance(result, PersistentList)
self.assertEqual(result, ['a', 'b'])
+ # ...and when it is empty...
+ result = registry._addValueToLeaf((), 'b')
+ self.assertIsInstance(result, PersistentList)
+ self.assertEqual(result, ['b'])
+ # ...and in fact when it is even missing
+ result = registry._addValueToLeaf(None, 'b')
+ self.assertIsInstance(result, PersistentList)
+ self.assertEqual(result, ['b'])
+
+ def test__removeValueFromLeaf_existing_is_tuple_converts(self):
+ from persistent.list import PersistentList
+ registry = self._makeOne()
+ # It converts when the item is found...
+ result = registry._removeValueFromLeaf(('a', 'b'), 'b')
+ self.assertIsInstance(result, PersistentList)
+ self.assertEqual(result, ['a'])
+ # ...and when it is not found
+ result = registry._removeValueFromLeaf(('a',), 'b')
+ self.assertIsInstance(result, PersistentList)
+ self.assertEqual(result, ['a'])
+
+ def test__addValueFromLeaf_preserves_identity(self):
+ registry = self._makeOne()
+ first = registry._addValueToLeaf(None, 'a')
+ second = registry._addValueToLeaf(first, 'b')
+ self.assertIs(first, second)
+ self.assertEqual(second, ['a', 'b'])
+
+ def test__removeValueFromLeaf_preserves_identity(self):
+ registry = self._makeOne()
+ first = registry._addValueToLeaf(None, 'a')
+ second = registry._addValueToLeaf(first, 'b')
+ third = registry._addValueToLeaf(second, 'c')
+ fourth = registry._removeValueFromLeaf(third, 'c')
+ self.assertIs(first, second)
+ self.assertIs(third, fourth)
+ self.assertIs(first, fourth)
+ self.assertEqual(fourth, ['a', 'b'])
@skipIfNoPersistent