summaryrefslogtreecommitdiff
path: root/test/ext/test_mutable.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-12-03 19:49:42 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2012-12-03 19:49:42 -0500
commitd89d71d1dad4b795e14d5395f4008c5027b59baa (patch)
treee77a26aa322836de21ac4e7d352b146a602ef4e9 /test/ext/test_mutable.py
parentc333b680713dd21b4c4bf4e17936dc2d8428d6c5 (diff)
downloadsqlalchemy-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.py71
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):