]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
added nicer error message to dependent class not found
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 22 Mar 2008 22:30:08 +0000 (22:30 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 22 Mar 2008 22:30:08 +0000 (22:30 +0000)
lib/sqlalchemy/ext/declarative.py
test/ext/declarative.py

index 784236662f4e91d3e1de33018ab71ce24f85e5dd..62691a906a22ec8bd24374d58cafc5dc48b70599 100644 (file)
@@ -161,7 +161,7 @@ from sqlalchemy.schema import Table, SchemaItem, Column, MetaData
 from sqlalchemy.orm import synonym as _orm_synonym, mapper, comparable_property
 from sqlalchemy.orm.interfaces import MapperProperty
 from sqlalchemy.orm.properties import PropertyLoader, ColumnProperty
-from sqlalchemy import util
+from sqlalchemy import util, exceptions
 
 __all__ = ['declarative_base', 'synonym_for', 'comparable_using',
            'declared_synonym']
@@ -237,7 +237,10 @@ def _deferred_relation(cls, prop):
     if isinstance(prop, PropertyLoader) and isinstance(prop.argument, basestring):
         arg = prop.argument
         def return_cls():
-            return cls._decl_class_registry[arg]
+            try:
+                return cls._decl_class_registry[arg]
+            except KeyError:
+                raise exceptions.InvalidRequestError("When compiling mapper %s, could not locate a declarative class named %r.  Consider adding this property to the %r class after both dependent classes have been defined." % (prop.parent, arg, prop.parent.class_))
         prop.argument = return_cls
 
     return prop
index 6e7ff361c94fc3ad7a47bab81cd3683cd45c558e..6b6b90ea058aabe20e4c22fc5ebd3866066a4888 100644 (file)
@@ -57,6 +57,20 @@ class DeclarativeTest(TestBase, AssertsExecutionResults):
         self.assertEquals(a1, Address(email='two'))
         self.assertEquals(a1.user, User(name='u1'))
 
+    def test_nice_dependency_error(self):
+        class User(Base):
+            __tablename__ = 'users'
+            id = Column('id', Integer, primary_key=True)
+            addresses = relation("Address")
+        
+        def go():
+            class Address(Base):
+                __tablename__ = 'addresses'
+
+                id = Column(Integer, primary_key=True)
+                foo = column_property(User.id==5)
+        self.assertRaises(exceptions.InvalidRequestError, go)
+        
     def test_add_prop(self):
         class User(Base, Fixture):
             __tablename__ = 'users'