aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2020-01-23 12:30:25 -0800
committerZac Medico <zmedico@gentoo.org>2020-01-23 12:40:52 -0800
commit27d653052549e5d1880ab68be12f3b82857506fe (patch)
tree34a95fbc70c71b17832fe58353fc1d716e645d4e
parentTestSonameAtomPickle: new test for bug 706186 (diff)
downloadportage-27d653052549e5d1880ab68be12f3b82857506fe.tar.gz
portage-27d653052549e5d1880ab68be12f3b82857506fe.tar.bz2
portage-27d653052549e5d1880ab68be12f3b82857506fe.zip
SonameAtom: implement get/set state methods (bug 706186)
Since SonameAtom instances are immutable, the __getstate__ and __setstate__ methods need to be implemented for pickle support. Bug: https://bugs.gentoo.org/706186 Signed-off-by: Zac Medico <zmedico@gentoo.org>
-rw-r--r--lib/portage/dep/soname/SonameAtom.py17
-rw-r--r--lib/portage/tests/dep/test_soname_atom_pickle.py2
2 files changed, 10 insertions, 9 deletions
diff --git a/lib/portage/dep/soname/SonameAtom.py b/lib/portage/dep/soname/SonameAtom.py
index f32082568..5743544aa 100644
--- a/lib/portage/dep/soname/SonameAtom.py
+++ b/lib/portage/dep/soname/SonameAtom.py
@@ -10,7 +10,7 @@ from portage import _encodings, _unicode_encode
class SonameAtom(object):
__slots__ = ("multilib_category", "soname", "_hash_key",
- "_hash_value", "_immutable")
+ "_hash_value")
# Distiguishes package atoms from other atom types
package = False
@@ -21,14 +21,17 @@ class SonameAtom(object):
object.__setattr__(self, "_hash_key",
(multilib_category, soname))
object.__setattr__(self, "_hash_value", hash(self._hash_key))
- object.__setattr__(self, "_immutable", True)
def __setattr__(self, name, value):
- if getattr(self, '_immutable', False):
- raise AttributeError("SonameAtom instances are immutable",
- self.__class__, name, value)
- # This is needed for unpickling.
- object.__setattr__(self, name, value)
+ raise AttributeError("SonameAtom instances are immutable",
+ self.__class__, name, value)
+
+ def __getstate__(self):
+ return dict((k, getattr(self, k)) for k in self.__slots__)
+
+ def __setstate__(self, state):
+ for k, v in state.items():
+ object.__setattr__(self, k, v)
def __hash__(self):
return self._hash_value
diff --git a/lib/portage/tests/dep/test_soname_atom_pickle.py b/lib/portage/tests/dep/test_soname_atom_pickle.py
index 02965b44f..c3f339e2d 100644
--- a/lib/portage/tests/dep/test_soname_atom_pickle.py
+++ b/lib/portage/tests/dep/test_soname_atom_pickle.py
@@ -16,8 +16,6 @@ class TestSonameAtomPickle(TestCase):
_ALL_PROVIDES = frozenset([SonameAtom('x86_64', 'libc.so.6')])
def test_soname_atom_pickle(self):
- if sys.version_info < (3,):
- self.skipTest('SonameAtom pickle not implemented for python2 (bug 706186)')
loop = asyncio._wrap_loop()
with ForkExecutor(loop=loop) as executor:
result = loop.run_until_complete(loop.run_in_executor(executor, self._get_all_provides))