From e9fd09c33a08a6e4fe80016089dafc568b671bfa Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 30 Jan 2009 01:15:05 +0000 Subject: [PATCH] py3king --- lib/sqlalchemy/dialects/sqlite/base.py | 2 +- lib/sqlalchemy/dialects/sqlite/pysqlite.py | 1 - lib/sqlalchemy/engine/base.py | 4 +++- lib/sqlalchemy/orm/collections.py | 6 ++++-- lib/sqlalchemy/orm/evaluator.py | 6 +++++- lib/sqlalchemy/orm/identity.py | 5 +++++ lib/sqlalchemy/sql/compiler.py | 2 ++ lib/sqlalchemy/sql/expression.py | 2 ++ lib/sqlalchemy/sql/operators.py | 9 ++++++++- lib/sqlalchemy/util.py | 6 ++++-- sa2to3.py | 22 ++++++++++++++++++---- test/base/utils.py | 6 +++++- test/dialect/mysql.py | 1 - test/ext/compiler.py | 7 ++++--- test/orm/collection.py | 6 ++++-- test/orm/mapper.py | 1 + test/orm/utils.py | 18 +++++++++++++++++- test/testlib/compat.py | 5 +---- test/testlib/engines.py | 7 +++++++ 19 files changed, 91 insertions(+), 25 deletions(-) diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index bb297bc7dc..b8a1d7d71d 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -31,7 +31,7 @@ from sqlalchemy.engine import default from sqlalchemy import types as sqltypes from sqlalchemy import util from sqlalchemy.sql import compiler, functions as sql_functions -from types import NoneType +from sqlalchemy.util import NoneType class NumericMixin(object): def bind_processor(self, dialect): diff --git a/lib/sqlalchemy/dialects/sqlite/pysqlite.py b/lib/sqlalchemy/dialects/sqlite/pysqlite.py index b4b9ca33d0..9183bfbe89 100644 --- a/lib/sqlalchemy/dialects/sqlite/pysqlite.py +++ b/lib/sqlalchemy/dialects/sqlite/pysqlite.py @@ -109,7 +109,6 @@ from sqlalchemy import schema, exc, pool from sqlalchemy.engine import default from sqlalchemy import types as sqltypes from sqlalchemy import util -from types import NoneType class SQLite_pysqliteExecutionContext(default.DefaultExecutionContext): def post_exec(self): diff --git a/lib/sqlalchemy/engine/base.py b/lib/sqlalchemy/engine/base.py index 9479f7d853..e0ade2c8d3 100644 --- a/lib/sqlalchemy/engine/base.py +++ b/lib/sqlalchemy/engine/base.py @@ -1485,9 +1485,11 @@ class ResultProxy(object): for i, item in enumerate(metadata): colname = item[0] + # Py2K if self.dialect.description_encoding: colname = colname.decode(self.dialect.description_encoding) - + # end Py2K + if '.' in colname: # sqlite will in some circumstances prepend table name to colnames, so strip origname = colname diff --git a/lib/sqlalchemy/orm/collections.py b/lib/sqlalchemy/orm/collections.py index 5638a7e4a5..5903d34927 100644 --- a/lib/sqlalchemy/orm/collections.py +++ b/lib/sqlalchemy/orm/collections.py @@ -978,7 +978,8 @@ def _list_decorators(): fn(self, index) _tidy(__delitem__) return __delitem__ - + + # Py2K def __setslice__(fn): def __setslice__(self, start, end, values): for value in self[start:end]: @@ -995,7 +996,8 @@ def _list_decorators(): fn(self, start, end) _tidy(__delslice__) return __delslice__ - + # end Py2K + def extend(fn): def extend(self, iterable): for value in iterable: diff --git a/lib/sqlalchemy/orm/evaluator.py b/lib/sqlalchemy/orm/evaluator.py index 03955afa8a..8628c8a239 100644 --- a/lib/sqlalchemy/orm/evaluator.py +++ b/lib/sqlalchemy/orm/evaluator.py @@ -7,7 +7,11 @@ class UnevaluatableError(Exception): pass _straight_ops = set(getattr(operators, op) - for op in ('add', 'mul', 'sub', 'div', 'mod', 'truediv', + for op in ('add', 'mul', 'sub', + # Py2K + 'div', + # end Py2K + 'mod', 'truediv', 'lt', 'le', 'ne', 'gt', 'ge', 'eq')) diff --git a/lib/sqlalchemy/orm/identity.py b/lib/sqlalchemy/orm/identity.py index 0753ea991f..43642728b8 100644 --- a/lib/sqlalchemy/orm/identity.py +++ b/lib/sqlalchemy/orm/identity.py @@ -149,7 +149,12 @@ class WeakInstanceDict(IdentityMap): return list(self.itervalues()) def all_states(self): + # Py3K + # return list(dict.values(self)) + + # Py2K return dict.values(self) + # end Py2K def prune(self): return 0 diff --git a/lib/sqlalchemy/sql/compiler.py b/lib/sqlalchemy/sql/compiler.py index 216c0a76b2..38935ea290 100644 --- a/lib/sqlalchemy/sql/compiler.py +++ b/lib/sqlalchemy/sql/compiler.py @@ -64,7 +64,9 @@ OPERATORS = { operators.add : '+', operators.mul : '*', operators.sub : '-', + # Py2K operators.div : '/', + # end Py2K operators.mod : '%', operators.truediv : '/', operators.lt : '<', diff --git a/lib/sqlalchemy/sql/expression.py b/lib/sqlalchemy/sql/expression.py index 5812c434b2..c7a1dddc9d 100644 --- a/lib/sqlalchemy/sql/expression.py +++ b/lib/sqlalchemy/sql/expression.py @@ -1399,7 +1399,9 @@ class _CompareMixin(ColumnOperators): operators.add : (__operate,), operators.mul : (__operate,), operators.sub : (__operate,), + # Py2K operators.div : (__operate,), + # end Py2K operators.mod : (__operate,), operators.truediv : (__operate,), operators.lt : (__compare, operators.ge), diff --git a/lib/sqlalchemy/sql/operators.py b/lib/sqlalchemy/sql/operators.py index d28a6e0f5e..7ab37dfaf8 100644 --- a/lib/sqlalchemy/sql/operators.py +++ b/lib/sqlalchemy/sql/operators.py @@ -4,8 +4,13 @@ """Defines operators used in SQL expressions.""" from operator import ( - and_, or_, inv, add, mul, sub, div, mod, truediv, lt, le, ne, gt, ge, eq + and_, or_, inv, add, mul, sub, mod, truediv, lt, le, ne, gt, ge, eq ) + +# Py2K +from operator import (div,) +# end Py2K + from sqlalchemy.util import symbol @@ -88,7 +93,9 @@ _largest = symbol('_largest') _PRECEDENCE = { from_: 15, mul: 7, + # Py2K div: 7, + # end Py2K mod: 7, add: 6, sub: 6, diff --git a/lib/sqlalchemy/util.py b/lib/sqlalchemy/util.py index ccb9b9459d..a474a9e58b 100644 --- a/lib/sqlalchemy/util.py +++ b/lib/sqlalchemy/util.py @@ -11,7 +11,7 @@ types = __import__('types') from sqlalchemy import exc try: - import thread, threading + import thread as thread, threading as threading from threading import local as ThreadLocal except ImportError: import dummy_thread as thread @@ -41,6 +41,8 @@ else: EMPTY_SET = frozenset() +NoneType = type(None) + if py3k: import pickle else: @@ -677,7 +679,7 @@ class OrderedProperties(object): return self._data.keys() def has_key(self, key): - return self._data.has_key(key) + return key in self._data def clear(self): self._data.clear() diff --git a/sa2to3.py b/sa2to3.py index 9c657c6d4c..705eb22f3c 100644 --- a/sa2to3.py +++ b/sa2to3.py @@ -18,7 +18,7 @@ from lib2to3 import main, refactor import re py3k_pattern = re.compile(r'\s*# Py3K') -comment_pattern = re.compile(r'(\s*)#(.*)') +comment_pattern = re.compile(r'(\s*)#(?! ?Py2K)(.*)') py2k_pattern = re.compile(r'\s*# Py2K') end_py2k_pattern = re.compile(r'\s*# end Py2K') @@ -44,7 +44,12 @@ def preprocess(data): if m: yield "%s%s" % m.group(1, 2) else: - yield line + m = py2k_pattern.match(line) + if m: + for line in consume_py2k(): + yield line + else: + yield line break def consume_py2k(): @@ -57,7 +62,16 @@ def preprocess(data): return "\n".join(consume_normal()) -refactor_string = main.StdoutRefactoringTool.refactor_string -main.StdoutRefactoringTool.refactor_string = lambda s, data, name: refactor_string(s, preprocess(data), name) +old_refactor_string = main.StdoutRefactoringTool.refactor_string + +def refactor_string(self, data, name): + newdata = preprocess(data) + tree = old_refactor_string(self, newdata, name) + if tree: + if newdata != data: + tree.was_changed = True + return tree + +main.StdoutRefactoringTool.refactor_string = refactor_string main.main("lib2to3.fixes") diff --git a/test/base/utils.py b/test/base/utils.py index 0b7762b7d6..aed1d0a6f4 100644 --- a/test/base/utils.py +++ b/test/base/utils.py @@ -363,6 +363,10 @@ class DictlikeIteritemsTest(unittest.TestCase): class DuckTypeCollectionTest(TestBase): + # Py3K + #pass + + # Py2K def test_sets(self): import sets class SetLike(object): @@ -385,7 +389,7 @@ class DuckTypeCollectionTest(TestBase): is_(util.duck_type_collection(type_), None) instance = type_() is_(util.duck_type_collection(instance), None) - + # end Py2K class ArgInspectionTest(TestBase): def test_get_cls_kwargs(self): diff --git a/test/dialect/mysql.py b/test/dialect/mysql.py index ad16de89a3..3d6964606c 100644 --- a/test/dialect/mysql.py +++ b/test/dialect/mysql.py @@ -1,5 +1,4 @@ import testenv; testenv.configure_for_tests() -import sets from sqlalchemy import * from sqlalchemy import sql, exc from sqlalchemy.dialects.mysql import base as mysql diff --git a/test/ext/compiler.py b/test/ext/compiler.py index 057ebe6b8e..0d1d220abf 100644 --- a/test/ext/compiler.py +++ b/test/ext/compiler.py @@ -117,15 +117,16 @@ class UserDefinedTest(TestBase, AssertsCompiledSQL): self.assert_compile(DropThingy(), "DROP THINGY" ) - + + from sqlalchemy.dialects.postgres import base self.assert_compile(AddThingy(), "ADD SPECIAL PG THINGY", - dialect=create_engine('postgres://', _initialize=False).dialect + dialect=base.dialect() ) self.assert_compile(DropThingy(), "DROP THINGY", - dialect=create_engine('postgres://', _initialize=False).dialect + dialect=base.dialect() ) diff --git a/test/orm/collection.py b/test/orm/collection.py index 23f643597a..3d48f1d762 100644 --- a/test/orm/collection.py +++ b/test/orm/collection.py @@ -198,7 +198,8 @@ class CollectionsTest(_base.ORMTest): direct.remove(e) control.remove(e) assert_eq() - + + # Py2K if hasattr(direct, '__setslice__'): values = [creator(), creator()] direct[0:1] = values @@ -242,7 +243,8 @@ class CollectionsTest(_base.ORMTest): del direct[:] del control[:] assert_eq() - + # end Py2K + if hasattr(direct, 'extend'): values = [creator(), creator(), creator()] diff --git a/test/orm/mapper.py b/test/orm/mapper.py index f1f5f4a472..25fef77419 100644 --- a/test/orm/mapper.py +++ b/test/orm/mapper.py @@ -828,6 +828,7 @@ class MapperTest(_fixtures.FixtureTest): @testing.resolve_artifact_names def test_comparable_column(self): class MyComparator(sa.orm.properties.ColumnProperty.Comparator): + __hash__ = None def __eq__(self, other): # lower case comparison return func.lower(self.__clause_element__()) == func.lower(other) diff --git a/test/orm/utils.py b/test/orm/utils.py index 52c055110c..d545964c72 100644 --- a/test/orm/utils.py +++ b/test/orm/utils.py @@ -37,8 +37,13 @@ class ExtensionCarrierTest(TestBase): assert 'populate_instance' not in carrier carrier.append(interfaces.MapperExtension) + + # Py3K + #assert 'populate_instance' not in carrier + # Py2K assert 'populate_instance' in carrier - + # end Py2K + assert carrier.interface for m in carrier.interface: assert getattr(interfaces.MapperExtension, m) @@ -83,7 +88,10 @@ class AliasedClassTest(TestBase): alias = aliased(Point) assert Point.zero + # Py2K + # TODO: what is this testing ?? assert not getattr(alias, 'zero') + # end Py2K def test_classmethods(self): class Point(object): @@ -150,9 +158,17 @@ class AliasedClassTest(TestBase): self.func = func def __get__(self, instance, owner): if instance is None: + # Py3K + #args = (self.func, owner) + # Py2K args = (self.func, owner, owner.__class__) + # end Py2K else: + # Py3K + #args = (self.func, instance) + # Py2K args = (self.func, instance, owner) + # end Py2K return types.MethodType(*args) class PropertyDescriptor(object): diff --git a/test/testlib/compat.py b/test/testlib/compat.py index 73eb2d651f..3fb1131af9 100644 --- a/test/testlib/compat.py +++ b/test/testlib/compat.py @@ -12,8 +12,5 @@ def _function_named(fn, newname): fn.func_defaults, fn.func_closure) return fn -try: - callable = __builtin__.callable -except NameError: - def callable(fn): return hasattr(fn, '__call__') +from sqlalchemy.util import callable diff --git a/test/testlib/engines.py b/test/testlib/engines.py index 4f8811e45a..e295e4fbad 100644 --- a/test/testlib/engines.py +++ b/test/testlib/engines.py @@ -171,9 +171,16 @@ class ReplayableSession(object): Natives = set([getattr(types, t) for t in dir(types) if not t.startswith('_')]). \ difference([getattr(types, t) + # Py3K + #for t in ('FunctionType', 'BuiltinFunctionType', + # 'MethodType', 'BuiltinMethodType', + # 'LambdaType', )]) + + # Py2K for t in ('FunctionType', 'BuiltinFunctionType', 'MethodType', 'BuiltinMethodType', 'LambdaType', 'UnboundMethodType',)]) + # end Py2K def __init__(self): self.buffer = deque() -- 2.47.3