diff options
| author | Jason Kirtland <jek@discorporate.us> | 2008-01-04 20:40:22 +0000 |
|---|---|---|
| committer | Jason Kirtland <jek@discorporate.us> | 2008-01-04 20:40:22 +0000 |
| commit | 38bcc2b2f8eab265bf3fc93faf79ee72845f1313 (patch) | |
| tree | 972e897815ec2f4461c20b7a4dbb5c870b8cbd0e | |
| parent | a230391a37e1f6b7aaef6adef4a57da24588432b (diff) | |
| download | sqlalchemy-38bcc2b2f8eab265bf3fc93faf79ee72845f1313.tar.gz | |
Refined bulk-assignment aspects of the r3999 in-place collection operator fix. Also? r4000!
| -rw-r--r-- | lib/sqlalchemy/orm/attributes.py | 8 | ||||
| -rw-r--r-- | test/orm/collection.py | 21 |
2 files changed, 28 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/attributes.py b/lib/sqlalchemy/orm/attributes.py index 0937568e2..21b8a4e64 100644 --- a/lib/sqlalchemy/orm/attributes.py +++ b/lib/sqlalchemy/orm/attributes.py @@ -532,8 +532,14 @@ class CollectionAttributeImpl(AttributeImpl): new_values = list(new_collection.adapt_like_to_iterable(value)) old = self.get(state) + + # ignore re-assignment of the current collection, as happens + # implicitly with in-place operators (foo.collection |= other) + if old is value: + return + state.committed_state[self.key] = self.copy(old) - + old_collection = self.get_collection(state, old) idset = util.IdentitySet diff --git a/test/orm/collection.py b/test/orm/collection.py index 6e50a8512..fb4dbf199 100644 --- a/test/orm/collection.py +++ b/test/orm/collection.py @@ -443,6 +443,12 @@ class CollectionsTest(PersistTest): control |= values assert_eq() + # cover self-assignment short-circuit + values = set([e, creator(), creator()]) + obj.attr |= values + control |= values + assert_eq() + try: direct |= [e, creator()] assert False @@ -483,6 +489,11 @@ class CollectionsTest(PersistTest): control -= values assert_eq() + values = set([creator()]) + obj.attr -= values + control -= values + assert_eq() + try: direct -= [e, creator()] assert False @@ -519,6 +530,11 @@ class CollectionsTest(PersistTest): control &= values assert_eq() + values.update(set([creator()])) + obj.attr &= values + control &= values + assert_eq() + try: direct &= [e, creator()] assert False @@ -569,6 +585,11 @@ class CollectionsTest(PersistTest): control ^= values assert_eq() + values = set([creator()]) + obj.attr ^= values + control ^= values + assert_eq() + try: direct ^= [e, creator()] assert False |
