From: Mike Bayer Date: Mon, 22 Oct 2012 17:54:39 +0000 (-0400) Subject: - fix regression from 0.7 where calling get_history with passive X-Git-Tag: rel_0_8_0b1~30 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=389325099d4d8c0ce42a5a0d5395fbe3ead15af5;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - 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. --- 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)