]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fixed a bug in declarative test which was looking for old version of history
authorMike Bayer <mike_mp@zzzcomputing.com>
Tue, 19 Aug 2008 21:27:34 +0000 (21:27 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Tue, 19 Aug 2008 21:27:34 +0000 (21:27 +0000)
- Added "sorted_tables" accessor to MetaData, which returns
Table objects sorted in order of dependency as a list.
This deprecates the MetaData.table_iterator() method.
The "reverse=False" keyword argument has also been
removed from util.sort_tables(); use the Python
'reversed' function to reverse the results.
[ticket:1033]

13 files changed:
CHANGES
lib/sqlalchemy/orm/mapper.py
lib/sqlalchemy/schema.py
lib/sqlalchemy/sql/compiler.py
lib/sqlalchemy/sql/util.py
test/engine/_base.py
test/engine/reflection.py
test/ext/declarative.py
test/orm/_base.py
test/orm/_fixtures.py
test/orm/inheritance/basic.py
test/orm/inheritance/polymorph2.py
test/testlib/testing.py

diff --git a/CHANGES b/CHANGES
index 093a4b7fed9a2c9f0cc32ec3d142f8bca1f8df97..e5746ea3e72705dc44802c69ca9b71b3b690a72a 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -69,7 +69,15 @@ CHANGES
       may now be a mix of lists and tuples.  (Previously members
       were always lists.)
 
-
+- schema
+    - Added "sorted_tables" accessor to MetaData, which returns
+      Table objects sorted in order of dependency as a list.
+      This deprecates the MetaData.table_iterator() method.
+      The "reverse=False" keyword argument has also been
+      removed from util.sort_tables(); use the Python
+      'reversed' function to reverse the results.
+      [ticket:1033]
+      
 - sql
     - Temporarily rolled back the "ORDER BY" enhancement from
       [ticket:1068].  This feature is on hold pending further
index 3e5f418fa1e84ac6f813ec061b9d3ffc0c2c9837..d1713e6f993eb85ead616bb171679ad220ed1357 100644 (file)
@@ -1314,7 +1314,7 @@ class Mapper(object):
             for t in mapper.tables:
                 table_to_mapper[t] = mapper
 
-        for table in sqlutil.sort_tables(table_to_mapper.keys(), reverse=True):
+        for table in reversed(sqlutil.sort_tables(table_to_mapper.keys())):
             delete = {}
             for state, mapper, connection in tups:
                 if table not in mapper._pks_by_table:
index f6e55581f6c75543a9d656a1aeb21e208b967403..bb97943ebe004c868107cd04aac6f033dd1a191a 100644 (file)
@@ -1534,14 +1534,23 @@ class MetaData(SchemaItem):
         # TODO: scan all other tables and remove FK _column
         del self.tables[table.key]
 
+    @util.deprecated('Deprecated. Use ``metadata.sorted_tables``')
     def table_iterator(self, reverse=True, tables=None):
         from sqlalchemy.sql.util import sort_tables
         if tables is None:
             tables = self.tables.values()
         else:
             tables = set(tables).intersection(self.tables.values())
-        return iter(sort_tables(tables, reverse=reverse))
-
+        ret = sort_tables(tables)
+        if reverse:
+            ret = reversed(ret)
+        return iter(ret)
+    
+    @property
+    def sorted_tables(self):
+        from sqlalchemy.sql.util import sort_tables
+        return sort_tables(self.tables.values())
+        
     def reflect(self, bind=None, schema=None, only=None):
         """Load all available table definitions from the database.
 
@@ -1660,8 +1669,8 @@ class MetaData(SchemaItem):
         checkfirst
           Defaults to True, don't issue CREATEs for tables already present
           in the target database.
+          
         """
-
         if bind is None:
             bind = _bind_or_error(self)
         for listener in self.ddl_listeners['before-create']:
index 4a47df9417b0002665f446b2094896cf30f0a4cb..eacbe59e104a7ca288f07c90ad4079753b79d7cc 100644 (file)
@@ -20,7 +20,7 @@ is otherwise internal to SQLAlchemy.
 
 import string, re
 from sqlalchemy import schema, engine, util, exc
-from sqlalchemy.sql import operators, functions
+from sqlalchemy.sql import operators, functions, util as sql_util
 from sqlalchemy.sql import expression as sql
 
 RESERVED_WORDS = set([
@@ -787,7 +787,11 @@ class SchemaGenerator(DDLBase):
         return not self.checkfirst or not self.dialect.has_table(self.connection, table.name, schema=table.schema)
 
     def visit_metadata(self, metadata):
-        collection = [t for t in metadata.table_iterator(reverse=False, tables=self.tables) if self._can_create(t)]
+        if self.tables:
+            tables = self.tables
+        else:
+            tables = metadata.tables.values()
+        collection = [t for t in sql_util.sort_tables(tables) if self._can_create(t)]
         for table in collection:
             self.traverse_single(table)
         if self.dialect.supports_alter:
@@ -950,7 +954,11 @@ class SchemaDropper(DDLBase):
         self.dialect = dialect
 
     def visit_metadata(self, metadata):
-        collection = [t for t in metadata.table_iterator(reverse=True, tables=self.tables) if self._can_drop(t)]
+        if self.tables:
+            tables = self.tables
+        else:
+            tables = metadata.tables.values()
+        collection = [t for t in reversed(sql_util.sort_tables(tables)) if self._can_drop(t)]
         if self.dialect.supports_alter:
             for alterable in self.find_alterables(collection):
                 self.drop_foreignkey(alterable)
index ba6b5a60569abdd13bd721265707d53b2f03e70d..e1636ccf90dde14d5483d560ce24848c4f5d36c9 100644 (file)
@@ -4,7 +4,7 @@ from itertools import chain
 
 """Utility functions that build upon SQL and Schema constructs."""
 
-def sort_tables(tables, reverse=False):
+def sort_tables(tables):
     """sort a collection of Table objects in order of their foreign-key dependency."""
     
     tuples = []
@@ -18,11 +18,7 @@ def sort_tables(tables, reverse=False):
 
     for table in tables:
         visitors.traverse(table, {'schema_visitor':True}, {'foreign_key':visit_foreign_key})    
-    sequence = topological.sort(tuples, tables)
-    if reverse:
-        return reversed(sequence)
-    else:
-        return sequence
+    return topological.sort(tuples, tables)
 
 def search(clause, target):
     if not clause:
index c215b2e962fc3b3fffbab8204b1a8b8914366dba..3c31d378ad1aa0644e190f91bd1b177b0aefc538 100644 (file)
@@ -82,7 +82,7 @@ class TablesTest(testing.TestBase):
     def tearDown(self):
         # no need to run deletes if tables are recreated on setup
         if self.run_define_tables != 'each' and self.run_deletes:
-            for table in self.metadata.table_iterator(reverse=True):
+            for table in reversed(self.metadata.sorted_tables):
                 try:
                     table.delete().execute().close()
                 except sa.exc.DBAPIError, ex:
@@ -135,7 +135,7 @@ class TablesTest(testing.TestBase):
                 table = self.tables[table]
             headers[table] = data[0]
             rows[table] = data[1:]
-        for table in self.metadata.table_iterator(reverse=False):
+        for table in self.metadata.sorted_tables:
             if table not in headers:
                 continue
             table.bind.execute(
index 873c05aa53c5a2548ff9f79d48c72424540e445e..5916e8cadacf7e93b5ae349c712c95a75972e609 100644 (file)
@@ -555,7 +555,7 @@ class CreateDropTest(TestBase):
         )
 
     def test_sorter( self ):
-        tables = metadata.table_iterator(reverse=False)
+        tables = metadata.sorted_tables
         table_names = [t.name for t in tables]
         self.assert_( table_names == ['users', 'orders', 'items', 'email_addresses'] or table_names ==  ['users', 'email_addresses', 'orders', 'items'])
 
@@ -657,7 +657,7 @@ class SchemaTest(TestBase):
             Column('col2', sa.Integer, sa.ForeignKey('someschema.table1.col1')),
             schema='someschema')
         # ensure this doesnt crash
-        print [t for t in metadata.table_iterator()]
+        print [t for t in metadata.sorted_tables]
         buf = StringIO.StringIO()
         def foo(s, p=None):
             buf.write(s)
index c1a56ced29a3c4c9b87228c5e70ad4bbcfb14685..b9fa57cf05d4b62e4a275b0fcb9262fb404cb252 100644 (file)
@@ -392,7 +392,7 @@ class DeclarativeTest(testing.TestBase, testing.AssertsExecutionResults):
 
         u1 = User(name='u1', a='a', b='b')
         eq_(u1.a, 'a')
-        eq_(User.a.get_history(u1), (['a'], [], []))
+        eq_(User.a.get_history(u1), (['a'], (), ()))
         sess = create_session()
         sess.save(u1)
         sess.flush()
@@ -777,7 +777,7 @@ class DeclarativeReflectionTest(testing.TestBase):
         Base = decl.declarative_base(testing.db)
 
     def tearDown(self):
-        for t in reflection_metadata.table_iterator():
+        for t in reflection_metadata.sorted_tables:
             t.delete().execute()
 
     def tearDownAll(self):
index 4523a322332db4b6cfca6be4bc6e5a0934f2e7f4..ae8cbd746e1b4cd8c1dc537dae78a008b8bbd356 100644 (file)
@@ -202,7 +202,7 @@ class MappedTest(ORMTest):
 
         # no need to run deletes if tables are recreated on setup
         if self.run_define_tables != 'each' and self.run_deletes:
-            for table in self.metadata.table_iterator(reverse=True):
+            for table in reversed(self.metadata.sorted_tables):
                 try:
                     table.delete().execute().close()
                 except sa.exc.DBAPIError, ex:
@@ -264,7 +264,7 @@ class MappedTest(ORMTest):
                 table = self.tables[table]
             headers[table] = data[0]
             rows[table] = data[1:]
-        for table in self.metadata.table_iterator(reverse=False):
+        for table in self.metadata.sorted_tables:
             if table not in headers:
                 continue
             table.bind.execute(
index 77dd510b263875bd0ca13cb2e702eaa6e5fbd465..efab37487e327640ee278a88e10484c37d85d763 100644 (file)
@@ -153,7 +153,7 @@ item_keywords = fixture_table(
 
 
 def _load_fixtures():
-    for table in fixture_metadata.table_iterator(reverse=False):
+    for table in fixture_metadata.sorted_tables:
         table.info[('fixture', 'loader')]()
 
 def run_inserts_for(table, bind=None):
index e3e374eed76735f3c8c5e707dc8f2a7e28b69c3d..b7759aaeb3712a15b158441051d9c8f291139fd9 100644 (file)
@@ -653,7 +653,7 @@ class SyncCompileTest(ORMTest):
         for j1 in (None, _b_table.c.a_id==_a_table.c.id, _a_table.c.id==_b_table.c.a_id):
             for j2 in (None, _b_table.c.a_id==_c_table.c.b_a_id, _c_table.c.b_a_id==_b_table.c.a_id):
                 self._do_test(j1, j2)
-                for t in _a_table.metadata.table_iterator(reverse=True):
+                for t in reversed(_a_table.metadata.sorted_tables):
                     t.delete().execute().close()
 
     def _do_test(self, j1, j2):
index 955a6b4e93fe271f46c01a7882c8d96365b16d15..6e9cf305e6b3f624ecc1d15ef7f4002655ac1c42 100644 (file)
@@ -652,7 +652,7 @@ class GenerativeTest(TestBase, AssertsExecutionResults):
         metadata.drop_all()
     def tearDown(self):
         clear_mappers()
-        for t in metadata.table_iterator(reverse=True):
+        for t in reversed(metadata.sorted_tables):
             t.delete().execute()
 
     def testjointo(self):
index 1c3b0f0bc839bff8cf6de97fca3c12e872c41b0d..cc77369379f16d0fa3ce0603d2cbb7c7a136dd56 100644 (file)
@@ -911,7 +911,7 @@ class ORMTest(TestBase, AssertsExecutionResults):
         if not self.keep_mappers:
             clear_mappers()
         if not self.keep_data:
-            for t in _otest_metadata.table_iterator(reverse=True):
+            for t in reversed(_otest_metadata.sorted_tables):
                 try:
                     t.delete().execute().close()
                 except Exception, e: