]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- :func:`.composite` will raise an informative error message when the
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 12 Dec 2013 18:30:16 +0000 (13:30 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 12 Dec 2013 18:32:57 +0000 (13:32 -0500)
columns/attribute (names) passed don't resolve to a Column or mapped
attribute (such as an erroneous tuple); previously raised an unbound
local. [ticket:2889]

Conflicts:
test/orm/test_composites.py

doc/build/changelog/changelog_08.rst
lib/sqlalchemy/orm/descriptor_props.py
test/orm/test_composites.py

index b65dd77cd98810be38b2ddf53e5c60f5f69a55b8..6ca5a6e6980cf3a779b53ac71cc4f3875c970425 100644 (file)
 .. changelog::
     :version: 0.8.5
 
+    .. change::
+        :tags: bug, orm
+        :versions: 0.9.0b2
+        :tickets: 2889
+
+        :func:`.composite` will raise an informative error message when the
+        columns/attribute (names) passed don't resolve to a Column or mapped
+        attribute (such as an erroneous tuple); previously raised an unbound
+        local.
+
     .. change::
         :tags: bug, declarative
         :versions: 0.9.0b2
index e4c0d1525a570b56ed2bb33de7d19b93dca07e0d..ea38182fb059ee1b385da72006985011da25353c 100644 (file)
@@ -190,6 +190,11 @@ class CompositeProperty(DescriptorProperty):
                 prop = self.parent._columntoproperty[attr]
             elif isinstance(attr, attributes.InstrumentedAttribute):
                 prop = attr.property
+            else:
+                raise sa_exc.ArgumentError(
+                        "Composite expects Column or Column-bound "
+                        "attributes/attribute names as arguments, got: %r"
+                        % (attr,))
             props.append(prop)
 
     @property
index 9b582ce17af8fe08c4a758a590e1e5f1913c26d6..5c9dbbd1756708ed3752121fe03c9ad69e9ab307 100644 (file)
@@ -6,7 +6,7 @@ from sqlalchemy import MetaData, Integer, String, ForeignKey, func, \
 from sqlalchemy.testing.schema import Table, Column
 from sqlalchemy.orm import mapper, relationship, backref, \
     class_mapper, CompositeProperty, \
-    validates, aliased
+    validates, aliased, configure_mappers
 from sqlalchemy.orm import attributes, \
     composite, relationship, \
     Session
@@ -712,6 +712,24 @@ class ConfigurationTest(fixtures.MappedTest):
         })
         self._test_roundtrip()
 
+    def test_check_prop_type(self):
+        edge, Edge, Point = (self.tables.edge,
+                                self.classes.Edge,
+                                self.classes.Point)
+        mapper(Edge, edge, properties={
+            'start': sa.orm.composite(Point, (edge.c.x1,), edge.c.y1),
+        })
+        assert_raises_message(
+            sa.exc.ArgumentError,
+            # note that we also are checking that the tuple
+            # renders here, so the "%" operator in the string needs to
+            # apply the tuple also
+            r"Composite expects Column or Column-bound "
+            "attributes/attribute names as "
+            "arguments, got: \(Column",
+            configure_mappers
+        )
+
 class ComparatorTest(fixtures.MappedTest, testing.AssertsCompiledSQL):
     __dialect__ = 'default'