From 389325099d4d8c0ce42a5a0d5395fbe3ead15af5 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Mon, 22 Oct 2012 13:54:39 -0400 Subject: [PATCH] - fix regression from 0.7 where calling get_history with passive on a never-set collection would fail; made this act just like scalars for now and added tests. I would think that HISTORY_BLANK would be more appropriate here but it's too late in the game to mess with that. --- lib/sqlalchemy/orm/attributes.py | 4 ++++ test/orm/test_attributes.py | 22 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index eec72b5f33..86da9a61d1 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -1216,6 +1216,10 @@ class History(History): @classmethod def from_collection(cls, attribute, state, current): original = state.committed_state.get(attribute.key, _NO_HISTORY) + + if current is NO_VALUE or current is NEVER_SET: + return cls((), (), ()) + current = getattr(current, '_sa_adapter') if original is NO_VALUE: return cls(list(current), (), ()) diff --git a/test/orm/test_attributes.py b/test/orm/test_attributes.py index 46b1a6c3b0..1fc70fd77b 100644 --- a/test/orm/test_attributes.py +++ b/test/orm/test_attributes.py @@ -1382,10 +1382,10 @@ class HistoryTest(fixtures.TestBase): useobject=True) return Foo, Bar - def _someattr_history(self, f): + def _someattr_history(self, f, **kw): return attributes.get_state_history( attributes.instance_state(f), - 'someattr') + 'someattr', **kw) def _commit_someattr(self, f): attributes.instance_state(f)._commit(attributes.instance_dict(f), @@ -1553,6 +1553,24 @@ class HistoryTest(fixtures.TestBase): assert 'someattr' not in f.__dict__ assert 'someattr' not in attributes.instance_state(f).committed_state + def test_collection_never_set(self): + Foo = self._fixture(uselist=True, useobject=True, + active_history=True) + f = Foo() + eq_(self._someattr_history(f, passive=True), ((), (), ())) + + def test_scalar_obj_never_set(self): + Foo = self._fixture(uselist=False, useobject=True, + active_history=True) + f = Foo() + eq_(self._someattr_history(f, passive=True), ((), (), ())) + + def test_scalar_never_set(self): + Foo = self._fixture(uselist=False, useobject=False, + active_history=True) + f = Foo() + eq_(self._someattr_history(f, passive=True), ((), (), ())) + def test_scalar_active_set(self): Foo = self._fixture(uselist=False, useobject=False, active_history=True) -- 2.47.3