From: Mike Bayer Date: Sun, 27 Mar 2011 01:40:05 +0000 (-0400) Subject: - convert @provide_metadata to use self access X-Git-Tag: rel_0_7b4~58 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ebd0fdad737c2ee79e9cde90f350a705307be578;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - convert @provide_metadata to use self access - having occasional issues with BasicEntity grabbing, if it persists may have to pass an explicit base class into setup_classes()/setup_mappers() --- diff --git a/test/dialect/test_firebird.py b/test/dialect/test_firebird.py index c1b4c590ca..430b85d181 100644 --- a/test/dialect/test_firebird.py +++ b/test/dialect/test_firebird.py @@ -324,6 +324,7 @@ class TypesTest(TestBase): @testing.provide_metadata def test_infinite_float(self): + metadata = self.metadata t = Table('t', metadata, Column('data', Float) ) @@ -339,6 +340,7 @@ class MiscTest(TestBase): @testing.provide_metadata def test_strlen(self): + metadata = self.metadata # On FB the length() function is implemented by an external UDF, # strlen(). Various SA tests fail because they pass a parameter @@ -370,6 +372,7 @@ class MiscTest(TestBase): @testing.provide_metadata def test_rowcount_flag(self): + metadata = self.metadata engine = engines.testing_engine(options={'enable_rowcount' : True}) assert engine.dialect.supports_sane_rowcount diff --git a/test/dialect/test_mssql.py b/test/dialect/test_mssql.py index 7898050748..3e3690c123 100644 --- a/test/dialect/test_mssql.py +++ b/test/dialect/test_mssql.py @@ -485,6 +485,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.provide_metadata def test_identity(self): + metadata = self.metadata table = Table( 'identity_test', metadata, Column('col1', Integer, Sequence('fred', 2, 3), primary_key=True) @@ -501,6 +502,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.emits_warning("Did not recognize") @testing.provide_metadata def test_skip_types(self): + metadata = self.metadata testing.db.execute(""" create table foo (id integer primary key, data xml) """) @@ -510,6 +512,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.provide_metadata def test_indexes_cols(self): + metadata = self.metadata t1 = Table('t', metadata, Column('x', Integer), Column('y', Integer)) Index('foo', t1.c.x, t1.c.y) @@ -525,6 +528,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.provide_metadata def test_indexes_cols_with_commas(self): + metadata = self.metadata t1 = Table('t', metadata, Column('x, col', Integer, key='x'), @@ -543,6 +547,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.provide_metadata def test_indexes_cols_with_spaces(self): + metadata = self.metadata t1 = Table('t', metadata, Column('x col', Integer, key='x'), Column('y', Integer)) diff --git a/test/dialect/test_oracle.py b/test/dialect/test_oracle.py index d208191041..a3fd69a259 100644 --- a/test/dialect/test_oracle.py +++ b/test/dialect/test_oracle.py @@ -702,6 +702,7 @@ class TypesTest(TestBase, AssertsCompiledSQL): @testing.provide_metadata def test_rowid(self): + metadata = self.metadata t = Table('t1', metadata, Column('x', Integer) ) @@ -804,6 +805,7 @@ class TypesTest(TestBase, AssertsCompiledSQL): @testing.provide_metadata def test_numerics_broken_inspection(self): + metadata = self.metadata """Numeric scenarios where Oracle type info is 'broken', returning us precision, scale of the form (0, 0) or (0, -127). We convert to Decimal and let int()/float() processors take over. @@ -1076,6 +1078,7 @@ class EuroNumericTest(TestBase): @testing.provide_metadata def test_output_type_handler(self): + metadata = self.metadata for stmt, exp, kw in [ ("SELECT 0.1 FROM DUAL", decimal.Decimal("0.1"), {}), ("SELECT 15 FROM DUAL", 15, {}), @@ -1285,6 +1288,7 @@ class ExecuteTest(TestBase): @testing.provide_metadata def test_limit_offset_for_update(self): + metadata = self.metadata # oracle can't actually do the ROWNUM thing with FOR UPDATE # very well. diff --git a/test/dialect/test_postgresql.py b/test/dialect/test_postgresql.py index 60a10b4b41..956fc9ebcb 100644 --- a/test/dialect/test_postgresql.py +++ b/test/dialect/test_postgresql.py @@ -32,6 +32,7 @@ class SequenceTest(TestBase, AssertsCompiledSQL): @testing.only_on('postgresql', 'foo') @testing.provide_metadata def test_reverse_eng_name(self): + metadata = self.metadata engine = engines.testing_engine(options=dict(implicit_returning=False)) for tname, cname in [ ('tb1' * 30, 'abc'), @@ -284,6 +285,7 @@ class FloatCoercionTest(TablesTest, AssertsExecutionResults): @testing.provide_metadata def test_arrays(self): + metadata = self.metadata t1 = Table('t', metadata, Column('x', postgresql.ARRAY(Float)), Column('y', postgresql.ARRAY(postgresql.REAL)), @@ -525,6 +527,7 @@ class NumericInterpretationTest(TestBase): @testing.provide_metadata def test_numeric_default(self): + metadata = self.metadata # pg8000 appears to fail when the value is 0, # returns an int instead of decimal. t =Table('t', metadata, @@ -1207,6 +1210,7 @@ class MiscTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL): @testing.provide_metadata def test_date_reflection(self): + metadata = self.metadata t1 = Table('pgdate', metadata, Column('date1', DateTime(timezone=True)), Column('date2', DateTime(timezone=False))) @@ -1309,6 +1313,7 @@ class MiscTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL): @testing.provide_metadata def test_renamed_sequence_reflection(self): + metadata = self.metadata t = Table('t', metadata, Column('id', Integer, primary_key=True)) metadata.create_all() m2 = MetaData(testing.db) @@ -1454,6 +1459,7 @@ class MiscTest(TestBase, AssertsExecutionResults, AssertsCompiledSQL): @testing.provide_metadata def test_index_reflection(self): + metadata = self.metadata """ Reflecting partial & expression-based indexes should warn """ @@ -1621,6 +1627,7 @@ class TimePrecisionTest(TestBase, AssertsCompiledSQL): @testing.only_on('postgresql', 'DB specific feature') @testing.provide_metadata def test_reflection(self): + metadata = self.metadata t1 = Table( 't1', metadata, @@ -1778,6 +1785,7 @@ class ArrayTest(TestBase, AssertsExecutionResults): @testing.provide_metadata def test_tuple_flag(self): + metadata = self.metadata assert_raises_message( exc.ArgumentError, "mutable must be set to False if as_tuple is True.", @@ -2031,6 +2039,7 @@ class SpecialTypesTest(TestBase, ComparesTables, AssertsCompiledSQL): @testing.provide_metadata def test_bit_reflection(self): + metadata = self.metadata t1 = Table('t1', metadata, Column('bit1', postgresql.BIT()), Column('bit5', postgresql.BIT(5)), diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index e802f3995c..fb98d2f0a1 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -101,6 +101,7 @@ class TestTypes(TestBase, AssertsExecutionResults): @testing.provide_metadata def test_type_reflection(self): + metadata = self.metadata # (ask_for, roundtripped_as_if_different) @@ -156,6 +157,7 @@ class TestTypes(TestBase, AssertsExecutionResults): @testing.emits_warning('Did not recognize') @testing.provide_metadata def test_unknown_reflection(self): + metadata = self.metadata t = Table('t', metadata, Column('x', sqltypes.BINARY(16)), Column('y', sqltypes.BINARY()) diff --git a/test/engine/_base.py b/test/engine/_base.py index 387c937b66..23892ffd63 100644 --- a/test/engine/_base.py +++ b/test/engine/_base.py @@ -71,18 +71,18 @@ class TablesTest(testing.TestBase): if cls.run_define_tables == 'once': cls.define_tables(cls.metadata) if cls.run_create_tables == 'once': - cls.metadata.create_all() + cls.metadata.create_all(cls.bind) cls.tables.update(cls.metadata.tables) def _setup_each_tables(self): if self.run_define_tables == 'each': self.tables.clear() if self.run_create_tables == 'each': - drop_all_tables(self.metadata) + drop_all_tables(self.metadata, self.bind) self.metadata.clear() self.define_tables(self.metadata) if self.run_create_tables == 'each': - self.metadata.create_all() + self.metadata.create_all(self.bind) self.tables.update(self.metadata.tables) def _setup_each_inserts(self): @@ -120,7 +120,7 @@ class TablesTest(testing.TestBase): @classmethod def _teardown_once_metadata_bind(cls): if cls.run_create_tables: - cls.metadata.drop_all() + drop_all_tables(cls.metadata, cls.bind) if cls.run_dispose_bind == 'once': cls.dispose_bind(cls.bind) @@ -174,7 +174,7 @@ class TablesTest(testing.TestBase): for table in self.metadata.sorted_tables: if table not in headers: continue - table.bind.execute( + self.bind.execute( table.insert(), [dict(zip(headers[table], column_values)) for column_values in rows[table]]) diff --git a/test/engine/test_execute.py b/test/engine/test_execute.py index 44a9316ccd..f70d565278 100644 --- a/test/engine/test_execute.py +++ b/test/engine/test_execute.py @@ -384,6 +384,7 @@ class ResultProxyTest(TestBase): @testing.provide_metadata def test_no_rowcount_on_selects_inserts(self): + metadata = self.metadata """assert that rowcount is only called on deletes and updates. This because cursor.rowcount can be expensive on some dialects diff --git a/test/engine/test_reflection.py b/test/engine/test_reflection.py index 1124b4a47a..8c806e39ae 100644 --- a/test/engine/test_reflection.py +++ b/test/engine/test_reflection.py @@ -329,6 +329,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.provide_metadata def test_override_composite_fk(self): + metadata = self.metadata """Test double-remove of composite foreign key, when replaced.""" a = Table('a', @@ -764,6 +765,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.requires.views @testing.provide_metadata def test_views(self): + metadata = self.metadata users, addresses = createTables(metadata, None) try: metadata.create_all() @@ -785,6 +787,7 @@ class ReflectionTest(TestBase, ComparesTables): @testing.requires.views @testing.provide_metadata def test_reflect_all_with_views(self): + metadata = self.metadata users, addresses = createTables(metadata, None) try: metadata.create_all() diff --git a/test/lib/engines.py b/test/lib/engines.py index 1acbdaf274..8e251b3514 100644 --- a/test/lib/engines.py +++ b/test/lib/engines.py @@ -42,9 +42,11 @@ class ConnectionKiller(object): testing_reaper = ConnectionKiller() -def drop_all_tables(metadata): +def drop_all_tables(metadata, bind): testing_reaper.close_all() - metadata.drop_all() + if hasattr(bind, 'close'): + bind.close() + metadata.drop_all(bind) @decorator def assert_conns_closed(fn, *args, **kw): diff --git a/test/lib/testing.py b/test/lib/testing.py index e4edb8a86d..e815a2dff0 100644 --- a/test/lib/testing.py +++ b/test/lib/testing.py @@ -536,30 +536,20 @@ def assert_raises_message(except_cls, msg, callable_, *args, **kwargs): def fail(msg): assert False, msg -def fixture(table, columns, *rows): - """Insert data into table after creation.""" - def onload(event, schema_item, connection): - insert = table.insert() - column_names = [col.key for col in columns] - connection.execute(insert, [dict(zip(column_names, column_values)) - for column_values in rows]) - table.append_ddl_listener('after-create', onload) @decorator def provide_metadata(fn, *args, **kw): - """Provides a bound MetaData object for a single test, - drops it afterwards.""" + """Provide bound MetaData for a single test, dropping afterwards.""" + metadata = schema.MetaData(db) - context = dict(fn.func_globals) - context['metadata'] = metadata - # jython bug #1034 - rebound = types.FunctionType( - fn.func_code, context, fn.func_name, fn.func_defaults, - fn.func_closure) + self = args[0] + prev_meta = getattr(self, 'metadata', None) + self.metadata = metadata try: - return rebound(*args, **kw) + return fn(*args, **kw) finally: metadata.drop_all() + self.metadata = prev_meta class adict(dict): """Dict keys available as attributes. Shadows.""" diff --git a/test/orm/_fixtures.py b/test/orm/_fixtures.py index 41c354e4a5..ae8da5ec86 100644 --- a/test/orm/_fixtures.py +++ b/test/orm/_fixtures.py @@ -3,7 +3,6 @@ from sqlalchemy import util from test.lib.schema import Table from test.lib.schema import Column from sqlalchemy.orm import attributes -from test.lib.testing import fixture from test.orm import _base __all__ = () diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py index b4c338ddda..f86f38fdef 100644 --- a/test/orm/test_mapper.py +++ b/test/orm/test_mapper.py @@ -599,6 +599,7 @@ class MapperTest(_fixtures.FixtureTest): ) @testing.provide_metadata def test_prop_filters_defaults(self): + metadata = self.metadata t = Table('t', metadata, Column('id', Integer(), primary_key=True, test_needs_autoincrement=True), Column('x', Integer(), nullable=False, server_default='0') diff --git a/test/orm/test_query.py b/test/orm/test_query.py index 9a799bba20..164294e956 100644 --- a/test/orm/test_query.py +++ b/test/orm/test_query.py @@ -1960,6 +1960,7 @@ class UpdateDeleteTest(_base.MappedTest): @testing.provide_metadata def test_update_attr_names(self): + metadata = self.metadata data = Table('data', metadata, Column('id', Integer, primary_key=True, test_needs_autoincrement=True), Column('counter', Integer, nullable=False, default=0) diff --git a/test/sql/test_defaults.py b/test/sql/test_defaults.py index 74998a77c5..2ba131ddc8 100644 --- a/test/sql/test_defaults.py +++ b/test/sql/test_defaults.py @@ -652,6 +652,7 @@ class SequenceExecTest(testing.TestBase): def test_func_embedded_whereclause(self): """test can use next_value() in whereclause""" + metadata = self.metadata t1 = Table('t', metadata, Column('x', Integer) ) @@ -669,6 +670,7 @@ class SequenceExecTest(testing.TestBase): def test_func_embedded_valuesbase(self): """test can use next_value() in values() of _ValuesBase""" + metadata = self.metadata t1 = Table('t', metadata, Column('x', Integer) ) @@ -686,6 +688,7 @@ class SequenceExecTest(testing.TestBase): """test inserted_primary_key contains [None] when pk_col=next_value(), implicit returning is not used.""" + metadata = self.metadata e = engines.testing_engine(options={'implicit_returning':False}) s = Sequence("my_sequence") metadata.bind = e @@ -704,6 +707,7 @@ class SequenceExecTest(testing.TestBase): """test inserted_primary_key contains the result when pk_col=next_value(), when implicit returning is used.""" + metadata = self.metadata e = engines.testing_engine(options={'implicit_returning':True}) s = Sequence("my_sequence") metadata.bind = e @@ -800,6 +804,7 @@ class SequenceTest(testing.TestBase, testing.AssertsCompiledSQL): @testing.provide_metadata def test_table_overrides_metadata_create(self): + metadata = self.metadata s1 = Sequence("s1", metadata=metadata) s2 = Sequence("s2", metadata=metadata) s3 = Sequence("s3") @@ -915,6 +920,7 @@ class SpecialTypePKTest(testing.TestBase): @testing.provide_metadata def _run_test(self, *arg, **kw): + metadata = self.metadata implicit_returning = kw.pop('implicit_returning', True) kw['primary_key'] = True if kw.get('autoincrement', True): @@ -983,6 +989,7 @@ class ServerDefaultsOnPKTest(testing.TestBase): like this. Testing that all backends do the same thing here. """ + metadata = self.metadata t = Table('x', metadata, Column('y', String(10), server_default='key_one', primary_key=True), Column('data', String(10)), @@ -1000,6 +1007,7 @@ class ServerDefaultsOnPKTest(testing.TestBase): @testing.provide_metadata def test_string_default_on_insert_with_returning(self): """With implicit_returning, we get a string PK default back no problem.""" + metadata = self.metadata t = Table('x', metadata, Column('y', String(10), server_default='key_one', primary_key=True), Column('data', String(10)) @@ -1014,6 +1022,7 @@ class ServerDefaultsOnPKTest(testing.TestBase): @testing.provide_metadata def test_int_default_none_on_insert(self): + metadata = self.metadata t = Table('x', metadata, Column('y', Integer, server_default='5', primary_key=True), @@ -1036,6 +1045,7 @@ class ServerDefaultsOnPKTest(testing.TestBase): ) @testing.provide_metadata def test_autoincrement_reflected_from_server_default(self): + metadata = self.metadata t = Table('x', metadata, Column('y', Integer, server_default='5', primary_key=True), @@ -1051,6 +1061,7 @@ class ServerDefaultsOnPKTest(testing.TestBase): @testing.provide_metadata def test_int_default_none_on_insert_reflected(self): + metadata = self.metadata t = Table('x', metadata, Column('y', Integer, server_default='5', primary_key=True), @@ -1078,6 +1089,7 @@ class ServerDefaultsOnPKTest(testing.TestBase): @testing.requires.returning @testing.provide_metadata def test_int_default_on_insert_with_returning(self): + metadata = self.metadata t = Table('x', metadata, Column('y', Integer, server_default='5', primary_key=True), diff --git a/test/sql/test_metadata.py b/test/sql/test_metadata.py index 09f1869a43..7040cacffd 100644 --- a/test/sql/test_metadata.py +++ b/test/sql/test_metadata.py @@ -130,6 +130,7 @@ class MetaDataTest(TestBase, ComparesTables): @testing.provide_metadata def test_dupe_tables(self): + metadata = self.metadata t1 = Table('table1', metadata, Column('col1', Integer, primary_key=True), Column('col2', String(20))) diff --git a/test/sql/test_types.py b/test/sql/test_types.py index adfe2a8a94..9c8f66328c 100644 --- a/test/sql/test_types.py +++ b/test/sql/test_types.py @@ -14,6 +14,7 @@ from test.lib import * from test.lib.util import picklers from sqlalchemy.util.compat import decimal from test.lib.util import round_decimal +from test.engine import _base class AdaptTest(TestBase): def _all_dialect_modules(self): @@ -182,12 +183,11 @@ class PickleMetadataTest(TestBase): mt = loads(dumps(meta)) -class UserDefinedTest(TestBase, AssertsCompiledSQL): +class UserDefinedTest(_base.TablesTest, AssertsCompiledSQL): """tests user-defined types.""" def test_processing(self): - - global users + users = self.tables.users users.insert().execute( user_id=2, goofy='jack', goofy2='jack', goofy4=u'jack', goofy7=u'jack', goofy8=12, goofy9=12) @@ -270,6 +270,7 @@ class UserDefinedTest(TestBase, AssertsCompiledSQL): def test_type_coerce(self): """test ad-hoc usage of custom types with type_coerce().""" + metadata = self.metadata class MyType(types.TypeDecorator): impl = String @@ -323,9 +324,7 @@ class UserDefinedTest(TestBase, AssertsCompiledSQL): ) @classmethod - def setup_class(cls): - global users, metadata - + def define_tables(cls, metadata): class MyType(types.UserDefinedType): def get_col_spec(self): return "VARCHAR(100)" @@ -409,8 +408,7 @@ class UserDefinedTest(TestBase, AssertsCompiledSQL): def copy(self): return MyUnicodeType(self.impl.length) - metadata = MetaData(testing.db) - users = Table('type_users', metadata, + Table('users', metadata, Column('user_id', Integer, primary_key = True), # totall custom type Column('goofy', MyType, nullable = False), @@ -424,11 +422,6 @@ class UserDefinedTest(TestBase, AssertsCompiledSQL): Column('goofy9', MyNewIntSubClass, nullable = False), ) - metadata.create_all() - - @classmethod - def teardown_class(cls): - metadata.drop_all() class UnicodeTest(TestBase, AssertsExecutionResults): """tests the Unicode type. also tests the TypeDecorator with instances in the types package.""" @@ -1465,6 +1458,7 @@ class NumericRawSQLTest(TestBase): @testing.fails_on('sqlite', "Doesn't provide Decimal results natively") @testing.provide_metadata def test_decimal_fp(self): + metadata = self.metadata t = self._fixture(metadata, Numeric(10, 5), decimal.Decimal("45.5")) val = testing.db.execute("select val from t").scalar() assert isinstance(val, decimal.Decimal) @@ -1473,6 +1467,7 @@ class NumericRawSQLTest(TestBase): @testing.fails_on('sqlite', "Doesn't provide Decimal results natively") @testing.provide_metadata def test_decimal_int(self): + metadata = self.metadata t = self._fixture(metadata, Numeric(10, 5), decimal.Decimal("45")) val = testing.db.execute("select val from t").scalar() assert isinstance(val, decimal.Decimal) @@ -1480,6 +1475,7 @@ class NumericRawSQLTest(TestBase): @testing.provide_metadata def test_ints(self): + metadata = self.metadata t = self._fixture(metadata, Integer, 45) val = testing.db.execute("select val from t").scalar() assert isinstance(val, (int, long)) @@ -1487,6 +1483,7 @@ class NumericRawSQLTest(TestBase): @testing.provide_metadata def test_float(self): + metadata = self.metadata t = self._fixture(metadata, Float, 46.583) val = testing.db.execute("select val from t").scalar() assert isinstance(val, float)