diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-12-03 19:49:42 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2012-12-03 19:49:42 -0500 |
| commit | d89d71d1dad4b795e14d5395f4008c5027b59baa (patch) | |
| tree | e77a26aa322836de21ac4e7d352b146a602ef4e9 /test/ext/test_mutable.py | |
| parent | c333b680713dd21b4c4bf4e17936dc2d8428d6c5 (diff) | |
| download | sqlalchemy-d89d71d1dad4b795e14d5395f4008c5027b59baa.tar.gz | |
The :class:`.MutableComposite` type did not allow for the
:meth:`.MutableBase.coerce` method to be used, even though
the code seemed to indicate this intent, so this now works
and a brief example is added. As a side-effect,
the mechanics of this event handler have been changed so that
new :class:`.MutableComposite` types no longer add per-type
global event handlers. Also in 0.7.10
[ticket:2624]
Diffstat (limited to 'test/ext/test_mutable.py')
| -rw-r--r-- | test/ext/test_mutable.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py index 57b87dcaa..4516e3ac2 100644 --- a/test/ext/test_mutable.py +++ b/test/ext/test_mutable.py @@ -276,6 +276,12 @@ class _CompositeTestBase(object): Column('unrelated_data', String(50)) ) + def setup(self): + from sqlalchemy.ext import mutable + mutable._setup_composite_listener() + super(_CompositeTestBase, self).setup() + + def teardown(self): # clear out mapper events Mapper.dispatch._clear() @@ -403,6 +409,71 @@ class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest): eq_(f1.data.x, 5) +class MutableCompositeCustomCoerceTest(_CompositeTestBase, fixtures.MappedTest): + @classmethod + def _type_fixture(cls): + + from sqlalchemy.ext.mutable import MutableComposite + + global Point + + class Point(MutableComposite): + def __init__(self, x, y): + self.x = x + self.y = y + + @classmethod + def coerce(cls, key, value): + if isinstance(value, tuple): + value = Point(*value) + return value + + def __setattr__(self, key, value): + object.__setattr__(self, key, value) + self.changed() + + def __composite_values__(self): + return self.x, self.y + + def __getstate__(self): + return self.x, self.y + + def __setstate__(self, state): + self.x, self.y = state + + def __eq__(self, other): + return isinstance(other, Point) and \ + other.x == self.x and \ + other.y == self.y + return Point + + + @classmethod + def setup_mappers(cls): + foo = cls.tables.foo + + Point = cls._type_fixture() + + mapper(Foo, foo, properties={ + 'data': composite(Point, foo.c.x, foo.c.y) + }) + + def test_custom_coerce(self): + f = Foo() + f.data = (3, 4) + eq_(f.data, Point(3, 4)) + + def test_round_trip_ok(self): + sess = Session() + f = Foo() + f.data = (3, 4) + + sess.add(f) + sess.commit() + + eq_(f.data, Point(3, 4)) + + class MutableInheritedCompositesTest(_CompositeTestBase, fixtures.MappedTest): @classmethod def define_tables(cls, metadata): |
