From: Mike Bayer Date: Mon, 26 Sep 2011 21:43:53 +0000 (-0400) Subject: warn when a subclass' base uses @declared_attr for a regular column - X-Git-Tag: rel_0_7_3~21 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5ca662f7bc172daa51e7776d496eeea886761981;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git warn when a subclass' base uses @declared_attr for a regular column - does not propagate to subclasses. [ticket:2283] --- diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index b586854146..efaf8f8dbb 100755 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -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. diff --git a/test/ext/test_declarative.py b/test/ext/test_declarative.py index e338ef0396..d8be6ac8eb 100644 --- a/test/ext/test_declarative.py +++ b/test/ext/test_declarative.py @@ -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 " + " is " + "mapped - not applying to subclass .", + go + ) + def test_column(self): class User(Base, fixtures.ComparableEntity):