]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
fix serializer tests. something is wrong with non-C pickle but for some reason py3k...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 26 May 2013 17:08:24 +0000 (13:08 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 26 May 2013 17:08:24 +0000 (13:08 -0400)
is all related to http://bugs.python.org/issue998998

lib/sqlalchemy/ext/serializer.py
lib/sqlalchemy/util/__init__.py
lib/sqlalchemy/util/compat.py
test/ext/test_serializer.py
test/requirements.py

index 759652014da0af3d7bc97c1500df36578ed69294..8abd1fdf3c48af55dd4283b7b4c79ab11107ca10 100644 (file)
@@ -58,26 +58,9 @@ from ..orm.interfaces import MapperProperty
 from ..orm.attributes import QueryableAttribute
 from .. import Table, Column
 from ..engine import Engine
-from ..util import pickle
+from ..util import pickle, byte_buffer, b64encode, b64decode
 import re
-import base64
-# start Py3K
-from io import BytesIO as byte_buffer
-# end Py3K
-# start Py2K
-#from cStringIO import StringIO as byte_buffer
-# end Py2K
-
-# start Py3K
-def b64encode(x):
-    return base64.b64encode(x).decode('ascii')
-def b64decode(x):
-    return base64.b64decode(x.encode('ascii'))
-# end Py3K
-# start Py2K
-#b64encode = base64.b64encode
-#b64decode = base64.b64decode
-# end Py2K
+
 
 __all__ = ['Serializer', 'Deserializer', 'dumps', 'loads']
 
index b1f1a2db693abc3e8e295d0850be41edc5c203c9..d1fc8e8e56784f5814d15ab213117ffe66b874f9 100644 (file)
@@ -9,7 +9,7 @@ from .compat import callable, cmp, reduce,  \
     pickle, dottedgetter, parse_qsl, namedtuple, next, WeakSet, reraise, \
     raise_from_cause, text_type, string_types, int_types, binary_type, \
     quote_plus, with_metaclass, print_, itertools_filterfalse, u, ue, b,\
-    unquote_plus
+    unquote_plus, b64decode, b64encode, byte_buffer
 
 from ._collections import KeyedTuple, ImmutableContainer, immutabledict, \
     Properties, OrderedProperties, ImmutableProperties, OrderedDict, \
index e8404c2df64806a546b7a827d00357aad641f734..ea97999cfb4419f820d33baf3352bcad4c3cbc4f 100644 (file)
@@ -28,7 +28,7 @@ if py3k:
     import pickle
 else:
     try:
-        import pickle as pickle
+        import cPickle as pickle
     except ImportError:
         import pickle
 
@@ -40,6 +40,9 @@ if py3k:
     import configparser
     from io import StringIO
 
+    from io import BytesIO as byte_buffer
+
+
     string_types = str,
     binary_type = bytes
     text_type = str
@@ -73,12 +76,20 @@ if py3k:
     import itertools
     itertools_filterfalse = itertools.filterfalse
     itertools_imap = map
+
+    import base64
+    def b64encode(x):
+        return base64.b64encode(x).decode('ascii')
+    def b64decode(x):
+        return base64.b64decode(x.encode('ascii'))
+
 else:
     from inspect import getargspec as inspect_getfullargspec
     from urllib import quote_plus, unquote_plus
     from urlparse import parse_qsl
     import ConfigParser as configparser
     from StringIO import StringIO
+    from cStringIO import StringIO as byte_buffer
 
     string_types = basestring,
     binary_type = str
@@ -109,6 +120,10 @@ else:
     cmp = cmp
     reduce = reduce
 
+    import base64
+    b64encode = base64.b64encode
+    b64decode = base64.b64decode
+
     def print_(*args, **kwargs):
         fp = kwargs.pop("file", sys.stdout)
         if fp is None:
index 0c7298a8b33ab8f1983cab71752926dfec81d2e8..84fff1304b124b304d2c77dbe61fa1f52e132d64 100644 (file)
@@ -114,7 +114,7 @@ class SerializeTest(fixtures.MappedTest):
             Address(email='ed@lala.com'),
             Address(email='ed@bettyboop.com')])
 
-    @testing.skip_if(lambda: util.pypy, "problems with pypy pickle reported")
+    @testing.requires.non_broken_pickle
     def test_query_two(self):
         q = \
             Session.query(User).join(User.addresses).\
@@ -124,7 +124,7 @@ class SerializeTest(fixtures.MappedTest):
         eq_(q2.all(), [User(name='fred')])
         eq_(list(q2.values(User.id, User.name)), [(9, 'fred')])
 
-    @testing.skip_if(lambda: util.pypy, "problems with pypy pickle reported")
+    @testing.requires.non_broken_pickle
     def test_query_three(self):
         ua = aliased(User)
         q = \
@@ -138,7 +138,7 @@ class SerializeTest(fixtures.MappedTest):
         ua_2 = q2._entities[0].entity_zero.entity
         eq_(list(q2.values(ua_2.id, ua_2.name)), [(9, 'fred')])
 
-    @testing.skip_if(lambda: util.pypy, "problems with pypy pickle reported")
+    @testing.requires.non_broken_pickle
     def test_orm_join(self):
         from sqlalchemy.orm.util import join
 
@@ -165,8 +165,7 @@ class SerializeTest(fixtures.MappedTest):
         eq_(list(q2.all()), [(u7, u8), (u7, u9), (u7, u10), (u8, u9),
             (u8, u10)])
 
-    @testing.skip_if(lambda: util.pypy, "pickle sometimes has "
-                        "problems here, sometimes not")
+    @testing.requires.non_broken_pickle
     def test_any(self):
         r = User.addresses.any(Address.email == 'x')
         ser = serializer.dumps(r, -1)
index c20bcbd0a936cafbc5c834a688476c7c3abf977a..c09c0df99bddba2017517da632a7f59954b3392a 100644 (file)
@@ -556,6 +556,15 @@ class DefaultRequirements(SuiteRequirements):
                "cPython interpreter needed"
              )
 
+
+    @property
+    def non_broken_pickle(self):
+        from sqlalchemy.util import pickle
+        return only_if(
+            lambda: pickle.__name__ == 'cPickle' or sys.version_info >= (3, 2),
+            "Needs cPickle or newer Python 3 pickle"
+        )
+
     @property
     def predictable_gc(self):
         """target platform must remove all cycles unconditionally when