summaryrefslogtreecommitdiff
path: root/test/ext/test_mutable.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/ext/test_mutable.py')
-rw-r--r--test/ext/test_mutable.py119
1 files changed, 95 insertions, 24 deletions
diff --git a/test/ext/test_mutable.py b/test/ext/test_mutable.py
index 916ff9d4b..4516e3ac2 100644
--- a/test/ext/test_mutable.py
+++ b/test/ext/test_mutable.py
@@ -59,35 +59,35 @@ class _MutableDictTestBase(object):
assert_raises_message(
ValueError,
"Attribute 'data' does not accept objects of type",
- Foo, data=set([1,2,3])
+ Foo, data=set([1, 2, 3])
)
def test_in_place_mutation(self):
sess = Session()
- f1 = Foo(data={'a':'b'})
+ f1 = Foo(data={'a': 'b'})
sess.add(f1)
sess.commit()
f1.data['a'] = 'c'
sess.commit()
- eq_(f1.data, {'a':'c'})
+ eq_(f1.data, {'a': 'c'})
def test_replace(self):
sess = Session()
- f1 = Foo(data={'a':'b'})
+ f1 = Foo(data={'a': 'b'})
sess.add(f1)
sess.flush()
- f1.data = {'b':'c'}
+ f1.data = {'b': 'c'}
sess.commit()
- eq_(f1.data, {'b':'c'})
+ eq_(f1.data, {'b': 'c'})
def test_pickle_parent(self):
sess = Session()
- f1 = Foo(data={'a':'b'})
+ f1 = Foo(data={'a': 'b'})
sess.add(f1)
sess.commit()
f1.data
@@ -102,7 +102,7 @@ class _MutableDictTestBase(object):
def test_unrelated_flush(self):
sess = Session()
- f1 = Foo(data={"a":"b"}, unrelated_data="unrelated")
+ f1 = Foo(data={"a": "b"}, unrelated_data="unrelated")
sess.add(f1)
sess.flush()
f1.unrelated_data = "unrelated 2"
@@ -114,14 +114,14 @@ class _MutableDictTestBase(object):
def _test_non_mutable(self):
sess = Session()
- f1 = Foo(non_mutable_data={'a':'b'})
+ f1 = Foo(non_mutable_data={'a': 'b'})
sess.add(f1)
sess.commit()
f1.non_mutable_data['a'] = 'c'
sess.commit()
- eq_(f1.non_mutable_data, {'a':'b'})
+ eq_(f1.non_mutable_data, {'a': 'b'})
class MutableWithScalarPickleTest(_MutableDictTestBase, fixtures.MappedTest):
@classmethod
@@ -142,7 +142,7 @@ class MutableWithScalarPickleTest(_MutableDictTestBase, fixtures.MappedTest):
class MutableWithScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
# json introduced in 2.6
- __skip_if__ = lambda : sys.version_info < (2, 6),
+ __skip_if__ = lambda: sys.version_info < (2, 6),
@classmethod
def define_tables(cls, metadata):
@@ -177,7 +177,6 @@ class MutableWithScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
class MutableAssocWithAttrInheritTest(_MutableDictTestBase, fixtures.MappedTest):
@classmethod
def define_tables(cls, metadata):
- MutableDict = cls._type_fixture()
Table('foo', metadata,
Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
@@ -201,24 +200,24 @@ class MutableAssocWithAttrInheritTest(_MutableDictTestBase, fixtures.MappedTest)
def test_in_place_mutation(self):
sess = Session()
- f1 = SubFoo(data={'a':'b'})
+ f1 = SubFoo(data={'a': 'b'})
sess.add(f1)
sess.commit()
f1.data['a'] = 'c'
sess.commit()
- eq_(f1.data, {'a':'c'})
+ eq_(f1.data, {'a': 'c'})
def test_replace(self):
sess = Session()
- f1 = SubFoo(data={'a':'b'})
+ f1 = SubFoo(data={'a': 'b'})
sess.add(f1)
sess.flush()
- f1.data = {'b':'c'}
+ f1.data = {'b': 'c'}
sess.commit()
- eq_(f1.data, {'b':'c'})
+ eq_(f1.data, {'b': 'c'})
class MutableAssociationScalarPickleTest(_MutableDictTestBase, fixtures.MappedTest):
@classmethod
@@ -235,7 +234,7 @@ class MutableAssociationScalarPickleTest(_MutableDictTestBase, fixtures.MappedTe
class MutableAssociationScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest):
# json introduced in 2.6
- __skip_if__ = lambda : sys.version_info < (2, 6),
+ __skip_if__ = lambda: sys.version_info < (2, 6),
@classmethod
def define_tables(cls, metadata):
@@ -259,7 +258,8 @@ class MutableAssociationScalarJSONTest(_MutableDictTestBase, fixtures.MappedTest
MutableDict.associate_with(JSONEncodedDict)
Table('foo', metadata,
- Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
Column('data', JSONEncodedDict),
Column('unrelated_data', String(50))
)
@@ -269,12 +269,19 @@ class _CompositeTestBase(object):
@classmethod
def define_tables(cls, metadata):
Table('foo', metadata,
- Column('id', Integer, primary_key=True, test_needs_autoincrement=True),
+ Column('id', Integer, primary_key=True,
+ test_needs_autoincrement=True),
Column('x', Integer),
Column('y', Integer),
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()
@@ -284,7 +291,6 @@ class _CompositeTestBase(object):
@classmethod
def _type_fixture(cls):
- from sqlalchemy.ext.mutable import Mutable
from sqlalchemy.ext.mutable import MutableComposite
global Point
@@ -322,7 +328,7 @@ class MutableCompositesUnpickleTest(_CompositeTestBase, fixtures.MappedTest):
cls.Point = cls._type_fixture()
mapper(FooWithEq, foo, properties={
- 'data':composite(cls.Point, foo.c.x, foo.c.y)
+ 'data': composite(cls.Point, foo.c.x, foo.c.y)
})
def test_unpickle_modified_eq(self):
@@ -339,7 +345,7 @@ class MutableCompositesTest(_CompositeTestBase, fixtures.MappedTest):
Point = cls._type_fixture()
mapper(Foo, foo, properties={
- 'data':composite(Point, foo.c.x, foo.c.y)
+ 'data': composite(Point, foo.c.x, foo.c.y)
})
def test_in_place_mutation(self):
@@ -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):
@@ -423,7 +494,7 @@ class MutableInheritedCompositesTest(_CompositeTestBase, fixtures.MappedTest):
Point = cls._type_fixture()
mapper(Foo, foo, properties={
- 'data':composite(Point, foo.c.x, foo.c.y)
+ 'data': composite(Point, foo.c.x, foo.c.y)
})
mapper(SubFoo, subfoo, inherits=Foo)