From bdc3f9bf53154fa9137b28084bf69b1530219086 Mon Sep 17 00:00:00 2001 From: holger krekel Date: Tue, 27 Apr 2010 21:26:35 +0200 Subject: [PATCH] fix python3 issues and add info to changelog --- CHANGELOG | 4 ++++ testing/test_mypickle.py | 7 +++++++ xdist/mypickle.py | 13 +++++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 6471f8f..c5a61f0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,10 @@ - introduce a new data input/output mechanism to allow the master side to send and receive data from a slave. +- use new register hooks facility of py.test>=1.2.2 + +- fix some python3 related pickling related race conditions + - fix PyPI description 1.1 diff --git a/testing/test_mypickle.py b/testing/test_mypickle.py index 9e5f205..f33c547 100644 --- a/testing/test_mypickle.py +++ b/testing/test_mypickle.py @@ -252,3 +252,10 @@ class TestPickleChannelFunctional: channel.waitclose(timeout=2) + +def test_explode(): + from xdist.mypickle import explode + assert isinstance(explode({}.values()), list) + l = [] + assert isinstance(explode(l), list) + assert explode(l) is l diff --git a/xdist/mypickle.py b/xdist/mypickle.py index c87005e..7869f85 100644 --- a/xdist/mypickle.py +++ b/xdist/mypickle.py @@ -100,16 +100,25 @@ class ImmutablePickler: return res def _updatepicklememo(self): - for x, obj in self._unpicklememo.items(): + for x, obj in explode(self._unpicklememo.items()): self._picklememo[id(obj)] = (fromkey(x), obj) def _updateunpicklememo(self): - for key,obj in self._picklememo.values(): + for key,obj in explode(self._picklememo.values()): key = makekey(key) if key in self._unpicklememo: assert self._unpicklememo[key] is obj self._unpicklememo[key] = obj +def explode(obj): + try: + obj[0] + except TypeError: + return list(obj) + except IndexError: + pass + return obj + NO_ENDMARKER_WANTED = object() class UnpickleError(Exception):