]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
most of ORM passing...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 4 May 2013 20:23:27 +0000 (16:23 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 4 May 2013 20:23:27 +0000 (16:23 -0400)
15 files changed:
lib/sqlalchemy/event.py
lib/sqlalchemy/ext/associationproxy.py
lib/sqlalchemy/orm/attributes.py
lib/sqlalchemy/orm/collections.py
lib/sqlalchemy/orm/instrumentation.py
lib/sqlalchemy/orm/query.py
lib/sqlalchemy/orm/util.py
lib/sqlalchemy/sql/expression.py
lib/sqlalchemy/util/compat.py
lib/sqlalchemy/util/langhelpers.py
test/orm/inheritance/test_concrete.py
test/orm/test_assorted_eager.py
test/orm/test_eager_relations.py
test/orm/test_generative.py
test/orm/test_naturalpks.py

index 79d024f9ba0218502d5f396674193dd2a6b00a9b..33626cf2ad1836e4c0451417a05df40eb2274c87 100644 (file)
@@ -378,6 +378,8 @@ class _EmptyListener(object):
     def __bool__(self):
         return bool(self.parent_listeners)
 
+    __nonzero__ = __bool__
+
 
 class _CompoundListener(object):
     _exec_once = False
@@ -415,6 +417,7 @@ class _CompoundListener(object):
     def __bool__(self):
         return bool(self.listeners or self.parent_listeners)
 
+    __nonzero__ = __bool__
 
 class _ListenerCollection(_CompoundListener):
     """Instance-level attributes on instances of :class:`._Dispatch`.
index ad09db831a0f062aefed3bca0ca6d1668c57ba39..e0a867e5aa3f308c7a2c7ad25566908d2c3dceab 100644 (file)
@@ -478,6 +478,8 @@ class _AssociationCollection(object):
     def __bool__(self):
         return bool(self.col)
 
+    __nonzero__ = __bool__
+
     def __getstate__(self):
         return {'parent': self.parent, 'lazy_collection': self.lazy_collection}
 
index 691904bb3b8deaec2d577bbccdcb13883e88b1fc..05724704761d8f1b5096dedde4005f15a93fce53 100644 (file)
@@ -386,8 +386,8 @@ def create_proxied_attribute(descriptor):
                     return getattr(self.comparator, attribute)
                 except AttributeError:
                     raise AttributeError(
-                    'Neither %r object nor %r object associated with %s '
-                    'has an attribute %r' % (
+                        'Neither %r object nor %r object associated with %s '
+                        'has an attribute %r' % (
                     type(descriptor).__name__,
                     type(self.comparator).__name__,
                     self,
@@ -1216,6 +1216,7 @@ class History(History):
 
     def __bool__(self):
         return self != HISTORY_BLANK
+    __nonzero__ = __bool__
 
     def empty(self):
         """Return True if this :class:`.History` has no changes
index c2a2c23f0dcbb0892f02f5ac5285abae7493c169..bb7882ee9ae5813fb47550aef47247ae4c1184dc 100644 (file)
@@ -657,12 +657,10 @@ class CollectionAdapter(object):
         if getattr(obj, '_sa_adapter', None) is not None:
             return getattr(obj, '_sa_adapter')
         elif setting_type == dict:
-# start Py3K
-            return list(obj.values())
-# end Py3K
-# start Py2K
-#            return getattr(obj, 'itervalues', getattr(obj, 'values'))()
-# end Py2K
+            if util.py3k:
+                return obj.values()
+            else:
+                return getattr(obj, 'itervalues', getattr(obj, 'values'))()
         else:
             return iter(obj)
 
@@ -706,8 +704,6 @@ class CollectionAdapter(object):
     def __iter__(self):
         """Iterate over entities in the collection."""
 
-# start Py3K
-# end Py3K
         return iter(getattr(self._data(), '_sa_iterator')())
 
     def __len__(self):
@@ -717,6 +713,8 @@ class CollectionAdapter(object):
     def __bool__(self):
         return True
 
+    __nonzero__ = __bool__
+
     def fire_append_event(self, item, initiator=None):
         """Notify that a entity has entered the collection.
 
@@ -1130,24 +1128,23 @@ def _list_decorators():
         _tidy(__delitem__)
         return __delitem__
 
-# start Py2K
-#    def __setslice__(fn):
-#        def __setslice__(self, start, end, values):
-#            for value in self[start:end]:
-#                __del(self, value)
-#            values = [__set(self, value) for value in values]
-#            fn(self, start, end, values)
-#        _tidy(__setslice__)
-#        return __setslice__
-#
-#    def __delslice__(fn):
-#        def __delslice__(self, start, end):
-#            for value in self[start:end]:
-#                __del(self, value)
-#            fn(self, start, end)
-#        _tidy(__delslice__)
-#        return __delslice__
-# end Py2K
+    if util.py2k:
+        def __setslice__(fn):
+            def __setslice__(self, start, end, values):
+                for value in self[start:end]:
+                    __del(self, value)
+                values = [__set(self, value) for value in values]
+                fn(self, start, end, values)
+            _tidy(__setslice__)
+            return __setslice__
+
+        def __delslice__(fn):
+            def __delslice__(self, start, end):
+                for value in self[start:end]:
+                    __del(self, value)
+                fn(self, start, end)
+            _tidy(__delslice__)
+            return __delslice__
 
     def extend(fn):
         def extend(self, iterable):
@@ -1465,12 +1462,8 @@ __interfaces = {
         ),
 
     # decorators are required for dicts and object collections.
-# start Py3K
-    dict: ({'iterator': 'values'}, _dict_decorators()),
-# end Py3K
-# start Py2K
-#    dict: ({'iterator': 'itervalues'}, _dict_decorators()),
-# end Py2K
+    dict: ({'iterator': 'values'}, _dict_decorators()) if util.py3k
+            else ({'iterator': 'itervalues'}, _dict_decorators()),
     }
 
 
index ce12acf2022d0066e6aaab3a5c5359d3fa43935c..f2d0df43f1c2425561c6c80cdffe729a37b31fcf 100644 (file)
@@ -329,6 +329,8 @@ class ClassManager(dict):
         """All ClassManagers are non-zero regardless of attribute state."""
         return True
 
+    __nonzero__ = __bool__
+
     def __repr__(self):
         return '<%s of %r at %x>' % (
             self.__class__.__name__, self.class_, id(self))
index 80441b976e0a2f63e401124f14a646d765acac8c..09f0bedd1386eaa6deb3514f86e3ae047cf89627 100644 (file)
@@ -981,12 +981,7 @@ class Query(object):
         """Return a scalar result corresponding to the given
         column expression."""
         try:
-# start Py3K
-            return self.values(column).__next__()[0]
-# end Py3K
-# start Py2K
-#            return self.values(column).next()[0]
-# end Py2K
+            return next(self.values(column))[0]
         except StopIteration:
             return None
 
index 30a8a8084cec8131aebe0bc622b60850a1426b69..2a3124f4d85a99875fe6cd9b8644f27a0726ca3f 100644 (file)
@@ -413,6 +413,7 @@ class EntityRegistry(PathRegistry, dict):
 
     def __bool__(self):
         return True
+    __nonzero__ = __bool__
 
     def __getitem__(self, entity):
         if isinstance(entity, (int, slice)):
index 2c7b91fe60f5b83a32204a0ea98f00d30828097d..f0bcd400aec4c592f344752ffa36d0a0a58e0a52 100644 (file)
@@ -3769,6 +3769,7 @@ class BinaryExpression(ColumnElement):
             return self.operator(hash(self._orig[0]), hash(self._orig[1]))
         else:
             raise TypeError("Boolean value of this clause is not defined")
+
     __nonzero__ = __bool__
 
     @property
index 06bcd30dd6c9dd07713f084a4d571db0d4ea750e..e8404c2df64806a546b7a827d00357aad641f734 100644 (file)
@@ -184,8 +184,11 @@ else:
 if py3k:
     exec_ = getattr(builtins, 'exec')
 else:
-    def exec_(func_text, globals_, lcl):
-        exec('exec func_text in globals_, lcl')
+    def exec_(func_text, globals_, lcl=None):
+        if lcl is None:
+            exec('exec func_text in globals_')
+        else:
+            exec('exec func_text in globals_, lcl')
 
 
 def with_metaclass(meta, *bases):
index 8a6af3758ed8746a34b4a80361663007c9fedbc2..4cb745c2bacffdbc14556da2a7a542de0275a45d 100644 (file)
@@ -499,7 +499,7 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
               "return %(name)s.%(method)s%(d_args)s" % locals())
 
         env = from_instance is not None and {name: from_instance} or {}
-        compat.exec_(py, env, {})
+        compat.exec_(py, env)
         try:
             env[method].__defaults__ = fn.__defaults__
         except AttributeError:
@@ -510,12 +510,7 @@ def monkeypatch_proxied_specials(into_cls, from_cls, skip=None, only=None,
 def methods_equivalent(meth1, meth2):
     """Return True if the two methods are the same implementation."""
 
-# start Py3K
     return getattr(meth1, '__func__', meth1) is getattr(meth2, '__func__', meth2)
-# end Py3K
-# start Py2K
-#    return getattr(meth1, 'im_func', meth1) is getattr(meth2, 'im_func', meth2)
-# end Py2K
 
 
 def as_interface(obj, cls=None, methods=None, required=None):
index 5d6b82a15d3dbb30de374b7b5f30eca5fec58b51..573913f74026f41aa84702449a9a45046159500f 100644 (file)
@@ -711,12 +711,12 @@ class ColKeysTest(fixtures.MappedTest):
         refugees_table = Table('refugee', metadata, Column('refugee_fid'
                                , Integer, primary_key=True,
                                test_needs_autoincrement=True),
-                               Column('refugee_name', Unicode(30),
+                               Column('refugee_name', String(30),
                                key='name'))
         offices_table = Table('office', metadata, Column('office_fid',
                               Integer, primary_key=True,
                               test_needs_autoincrement=True),
-                              Column('office_name', Unicode(30),
+                              Column('office_name', String(30),
                               key='name'))
 
     @classmethod
index e650a1beace8559dd60a3dd277e657184ed09b76..83fccbf7a07ab5eb550b7fbc2cbdbb495a5979da 100644 (file)
@@ -723,13 +723,13 @@ class EagerTest8(fixtures.MappedTest):
         Table('prj', metadata,
               Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('created', sa.DateTime ),
-              Column('title', sa.Unicode(100)))
+              Column('title', sa.String(100)))
 
         Table('task', metadata,
               Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
               Column('status_id', Integer,
                      ForeignKey('task_status.id'), nullable=False),
-              Column('title', sa.Unicode(100)),
+              Column('title', sa.String(100)),
               Column('task_type_id', Integer ,
                      ForeignKey('task_type.id'), nullable=False),
               Column('prj_id', Integer , ForeignKey('prj.id'), nullable=False))
@@ -748,8 +748,8 @@ class EagerTest8(fixtures.MappedTest):
 
         Table('msg_type', metadata,
               Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
-              Column('name', sa.Unicode(20)),
-              Column('display_name', sa.Unicode(20)))
+              Column('name', sa.String(20)),
+              Column('display_name', sa.String(20)))
 
     @classmethod
     def fixtures(cls):
index 20ee693f3f7f592d183cb43c0397b7d87a8de8e8..41dd50e83fe5ffc4afb6c5009842d815a69f4236 100644 (file)
@@ -2107,7 +2107,7 @@ class SelfReferentialM2MEagerTest(fixtures.MappedTest):
     def define_tables(cls, metadata):
         Table('widget', metadata,
             Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
-            Column('name', sa.Unicode(40), nullable=False, unique=True),
+            Column('name', sa.String(40), nullable=False, unique=True),
         )
 
         Table('widget_rel', metadata,
index 84e60d8eacc5c56f8b41f843f53f97c50b24bff1..52858cc2651f26e7782cab71be15def878d52985 100644 (file)
@@ -78,14 +78,8 @@ class GenerativeQueryTest(fixtures.MappedTest):
         assert sess.query(func.min(foo.c.bar)).filter(foo.c.bar<30).one() == (0,)
 
         assert sess.query(func.max(foo.c.bar)).filter(foo.c.bar<30).one() == (29,)
-# start Py3K
-        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
-        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).__next__()[0] == 29
-# end Py3K
-# start Py2K
-#        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
-#        assert query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)).next()[0] == 29
-# end Py2K
+        assert next(query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)))[0] == 29
+        assert next(query.filter(foo.c.bar<30).values(sa.func.max(foo.c.bar)))[0] == 29
 
     @testing.fails_if(lambda:testing.against('mysql+mysqldb') and
             testing.db.dialect.dbapi.version_info[:4] == (1, 2, 1, 'gamma'),
@@ -112,20 +106,10 @@ class GenerativeQueryTest(fixtures.MappedTest):
 
         query = create_session().query(Foo)
 
-# start Py3K
-        avg_f = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).__next__()[0]
-# end Py3K
-# start Py2K
-#        avg_f = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).next()[0]
-# end Py2K
+        avg_f = next(query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)))[0]
         assert float(round(avg_f, 1)) == 14.5
 
-# start Py3K
-        avg_o = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).__next__()[0]
-# end Py3K
-# start Py2K
-#        avg_o = query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)).next()[0]
-# end Py2K
+        avg_o = next(query.filter(foo.c.bar<30).values(sa.func.avg(foo.c.bar)))[0]
         assert float(round(avg_o, 1)) == 14.5
 
     def test_filter(self):
index 7a636a5a9fd9a4a1c7b8a8be2e70894d78501739..173408b82928fa5bc37383e7f399e9427b3465a7 100644 (file)
@@ -499,7 +499,7 @@ class ReversePKsTest(fixtures.MappedTest):
             'user', metadata,
             Column('code', Integer, primary_key=True),
             Column('status', Integer, primary_key=True),
-            Column('username', Unicode(50), nullable=False),
+            Column('username', String(50), nullable=False),
             )
 
     @classmethod