]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Implement SynonymProperty.get_history()
authorMike Bayer <mike_mp@zzzcomputing.com>
Thu, 27 Dec 2018 17:39:15 +0000 (12:39 -0500)
committerMike Bayer <mike_mp@zzzcomputing.com>
Thu, 27 Dec 2018 17:39:15 +0000 (12:39 -0500)
Implemented the ``.get_history()`` method, which also implies availability
of :attr:`.AttributeState.history`, for :func:`.synonym` attributes.
Previously, trying to access attribute history via a synonym would raise an
``AttributeError``.

Fixes: #3777
Change-Id: I20810a8b1a1bf630dbcb6622193c13cf4236b94a

doc/build/changelog/unreleased_13/3777.rst [new file with mode: 0644]
lib/sqlalchemy/orm/descriptor_props.py
test/orm/test_mapper.py

diff --git a/doc/build/changelog/unreleased_13/3777.rst b/doc/build/changelog/unreleased_13/3777.rst
new file mode 100644 (file)
index 0000000..043cdbf
--- /dev/null
@@ -0,0 +1,8 @@
+.. change::
+   :tags: bug, orm
+   :tickets: 3777
+
+   Implemented the ``.get_history()`` method, which also implies availability
+   of :attr:`.AttributeState.history`, for :func:`.synonym` attributes.
+   Previously, trying to access attribute history via a synonym would raise an
+   ``AttributeError``.
index 3fefc5bba7e9d5a3c3650c8adec94a1365142036..24a12193bcaf670407ab24de3b5d84594be434e4 100644 (file)
@@ -660,6 +660,10 @@ class SynonymProperty(DescriptorProperty):
             comp = prop.comparator_factory(prop, mapper)
         return comp
 
+    def get_history(self, *arg, **kw):
+        attr = getattr(self.parent.class_, self.name)
+        return attr.impl.get_history(*arg, **kw)
+
     def set_parent(self, parent, init):
         if self.map_column:
             # implement the 'map_column' option.
index 0ff9c12ad37fdb2f60da321c83bbf2de17e6dfc0..487299f298a280dd5591867dfc17319e97ed14c8 100644 (file)
@@ -1381,6 +1381,23 @@ class MapperTest(_fixtures.FixtureTest, AssertsCompiledSQL):
         u = s.query(User).filter(User.y == 8).one()
         eq_(u.y, 8)
 
+    def test_synonym_get_history(self):
+        users, User = (self.tables.users,
+                       self.classes.User)
+
+        mapper(User, users, properties={
+            'x': synonym('id'),
+            'y': synonym('x')
+        })
+
+        u1 = User()
+        eq_(attributes.instance_state(u1).attrs.x.history, (None, None, None))
+        eq_(attributes.instance_state(u1).attrs.y.history, (None, None, None))
+
+        u1.y = 5
+        eq_(attributes.instance_state(u1).attrs.x.history, ([5], (), ()))
+        eq_(attributes.instance_state(u1).attrs.y.history, ([5], (), ()))
+
     def test_synonym_of_non_property_raises(self):
         from sqlalchemy.ext.associationproxy import association_proxy