]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
warn when a subclass' base uses @declared_attr for a regular column -
authorMike Bayer <mike_mp@zzzcomputing.com>
Mon, 26 Sep 2011 21:43:53 +0000 (17:43 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Mon, 26 Sep 2011 21:43:53 +0000 (17:43 -0400)
does not propagate to subclasses.  [ticket:2283]

lib/sqlalchemy/ext/declarative.py
test/ext/test_declarative.py

index b586854146c22895a522cc64948410b58710ce3b..efaf8f8dbb582cb2059b16fc1a2c3cc029a6a2f0 100755 (executable)
@@ -1030,6 +1030,12 @@ def _as_declarative(cls, classname, dict_):
                     if base is not cls:
                         inherited_table_args = True
             elif class_mapped:
+                if isinstance(obj, declarative_props):
+                    util.warn("Regular (i.e. not __special__) "
+                            "attribute '%s.%s' uses @declared_attr, "
+                            "but owning class %s is mapped - "
+                            "not applying to subclass %s." 
+                            % (base.__name__, name, base, cls))
                 continue
             elif base is not cls:
                 # we're a mixin.
index e338ef0396b34ec42061cf2ca673e992bdea38cb..d8be6ac8eba0563b8fa9dc7a0014ddeaed7fe669 100644 (file)
@@ -799,6 +799,27 @@ class DeclarativeTest(DeclarativeTestBase):
         eq_(sess.query(User).all(), [User(name='u1', address_count=2,
             addresses=[Address(email='one'), Address(email='two')])])
 
+    def test_useless_declared_attr_warns_on_subclass(self):
+        def go():
+            class MyBase(Base):
+                __tablename__ = 'foo'
+                id = Column(Integer, primary_key=True)
+                @declared_attr
+                def somecol(cls):
+                    return Column(Integer)
+
+            class MyClass(MyBase):
+                __tablename__ = 'bar'
+        assert_raises_message(
+            sa.exc.SAWarning,
+            r"Regular \(i.e. not __special__\) attribute 'MyBase.somecol' "
+            "uses @declared_attr, but owning class "
+            "<class 'test.ext.test_declarative.MyBase'> is "
+            "mapped - not applying to subclass <class "
+            "'test.ext.test_declarative.MyClass'>.",
+            go
+        )
+
     def test_column(self):
 
         class User(Base, fixtures.ComparableEntity):