summaryrefslogtreecommitdiff
path: root/test/orm/attributes.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/attributes.py')
-rw-r--r--test/orm/attributes.py192
1 files changed, 96 insertions, 96 deletions
diff --git a/test/orm/attributes.py b/test/orm/attributes.py
index 7ec838458..4b6e5e19b 100644
--- a/test/orm/attributes.py
+++ b/test/orm/attributes.py
@@ -1,4 +1,4 @@
-import testbase
+import testenv; testenv.configure_for_tests()
import pickle
import sqlalchemy.orm.attributes as attributes
from sqlalchemy.orm.collections import collection
@@ -17,17 +17,17 @@ class AttributesTest(PersistTest):
def test_basic(self):
class User(object):pass
-
+
attributes.register_class(User)
attributes.register_attribute(User, 'user_id', uselist = False, useobject=False)
attributes.register_attribute(User, 'user_name', uselist = False, useobject=False)
attributes.register_attribute(User, 'email_address', uselist = False, useobject=False)
-
+
u = User()
u.user_id = 7
u.user_name = 'john'
u.email_address = 'lala@123.com'
-
+
self.assert_(u.user_id == 7 and u.user_name == 'john' and u.email_address == 'lala@123.com')
u._state.commit_all()
self.assert_(u.user_id == 7 and u.user_name == 'john' and u.email_address == 'lala@123.com')
@@ -60,7 +60,7 @@ class AttributesTest(PersistTest):
pk_o2 = pickle.dumps(o2)
# so... pickle is creating a new 'mt2' string after a roundtrip here,
- # so we'll brute-force set it to be id-equal to the original string
+ # so we'll brute-force set it to be id-equal to the original string
if False:
o_mt2_str = [ k for k in o.__dict__ if k == 'mt2'][0]
o2_mt2_str = [ k for k in o2.__dict__ if k == 'mt2'][0]
@@ -97,22 +97,22 @@ class AttributesTest(PersistTest):
def test_deferred(self):
class Foo(object):pass
-
+
data = {'a':'this is a', 'b':12}
def loader(instance, keys):
for k in keys:
instance.__dict__[k] = data[k]
return attributes.ATTR_WAS_SET
-
+
attributes.register_class(Foo, deferred_scalar_loader=loader)
attributes.register_attribute(Foo, 'a', uselist=False, useobject=False)
attributes.register_attribute(Foo, 'b', uselist=False, useobject=False)
-
+
f = Foo()
f._state.expire_attributes(None)
self.assertEquals(f.a, "this is a")
self.assertEquals(f.b, 12)
-
+
f.a = "this is some new a"
f._state.expire_attributes(None)
self.assertEquals(f.a, "this is a")
@@ -130,7 +130,7 @@ class AttributesTest(PersistTest):
del f.a
self.assertEquals(f.a, None)
self.assertEquals(f.b, 12)
-
+
f._state.commit_all()
self.assertEquals(f.a, None)
self.assertEquals(f.b, 12)
@@ -141,11 +141,11 @@ class AttributesTest(PersistTest):
for k in keys:
instance.__dict__[k] = data[k]
return attributes.ATTR_WAS_SET
-
+
attributes.register_class(MyTest, deferred_scalar_loader=loader)
attributes.register_attribute(MyTest, 'a', uselist=False, useobject=False)
attributes.register_attribute(MyTest, 'b', uselist=False, useobject=False)
-
+
m = MyTest()
m._state.expire_attributes(None)
assert 'a' not in m.__dict__
@@ -153,11 +153,11 @@ class AttributesTest(PersistTest):
assert 'a' not in m2.__dict__
self.assertEquals(m2.a, "this is a")
self.assertEquals(m2.b, 12)
-
+
def test_list(self):
class User(object):pass
class Address(object):pass
-
+
attributes.register_class(User)
attributes.register_class(Address)
attributes.register_attribute(User, 'user_id', uselist = False, useobject=False)
@@ -165,7 +165,7 @@ class AttributesTest(PersistTest):
attributes.register_attribute(User, 'addresses', uselist = True, useobject=True)
attributes.register_attribute(Address, 'address_id', uselist = False, useobject=False)
attributes.register_attribute(Address, 'email_address', uselist = False, useobject=False)
-
+
u = User()
u.user_id = 7
u.user_name = 'john'
@@ -185,7 +185,7 @@ class AttributesTest(PersistTest):
a.email_address = 'foo@bar.com'
u.addresses.append(a)
self.assert_(u.user_id == 7 and u.user_name == 'heythere' and u.addresses[0].email_address == 'lala@123.com' and u.addresses[1].email_address == 'foo@bar.com')
-
+
def test_lazytrackparent(self):
"""test that the "hasparent" flag works properly when lazy loaders and backrefs are used"""
@@ -193,8 +193,8 @@ class AttributesTest(PersistTest):
class Blog(object):pass
attributes.register_class(Post)
attributes.register_class(Blog)
-
- # set up instrumented attributes with backrefs
+
+ # set up instrumented attributes with backrefs
attributes.register_attribute(Post, 'blog', uselist=False, extension=attributes.GenericBackrefExtension('posts'), trackparent=True, useobject=True)
attributes.register_attribute(Blog, 'posts', uselist=True, extension=attributes.GenericBackrefExtension('blog'), trackparent=True, useobject=True)
@@ -212,23 +212,23 @@ class AttributesTest(PersistTest):
# assert connections
assert p1.blog is b
assert p1 in b.posts
-
+
# manual connections
b2 = Blog()
p2 = Post()
b2.posts.append(p2)
assert attributes.has_parent(Blog, p2, 'posts')
assert attributes.has_parent(Post, b2, 'blog')
-
+
def test_inheritance(self):
"""tests that attributes are polymorphic"""
class Foo(object):pass
class Bar(Foo):pass
-
-
+
+
attributes.register_class(Foo)
attributes.register_class(Bar)
-
+
def func1():
print "func1"
return "this is the foo attr"
@@ -241,7 +241,7 @@ class AttributesTest(PersistTest):
attributes.register_attribute(Foo, 'element', uselist=False, callable_=lambda o:func1, useobject=True)
attributes.register_attribute(Foo, 'element2', uselist=False, callable_=lambda o:func3, useobject=True)
attributes.register_attribute(Bar, 'element', uselist=False, callable_=lambda o:func2, useobject=True)
-
+
x = Foo()
y = Bar()
assert x.element == 'this is the foo attr'
@@ -258,22 +258,22 @@ class AttributesTest(PersistTest):
def __init__(self):
states.add(self._state)
Foo.__init__(self)
-
-
+
+
attributes.register_class(Foo)
attributes.register_class(Bar)
-
+
b = Bar()
self.assertEquals(len(states), 1)
self.assertEquals(list(states)[0].obj(), b)
-
+
def test_inheritance2(self):
"""test that the attribute manager can properly traverse the managed attributes of an object,
if the object is of a descendant class with managed attributes in the parent class"""
class Foo(object):pass
class Bar(Foo):pass
-
+
attributes.register_class(Foo)
attributes.register_class(Bar)
attributes.register_attribute(Foo, 'element', uselist=False, useobject=True)
@@ -293,7 +293,7 @@ class AttributesTest(PersistTest):
pass
class Bar(fixtures.Base):
pass
-
+
attributes.register_class(Foo)
attributes.register_class(Bar)
@@ -311,33 +311,33 @@ class AttributesTest(PersistTest):
x._state.commit_all()
x.col2.append(bar4)
self.assertEquals(attributes.get_history(x._state, 'col2'), ([bar4], [bar1, bar2, bar3], []))
-
- def test_parenttrack(self):
+
+ def test_parenttrack(self):
class Foo(object):pass
class Bar(object):pass
-
+
attributes.register_class(Foo)
attributes.register_class(Bar)
-
+
attributes.register_attribute(Foo, 'element', uselist=False, trackparent=True, useobject=True)
attributes.register_attribute(Bar, 'element', uselist=False, trackparent=True, useobject=True)
-
+
f1 = Foo()
f2 = Foo()
b1 = Bar()
b2 = Bar()
-
+
f1.element = b1
b2.element = f2
-
+
assert attributes.has_parent(Foo, b1, 'element')
assert not attributes.has_parent(Foo, b2, 'element')
assert not attributes.has_parent(Foo, f2, 'element')
assert attributes.has_parent(Bar, f2, 'element')
-
+
b2.element = None
assert not attributes.has_parent(Bar, f2, 'element')
-
+
# test that double assignment doesn't accidentally reset the 'parent' flag.
b3 = Bar()
f4 = Foo()
@@ -349,25 +349,25 @@ class AttributesTest(PersistTest):
def test_mutablescalars(self):
"""test detection of changes on mutable scalar items"""
class Foo(object):pass
-
+
attributes.register_class(Foo)
attributes.register_attribute(Foo, 'element', uselist=False, copy_function=lambda x:[y for y in x], mutable_scalars=True, useobject=False)
x = Foo()
- x.element = ['one', 'two', 'three']
+ x.element = ['one', 'two', 'three']
x._state.commit_all()
x.element[1] = 'five'
assert x._state.is_modified()
-
+
attributes.unregister_class(Foo)
-
+
attributes.register_class(Foo)
attributes.register_attribute(Foo, 'element', uselist=False, useobject=False)
x = Foo()
- x.element = ['one', 'two', 'three']
+ x.element = ['one', 'two', 'three']
x._state.commit_all()
x.element[1] = 'five'
assert not x._state.is_modified()
-
+
def test_descriptorattributes(self):
"""changeset: 1633 broke ability to use ORM to map classes with unusual
descriptor attributes (for example, classes that inherit from ones
@@ -380,16 +380,16 @@ class AttributesTest(PersistTest):
class Foo(object):
A = des()
-
+
attributes.unregister_class(Foo)
-
+
def test_collectionclasses(self):
-
+
class Foo(object):pass
attributes.register_class(Foo)
attributes.register_attribute(Foo, "collection", uselist=True, typecallable=set, useobject=True)
assert isinstance(Foo().collection, set)
-
+
attributes.unregister_attribute(Foo, "collection")
try:
@@ -397,7 +397,7 @@ class AttributesTest(PersistTest):
assert False
except exceptions.ArgumentError, e:
assert str(e) == "Type InstrumentedDict must elect an appender method to be a collection class"
-
+
class MyDict(dict):
@collection.appender
def append(self, item):
@@ -409,14 +409,14 @@ class AttributesTest(PersistTest):
assert isinstance(Foo().collection, MyDict)
attributes.unregister_attribute(Foo, "collection")
-
+
class MyColl(object):pass
try:
attributes.register_attribute(Foo, "collection", uselist=True, typecallable=MyColl, useobject=True)
assert False
except exceptions.ArgumentError, e:
assert str(e) == "Type MyColl must elect an appender method to be a collection class"
-
+
class MyColl(object):
@collection.iterator
def __iter__(self):
@@ -436,7 +436,7 @@ class AttributesTest(PersistTest):
class BackrefTest(PersistTest):
-
+
def test_manytomany(self):
class Student(object):pass
class Course(object):pass
@@ -459,12 +459,12 @@ class BackrefTest(PersistTest):
self.assert_(s2.courses == [c])
self.assert_(s1.courses == [c])
s1.courses.remove(c)
- self.assert_(c.students == [s2,s3])
-
+ self.assert_(c.students == [s2,s3])
+
def test_onetomany(self):
class Post(object):pass
class Blog(object):pass
-
+
attributes.register_class(Post)
attributes.register_class(Blog)
attributes.register_attribute(Post, 'blog', uselist=False, extension=attributes.GenericBackrefExtension('posts'), trackparent=True, useobject=True)
@@ -511,7 +511,7 @@ class BackrefTest(PersistTest):
class DeferredBackrefTest(PersistTest):
def setUp(self):
global Post, Blog, called, lazy_load
-
+
class Post(object):
def __init__(self, name):
self.name = name
@@ -600,20 +600,20 @@ class HistoryTest(PersistTest):
def test_scalar(self):
class Foo(fixtures.Base):
pass
-
+
attributes.register_class(Foo)
attributes.register_attribute(Foo, 'someattr', uselist=False, useobject=False)
# case 1. new object
f = Foo()
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [], []))
-
+
f.someattr = "hi"
self.assertEquals(attributes.get_history(f._state, 'someattr'), (['hi'], [], []))
f._state.commit(['someattr'])
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], ['hi'], []))
-
+
f.someattr = 'there'
self.assertEquals(attributes.get_history(f._state, 'someattr'), (['there'], [], ['hi']))
@@ -623,15 +623,15 @@ class HistoryTest(PersistTest):
del f.someattr
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [], ['there']))
-
+
# case 2. object with direct dictionary settings (similar to a load operation)
f = Foo()
f.__dict__['someattr'] = 'new'
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], ['new'], []))
-
+
f.someattr = 'old'
self.assertEquals(attributes.get_history(f._state, 'someattr'), (['old'], [], ['new']))
-
+
f._state.commit(['someattr'])
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], ['old'], []))
@@ -641,7 +641,7 @@ class HistoryTest(PersistTest):
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [], []))
f.someattr = None
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([None], [], []))
-
+
f = Foo()
f.__dict__['someattr'] = 'new'
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], ['new'], []))
@@ -725,7 +725,7 @@ class HistoryTest(PersistTest):
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], ['old'], []))
# setting None on uninitialized is currently not a change for an object attribute
- # (this is different than scalar attribute). a lazyload has occured so if its
+ # (this is different than scalar attribute). a lazyload has occured so if its
# None, its really None
f = Foo()
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [None], []))
@@ -744,15 +744,15 @@ class HistoryTest(PersistTest):
class Bar(fixtures.Base):
def __nonzero__(self):
assert False
-
+
attributes.register_class(Foo)
attributes.register_attribute(Foo, 'someattr', uselist=True, useobject=True)
-
+
hi = Bar(name='hi')
there = Bar(name='there')
old = Bar(name='old')
new = Bar(name='new')
-
+
# case 1. new object
f = Foo()
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [], []))
@@ -769,7 +769,7 @@ class HistoryTest(PersistTest):
f._state.commit(['someattr'])
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [there], []))
-
+
f.someattr = [hi]
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([hi], [], [there]))
@@ -796,7 +796,7 @@ class HistoryTest(PersistTest):
pass
from sqlalchemy.orm.collections import attribute_mapped_collection
-
+
attributes.register_class(Foo)
attributes.register_attribute(Foo, 'someattr', uselist=True, useobject=True, typecallable=attribute_mapped_collection('name'))
@@ -813,7 +813,7 @@ class HistoryTest(PersistTest):
f.someattr['there'] = there
self.assertEquals(tuple([set(x) for x in attributes.get_history(f._state, 'someattr')]), (set([hi, there]), set([]), set([])))
-
+
f._state.commit(['someattr'])
self.assertEquals(tuple([set(x) for x in attributes.get_history(f._state, 'someattr')]), (set([]), set([hi, there]), set([])))
@@ -851,16 +851,16 @@ class HistoryTest(PersistTest):
f.someattr.remove(there)
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [hi], [there]))
-
+
f.someattr.append(old)
f.someattr.append(new)
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([old, new], [hi], [there]))
f._state.commit(['someattr'])
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [hi, old, new], []))
-
+
f.someattr.pop(0)
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [old, new], [hi]))
-
+
# case 2. object with direct settings (similar to a load operation)
f = Foo()
f.__dict__['id'] = 1
@@ -880,11 +880,11 @@ class HistoryTest(PersistTest):
collection.append_without_event(new)
f._state.commit_all()
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [new], []))
-
+
f.id = 1
f.someattr.remove(new)
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([], [], [new]))
-
+
# case 3. mixing appends with sets
f = Foo()
f.someattr.append(hi)
@@ -893,7 +893,7 @@ class HistoryTest(PersistTest):
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([hi, there], [], []))
f.someattr = [there]
self.assertEquals(attributes.get_history(f._state, 'someattr'), ([there], [], []))
-
+
def test_collections_via_backref(self):
class Foo(fixtures.Base):
pass
@@ -904,12 +904,12 @@ class HistoryTest(PersistTest):
attributes.register_class(Bar)
attributes.register_attribute(Foo, 'bars', uselist=True, extension=attributes.GenericBackrefExtension('foo'), trackparent=True, useobject=True)
attributes.register_attribute(Bar, 'foo', uselist=False, extension=attributes.GenericBackrefExtension('bars'), trackparent=True, useobject=True)
-
+
f1 = Foo()
b1 = Bar()
self.assertEquals(attributes.get_history(f1._state, 'bars'), ([], [], []))
self.assertEquals(attributes.get_history(b1._state, 'foo'), ([], [None], []))
-
+
#b1.foo = f1
f1.bars.append(b1)
self.assertEquals(attributes.get_history(f1._state, 'bars'), ([b1], [], []))
@@ -920,7 +920,7 @@ class HistoryTest(PersistTest):
self.assertEquals(attributes.get_history(f1._state, 'bars'), ([b1, b2], [], []))
self.assertEquals(attributes.get_history(b1._state, 'foo'), ([f1], [], []))
self.assertEquals(attributes.get_history(b2._state, 'foo'), ([f1], [], []))
-
+
def test_lazy_backref_collections(self):
class Foo(fixtures.Base):
pass
@@ -932,7 +932,7 @@ class HistoryTest(PersistTest):
def load():
return lazy_load
return load
-
+
attributes.register_class(Foo)
attributes.register_class(Bar)
attributes.register_attribute(Foo, 'bars', uselist=True, extension=attributes.GenericBackrefExtension('foo'), trackparent=True, callable_=lazyload, useobject=True)
@@ -945,7 +945,7 @@ class HistoryTest(PersistTest):
bar4 = Bar()
bar4.foo = f
self.assertEquals(attributes.get_history(f._state, 'bars'), ([bar4], [bar1, bar2, bar3], []))
-
+
lazy_load = None
f = Foo()
bar4 = Bar()
@@ -955,7 +955,7 @@ class HistoryTest(PersistTest):
lazy_load = [bar1, bar2, bar3]
f._state.expire_attributes(['bars'])
self.assertEquals(attributes.get_history(f._state, 'bars'), ([], [bar1, bar2, bar3], []))
-
+
def test_collections_via_lazyload(self):
class Foo(fixtures.Base):
pass
@@ -967,18 +967,18 @@ class HistoryTest(PersistTest):
def load():
return lazy_load
return load
-
+
attributes.register_class(Foo)
attributes.register_class(Bar)
attributes.register_attribute(Foo, 'bars', uselist=True, callable_=lazyload, trackparent=True, useobject=True)
-
+
bar1, bar2, bar3, bar4 = [Bar(id=1), Bar(id=2), Bar(id=3), Bar(id=4)]
lazy_load = [bar1, bar2, bar3]
f = Foo()
f.bars = []
self.assertEquals(attributes.get_history(f._state, 'bars'), ([], [], [bar1, bar2, bar3]))
-
+
f = Foo()
f.bars.append(bar4)
self.assertEquals(attributes.get_history(f._state, 'bars'), ([bar4], [bar1, bar2, bar3], []) )
@@ -992,7 +992,7 @@ class HistoryTest(PersistTest):
f = Foo()
del f.bars[1]
self.assertEquals(attributes.get_history(f._state, 'bars'), ([], [bar1, bar3], [bar2]))
-
+
lazy_load = None
f = Foo()
f.bars.append(bar2)
@@ -1012,9 +1012,9 @@ class HistoryTest(PersistTest):
attributes.register_attribute(Foo, 'bar', uselist=False, callable_=lazyload, useobject=False)
lazy_load = "hi"
- # with scalar non-object, the lazy callable is only executed on gets, not history
+ # with scalar non-object, the lazy callable is only executed on gets, not history
# operations
-
+
f = Foo()
self.assertEquals(f.bar, "hi")
self.assertEquals(attributes.get_history(f._state, 'bar'), ([], ["hi"], []))
@@ -1035,7 +1035,7 @@ class HistoryTest(PersistTest):
self.assertEquals(attributes.get_history(f._state, 'bar'), ([], [], ["hi"]))
assert f.bar is None
self.assertEquals(attributes.get_history(f._state, 'bar'), ([None], [], ["hi"]))
-
+
def test_scalar_object_via_lazyload(self):
class Foo(fixtures.Base):
pass
@@ -1047,19 +1047,19 @@ class HistoryTest(PersistTest):
def load():
return lazy_load
return load
-
+
attributes.register_class(Foo)
attributes.register_class(Bar)
attributes.register_attribute(Foo, 'bar', uselist=False, callable_=lazyload, trackparent=True, useobject=True)
bar1, bar2 = [Bar(id=1), Bar(id=2)]
lazy_load = bar1
- # with scalar object, the lazy callable is only executed on gets and history
+ # with scalar object, the lazy callable is only executed on gets and history
# operations
f = Foo()
self.assertEquals(attributes.get_history(f._state, 'bar'), ([], [bar1], []))
-
+
f = Foo()
f.bar = None
self.assertEquals(attributes.get_history(f._state, 'bar'), ([None], [], [bar1]))
@@ -1069,13 +1069,13 @@ class HistoryTest(PersistTest):
self.assertEquals(attributes.get_history(f._state, 'bar'), ([bar2], [], [bar1]))
f.bar = bar1
self.assertEquals(attributes.get_history(f._state, 'bar'), ([], [bar1], []))
-
+
f = Foo()
self.assertEquals(f.bar, bar1)
del f.bar
self.assertEquals(attributes.get_history(f._state, 'bar'), ([None], [], [bar1]))
assert f.bar is None
self.assertEquals(attributes.get_history(f._state, 'bar'), ([None], [], [bar1]))
-
+
if __name__ == "__main__":
- testbase.main()
+ testenv.main()