Commits

Mike Bayer  committed 4f42145

- 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.

  • Participants
  • Parent commits 8e19397

Comments (0)

Files changed (2)

File lib/sqlalchemy/orm/attributes.py

     @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), (), ())

File test/orm/test_attributes.py

                 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),
         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)