diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-07-25 17:08:38 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-07-25 17:08:38 +0000 |
| commit | ed8742e6858f11d48c78fcbbad35e92834aa47f0 (patch) | |
| tree | 1d91b57e5b9b2b48c88fe07a050cb8b3a09c6041 /test/ext/test_associationproxy.py | |
| parent | 87b50f78f068c58addfb78b609238824536f3b03 (diff) | |
| download | sqlalchemy-ed8742e6858f11d48c78fcbbad35e92834aa47f0.tar.gz | |
- The collection proxies produced by associationproxy are now
pickleable. A user-defined proxy_factory however
is still not pickleable unless it defines __getstate__
and __setstate__. [ticket:1446]
Diffstat (limited to 'test/ext/test_associationproxy.py')
| -rw-r--r-- | test/ext/test_associationproxy.py | 100 |
1 files changed, 82 insertions, 18 deletions
diff --git a/test/ext/test_associationproxy.py b/test/ext/test_associationproxy.py index 742f98baf..8df449718 100644 --- a/test/ext/test_associationproxy.py +++ b/test/ext/test_associationproxy.py @@ -1,5 +1,8 @@ -from sqlalchemy.test.testing import eq_, assert_raises, assert_raises_message +from sqlalchemy.test.testing import eq_, assert_raises +import copy import gc +import pickle + from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.orm.collections import collection @@ -15,12 +18,15 @@ class DictCollection(dict): def remove(self, obj): del self[obj.foo] + class SetCollection(set): pass + class ListCollection(list): pass + class ObjectCollection(object): def __init__(self): self.values = list() @@ -33,6 +39,21 @@ class ObjectCollection(object): def __iter__(self): return iter(self.values) + +class Parent(object): + kids = association_proxy('children', 'name') + def __init__(self, name): + self.name = name + +class Child(object): + def __init__(self, name): + self.name = name + +class KVChild(object): + def __init__(self, name, value): + self.name = name + self.value = value + class _CollectionOperations(TestBase): def setup(self): collection_class = self.collection_class @@ -837,29 +858,23 @@ class ReconstitutionTest(TestBase): metadata.create_all() parents.insert().execute(name='p1') - class Parent(object): - kids = association_proxy('children', 'name') - def __init__(self, name): - self.name = name - - class Child(object): - def __init__(self, name): - self.name = name - - mapper(Parent, parents, properties=dict(children=relation(Child))) - mapper(Child, children) self.metadata = metadata - self.Parent = Parent - + self.parents = parents + self.children = children + def teardown(self): self.metadata.drop_all() + clear_mappers() def test_weak_identity_map(self): + mapper(Parent, self.parents, properties=dict(children=relation(Child))) + mapper(Child, self.children) + session = create_session(weak_identity_map=True) def add_child(parent_name, child_name): - parent = (session.query(self.Parent). + parent = (session.query(Parent). filter_by(name=parent_name)).one() parent.kids.append(child_name) @@ -869,12 +884,14 @@ class ReconstitutionTest(TestBase): add_child('p1', 'c2') session.flush() - p = session.query(self.Parent).filter_by(name='p1').one() + p = session.query(Parent).filter_by(name='p1').one() assert set(p.kids) == set(['c1', 'c2']), p.kids def test_copy(self): - import copy - p = self.Parent('p1') + mapper(Parent, self.parents, properties=dict(children=relation(Child))) + mapper(Child, self.children) + + p = Parent('p1') p.kids.extend(['c1', 'c2']) p_copy = copy.copy(p) del p @@ -882,4 +899,51 @@ class ReconstitutionTest(TestBase): assert set(p_copy.kids) == set(['c1', 'c2']), p.kids + def test_pickle_list(self): + mapper(Parent, self.parents, properties=dict(children=relation(Child))) + mapper(Child, self.children) + + p = Parent('p1') + p.kids.extend(['c1', 'c2']) + + r1 = pickle.loads(pickle.dumps(p)) + assert r1.kids == ['c1', 'c2'] + r2 = pickle.loads(pickle.dumps(p.kids)) + assert r2 == ['c1', 'c2'] + + def test_pickle_set(self): + mapper(Parent, self.parents, properties=dict(children=relation(Child, collection_class=set))) + mapper(Child, self.children) + + p = Parent('p1') + p.kids.update(['c1', 'c2']) + + r1 = pickle.loads(pickle.dumps(p)) + assert r1.kids == set(['c1', 'c2']) + + r2 = pickle.loads(pickle.dumps(p.kids)) + assert r2 == set(['c1', 'c2']) + + def test_pickle_dict(self): + mapper(Parent, self.parents, properties=dict( + children=relation(KVChild, collection_class=collections.mapped_collection(PickleKeyFunc('name'))) + )) + mapper(KVChild, self.children) + + p = Parent('p1') + p.kids.update({'c1':'v1', 'c2':'v2'}) + assert p.kids == {'c1':'c1', 'c2':'c2'} + + r1 = pickle.loads(pickle.dumps(p)) + assert r1.kids == {'c1':'c1', 'c2':'c2'} + + r2 = pickle.loads(pickle.dumps(p.kids)) + assert r2 == {'c1':'c1', 'c2':'c2'} + +class PickleKeyFunc(object): + def __init__(self, name): + self.name = name + + def __call__(self, obj): + return getattr(obj, self.name)
\ No newline at end of file |
