]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Added a slightly nicer __repr__() to SchemaItem
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 14 Aug 2011 16:20:54 +0000 (12:20 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 14 Aug 2011 16:20:54 +0000 (12:20 -0400)
classes.  Note the repr here can't fully support
the "repr is the constructor" idea since schema
items can be very deeply nested/cyclical, have
late initialization of some things, etc.
[ticket:2223]

CHANGES
lib/sqlalchemy/schema.py
lib/sqlalchemy/util/langhelpers.py
test/aaa_profiling/test_orm.py
test/sql/test_metadata.py

diff --git a/CHANGES b/CHANGES
index 4f244b4458b5aa4693ff2ff7164db9dd1b098e16..5c1b2425cbb17fd83224e276b074c5a5fb51aae8 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -34,6 +34,14 @@ CHANGES
     on a new mapper would establish a backref on the
     first mapper.
 
+- schema
+  - Added a slightly nicer __repr__() to SchemaItem
+    classes.  Note the repr here can't fully support
+    the "repr is the constructor" idea since schema
+    items can be very deeply nested/cyclical, have
+    late initialization of some things, etc.
+    [ticket:2223]
+
 - engine
   - The recreate() method in all pool classes uses
     self.__class__ to get at the type of pool
index 7b5b3ab70ca98caa04947cde9b1f89a1f0d4f6fa..8fd4e75781b99f3513dbeb6fb92c2a1b1cfa4845 100644 (file)
@@ -68,7 +68,7 @@ class SchemaItem(events.SchemaEventTarget, visitors.Visitable):
         return []
 
     def __repr__(self):
-        return "%s()" % self.__class__.__name__
+        return util.generic_repr(self)
 
     @util.memoized_property
     def info(self):
@@ -918,7 +918,7 @@ class Column(SchemaItem, expression.ColumnClause):
             [repr(x) for x in self.foreign_keys if x is not None] +
             [repr(x) for x in self.constraints] +
             [(self.table is not None and "table=<%s>" % 
-                    self.table.description or "")] +
+                    self.table.description or "table=None")] +
             ["%s=%s" % (k, repr(getattr(self, k))) for k in kwarg])
 
     def _set_parent(self, table):
@@ -1401,9 +1401,6 @@ class DefaultGenerator(_NotAColumnExpr, SchemaItem):
         else:
             return None
 
-    def __repr__(self):
-        return "DefaultGenerator()"
-
 
 class ColumnDefault(DefaultGenerator):
     """A plain default value on a column.
@@ -1600,12 +1597,6 @@ class Sequence(DefaultGenerator):
         """
         return expression.func.next_value(self, bind=self.bind)
 
-    def __repr__(self):
-        return "Sequence(%s)" % ', '.join(
-            [repr(self.name)] +
-            ["%s=%s" % (k, repr(getattr(self, k)))
-             for k in ['start', 'increment', 'optional']])
-
     def _set_parent(self, column):
         super(Sequence, self)._set_parent(column)
         column._on_table_attach(self._set_table)
@@ -1681,8 +1672,7 @@ class FetchedValue(_NotAColumnExpr, events.SchemaEventTarget):
             self.column.server_default = self
 
     def __repr__(self):
-        return 'FetchedValue(for_update=%r)' % self.for_update
-
+        return util.generic_repr(self)
 
 class DefaultClause(FetchedValue):
     """A DDL-specified DEFAULT column value.
@@ -2178,10 +2168,12 @@ class Index(ColumnCollectionMixin, SchemaItem):
         bind._run_visitor(ddl.SchemaDropper, self)
 
     def __repr__(self):
-        return 'Index("%s", %s%s)' % (
-                    self.name,
-                      ', '.join(repr(c) for c in self.columns),
-                      (self.unique and ', unique=True') or '')
+        return 'Index(%s)' % (
+                    ", ".join(
+                        [repr(self.name)] + 
+                        [repr(c) for c in self.columns] +
+                        (self.unique and ["unique=True"] or [])
+                    ))
 
 class MetaData(SchemaItem):
     """A collection of :class:`.Table` objects and their associated schema constructs.
@@ -2248,7 +2240,7 @@ class MetaData(SchemaItem):
             self.reflect()
 
     def __repr__(self):
-        return 'MetaData(%r)' % self.bind
+        return 'MetaData(bind=%r)' % self.bind
 
     def __contains__(self, table_or_key):
         if not isinstance(table_or_key, basestring):
index 11d4cdaf60b500ffcf501ece62265cfff851f3a4..453cafd830f3d7dbe034831685a487af093326d0 100644 (file)
@@ -237,9 +237,12 @@ def generic_repr(obj):
             for arg in args[1:-default_len]:
                 yield repr(getattr(obj, arg, None))
             for (arg, defval) in zip(args[-default_len:], defaults):
-                val = getattr(obj, arg, None)
-                if val != defval:
-                    yield '%s=%r' % (arg, val)
+                try:
+                    val = getattr(obj, arg, None)
+                    if val != defval:
+                        yield '%s=%r' % (arg, val)
+                except:
+                    pass
     return "%s(%s)" % (obj.__class__.__name__, ", ".join(genargs()))
 
 class portable_instancemethod(object):
index 9e30c0b4aefebd59517cf5db65dd1fc6ca2b58c4..4da0979948a0b6b972d3c0a45c3d3ea82004776f 100644 (file)
@@ -196,6 +196,8 @@ class LoadManyToOneFromIdentityTest(fixtures.MappedTest):
         go()
 
 class MergeBackrefsTest(fixtures.MappedTest):
+    __only_on__ = 'sqlite'  # keep things simple
+
     @classmethod
     def define_tables(cls, metadata):
         Table('a', metadata,
index 406db27a7a8f51814411f2266a09a0d65d5d1a11..2107a3a77de30a522de5f080d6b08341c6135843 100644 (file)
@@ -549,6 +549,35 @@ class MetaDataTest(fixtures.TestBase, ComparesTables):
                           'fake_table',
                           MetaData(testing.db), autoload=True)
 
+    def test_assorted_repr(self):
+        t1 = Table("foo", MetaData(), Column("x", Integer))
+        i1 = Index("bar", t1.c.x)
+        ck = schema.CheckConstraint("x > y", name="someconstraint")
+
+        for const, exp in (
+            (Sequence("my_seq"), 
+                "Sequence('my_seq')"),
+            (Sequence("my_seq", start=5), 
+                "Sequence('my_seq', start=5)"),
+            (Column("foo", Integer), 
+                "Column('foo', Integer(), table=None)"),
+            (Table("bar", MetaData(), Column("x", String)), 
+                "Table('bar', MetaData(bind=None), "
+                "Column('x', String(), table=<bar>), schema=None)"),
+            (schema.DefaultGenerator(for_update=True), 
+                "DefaultGenerator(for_update=True)"),
+            (schema.Index("bar"), "Index('bar')"),
+            (i1, "Index('bar', Column('x', Integer(), table=<foo>))"),
+            (schema.FetchedValue(), "FetchedValue()"),
+            (ck, 
+                    "CheckConstraint("
+                    "%s"
+                    ", name='someconstraint')" % repr(ck.sqltext)),
+        ):
+            eq_(
+                repr(const),
+                exp
+            )
 
 class TableTest(fixtures.TestBase, AssertsCompiledSQL):
     def test_prefixes(self):
@@ -1138,7 +1167,7 @@ class CatchAllEventsTest(fixtures.TestBase):
             canary.append("%s->%s" % (obj.__class__.__name__, parent.__class__.__name__))
 
         def after_attach(obj, parent):
-            canary.append("%s->%s" % (obj, parent))
+            canary.append("%s->%s" % (obj.__class__.__name__, parent))
 
         event.listen(schema.SchemaItem, "before_parent_attach", before_attach)
         event.listen(schema.SchemaItem, "after_parent_attach", after_attach)
@@ -1154,22 +1183,15 @@ class CatchAllEventsTest(fixtures.TestBase):
 
         eq_(
             canary,
-            [
-                'Sequence->Column', 
-                "Sequence('foo_id', start=None, increment=None, optional=False)->id", 
-                'ForeignKey->Column', 
-                "ForeignKey('t2.id')->bar", 
-                'Table->MetaData', 
-                'PrimaryKeyConstraint->Table', 'PrimaryKeyConstraint()->t1',
-                'Column->Table', 't1.id->t1', 
-                'Column->Table', 't1.bar->t1', 
-                'ForeignKeyConstraint->Table', 
-                'ForeignKeyConstraint()->t1', 
-                't1->MetaData(None)', 
-                'Table->MetaData', 
-                'PrimaryKeyConstraint->Table', 'PrimaryKeyConstraint()->t2', 
-                'Column->Table', 
-                't2.id->t2', 't2->MetaData(None)']
+            ['Sequence->Column', 'Sequence->id', 'ForeignKey->Column',
+             'ForeignKey->bar', 'Table->MetaData',
+             'PrimaryKeyConstraint->Table', 'PrimaryKeyConstraint->t1',
+             'Column->Table', 'Column->t1', 'Column->Table',
+             'Column->t1', 'ForeignKeyConstraint->Table',
+             'ForeignKeyConstraint->t1', 'Table->MetaData(bind=None)',
+             'Table->MetaData', 'PrimaryKeyConstraint->Table',
+             'PrimaryKeyConstraint->t2', 'Column->Table', 'Column->t2',
+             'Table->MetaData(bind=None)']
         )
 
     def test_events_per_constraint(self):