summaryrefslogtreecommitdiff
path: root/test/orm/test_attributes.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/orm/test_attributes.py')
-rw-r--r--test/orm/test_attributes.py2438
1 files changed, 1505 insertions, 933 deletions
diff --git a/test/orm/test_attributes.py b/test/orm/test_attributes.py
index a830b39b8..9dd388989 100644
--- a/test/orm/test_attributes.py
+++ b/test/orm/test_attributes.py
@@ -3,8 +3,15 @@ from sqlalchemy.orm import attributes, instrumentation, exc as orm_exc
from sqlalchemy.orm.collections import collection
from sqlalchemy.orm.interfaces import AttributeExtension
from sqlalchemy import exc as sa_exc
-from sqlalchemy.testing import eq_, ne_, assert_raises, \
- assert_raises_message, is_true, is_false, is_
+from sqlalchemy.testing import (
+ eq_,
+ ne_,
+ assert_raises,
+ assert_raises_message,
+ is_true,
+ is_false,
+ is_,
+)
from sqlalchemy.testing import fixtures
from sqlalchemy.testing.util import gc_collect, all_partial_orderings
from sqlalchemy.util import jython
@@ -20,7 +27,8 @@ MyTest2 = None
def _set_callable(state, dict_, key, callable_):
fn = InstanceState._instance_level_callable_processor(
- state.manager, callable_, key)
+ state.manager, callable_, key
+ )
fn(state, dict_, None)
@@ -31,6 +39,7 @@ class AttributeImplAPITest(fixtures.MappedTest):
class B(object):
pass
+
instrumentation.register_class(A)
instrumentation.register_class(B)
attributes.register_attribute(A, "b", uselist=False, useobject=True)
@@ -42,6 +51,7 @@ class AttributeImplAPITest(fixtures.MappedTest):
class B(object):
pass
+
instrumentation.register_class(A)
instrumentation.register_class(B)
attributes.register_attribute(A, "b", uselist=True, useobject=True)
@@ -56,7 +66,9 @@ class AttributeImplAPITest(fixtures.MappedTest):
A.b.impl.append(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b is b1
@@ -67,7 +79,9 @@ class AttributeImplAPITest(fixtures.MappedTest):
"associated with <A at .*?> on attribute 'b'",
A.b.impl.remove,
attributes.instance_state(a1),
- attributes.instance_dict(a1), b2, None
+ attributes.instance_dict(a1),
+ b2,
+ None,
)
def test_scalar_obj_pop_invalid(self):
@@ -79,14 +93,18 @@ class AttributeImplAPITest(fixtures.MappedTest):
A.b.impl.append(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b is b1
A.b.impl.pop(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b2, None
+ attributes.instance_dict(a1),
+ b2,
+ None,
)
assert a1.b is b1
@@ -98,14 +116,18 @@ class AttributeImplAPITest(fixtures.MappedTest):
A.b.impl.append(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b is b1
A.b.impl.pop(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b is None
@@ -118,7 +140,9 @@ class AttributeImplAPITest(fixtures.MappedTest):
A.b.impl.append(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b == [b1]
@@ -128,7 +152,9 @@ class AttributeImplAPITest(fixtures.MappedTest):
r"list.remove\(.*?\): .* not in list",
A.b.impl.remove,
attributes.instance_state(a1),
- attributes.instance_dict(a1), b2, None
+ attributes.instance_dict(a1),
+ b2,
+ None,
)
def test_collection_obj_pop_invalid(self):
@@ -140,14 +166,18 @@ class AttributeImplAPITest(fixtures.MappedTest):
A.b.impl.append(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b == [b1]
A.b.impl.pop(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b2, None
+ attributes.instance_dict(a1),
+ b2,
+ None,
)
assert a1.b == [b1]
@@ -159,14 +189,18 @@ class AttributeImplAPITest(fixtures.MappedTest):
A.b.impl.append(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b == [b1]
A.b.impl.pop(
attributes.instance_state(a1),
- attributes.instance_dict(a1), b1, None
+ attributes.instance_dict(a1),
+ b1,
+ None,
)
assert a1.b == []
@@ -190,53 +224,75 @@ class AttributesTest(fixtures.ORMTest):
pass
instrumentation.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)
+ 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.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"
+ )
attributes.instance_state(u)._commit_all(attributes.instance_dict(u))
- self.assert_(u.user_id == 7 and u.user_name == 'john'
- and u.email_address == 'lala@123.com')
- u.user_name = 'heythere'
- u.email_address = 'foo@bar.com'
- self.assert_(u.user_id == 7 and u.user_name == 'heythere'
- and u.email_address == 'foo@bar.com')
+ self.assert_(
+ u.user_id == 7
+ and u.user_name == "john"
+ and u.email_address == "lala@123.com"
+ )
+ u.user_name = "heythere"
+ u.email_address = "foo@bar.com"
+ self.assert_(
+ u.user_id == 7
+ and u.user_name == "heythere"
+ and u.email_address == "foo@bar.com"
+ )
def test_pickleness(self):
instrumentation.register_class(MyTest)
instrumentation.register_class(MyTest2)
- attributes.register_attribute(MyTest, 'user_id', uselist=False,
- useobject=False)
- attributes.register_attribute(MyTest, 'user_name',
- uselist=False, useobject=False)
- attributes.register_attribute(MyTest, 'email_address',
- uselist=False, useobject=False)
- attributes.register_attribute(MyTest2, 'a', uselist=False,
- useobject=False)
- attributes.register_attribute(MyTest2, 'b', uselist=False,
- useobject=False)
+ attributes.register_attribute(
+ MyTest, "user_id", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ MyTest, "user_name", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ MyTest, "email_address", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ MyTest2, "a", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ MyTest2, "b", uselist=False, useobject=False
+ )
# shouldn't be pickling callables at the class level
def somecallable(state, passive):
return None
- attributes.register_attribute(MyTest, 'mt2', uselist=True,
- trackparent=True, callable_=somecallable,
- useobject=True)
+ attributes.register_attribute(
+ MyTest,
+ "mt2",
+ uselist=True,
+ trackparent=True,
+ callable_=somecallable,
+ useobject=True,
+ )
o = MyTest()
o.mt2.append(MyTest2())
o.user_id = 7
- o.mt2[0].a = 'abcde'
+ o.mt2[0].a = "abcde"
pk_o = pickle.dumps(o)
o2 = pickle.loads(pk_o)
@@ -258,7 +314,7 @@ class AttributesTest(fixtures.ORMTest):
self.assert_(o4.user_name is None)
self.assert_(o4.email_address is None)
self.assert_(len(o4.mt2) == 1)
- self.assert_(o4.mt2[0].a == 'abcde')
+ self.assert_(o4.mt2[0].a == "abcde")
self.assert_(o4.mt2[0].b is None)
@testing.requires.predictable_gc
@@ -273,7 +329,7 @@ class AttributesTest(fixtures.ORMTest):
f = Foo()
state = attributes.instance_state(f)
f.bar = "foo"
- eq_(state.dict, {'bar': 'foo', state.manager.STATE_ATTR: state})
+ eq_(state.dict, {"bar": "foo", state.manager.STATE_ATTR: state})
del f
gc_collect()
assert state.obj() is None
@@ -290,17 +346,16 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo,
- 'bars',
- uselist=True,
- useobject=True)
+ attributes.register_attribute(
+ Foo, "bars", uselist=True, useobject=True
+ )
assert_raises_message(
orm_exc.ObjectDereferencedError,
"Can't emit change event for attribute "
"'Foo.bars' - parent object of type <Foo> "
"has been garbage collected.",
- lambda: Foo().bars.append(Bar())
+ lambda: Foo().bars.append(Bar()),
)
def test_del_scalar_nonobject(self):
@@ -308,7 +363,7 @@ class AttributesTest(fixtures.ORMTest):
pass
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'b', uselist=False, useobject=False)
+ attributes.register_attribute(Foo, "b", uselist=False, useobject=False)
f1 = Foo()
@@ -325,9 +380,7 @@ class AttributesTest(fixtures.ORMTest):
del f1.b
assert_raises_message(
- AttributeError,
- "Foo.b object does not have a value",
- go
+ AttributeError, "Foo.b object does not have a value", go
)
def test_del_scalar_object(self):
@@ -339,7 +392,7 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'b', uselist=False, useobject=True)
+ attributes.register_attribute(Foo, "b", uselist=False, useobject=True)
f1 = Foo()
@@ -354,9 +407,7 @@ class AttributesTest(fixtures.ORMTest):
del f1.b
assert_raises_message(
- AttributeError,
- "Foo.b object does not have a value",
- go
+ AttributeError, "Foo.b object does not have a value", go
)
def test_del_collection_object(self):
@@ -368,7 +419,7 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'b', uselist=True, useobject=True)
+ attributes.register_attribute(Foo, "b", uselist=True, useobject=True)
f1 = Foo()
@@ -386,7 +437,7 @@ class AttributesTest(fixtures.ORMTest):
class Foo(object):
pass
- data = {'a': 'this is a', 'b': 12}
+ data = {"a": "this is a", "b": 12}
def loader(state, keys):
for k in keys:
@@ -396,38 +447,43 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
manager = attributes.manager_of_class(Foo)
manager.deferred_scalar_loader = loader
- attributes.register_attribute(Foo, 'a', uselist=False, useobject=False)
- attributes.register_attribute(Foo, 'b', uselist=False, useobject=False)
+ attributes.register_attribute(Foo, "a", uselist=False, useobject=False)
+ attributes.register_attribute(Foo, "b", uselist=False, useobject=False)
f = Foo()
- attributes.instance_state(f)._expire(attributes.instance_dict(f),
- set())
- eq_(f.a, 'this is a')
+ attributes.instance_state(f)._expire(
+ attributes.instance_dict(f), set()
+ )
+ eq_(f.a, "this is a")
eq_(f.b, 12)
- f.a = 'this is some new a'
- attributes.instance_state(f)._expire(attributes.instance_dict(f),
- set())
- eq_(f.a, 'this is a')
+ f.a = "this is some new a"
+ attributes.instance_state(f)._expire(
+ attributes.instance_dict(f), set()
+ )
+ eq_(f.a, "this is a")
eq_(f.b, 12)
- attributes.instance_state(f)._expire(attributes.instance_dict(f),
- set())
- f.a = 'this is another new a'
- eq_(f.a, 'this is another new a')
+ attributes.instance_state(f)._expire(
+ attributes.instance_dict(f), set()
+ )
+ f.a = "this is another new a"
+ eq_(f.a, "this is another new a")
eq_(f.b, 12)
- attributes.instance_state(f)._expire(attributes.instance_dict(f),
- set())
- eq_(f.a, 'this is a')
+ attributes.instance_state(f)._expire(
+ attributes.instance_dict(f), set()
+ )
+ eq_(f.a, "this is a")
eq_(f.b, 12)
del f.a
eq_(f.a, None)
eq_(f.b, 12)
- attributes.instance_state(f)._commit_all(attributes.instance_dict(f),
- set())
+ attributes.instance_state(f)._commit_all(
+ attributes.instance_dict(f), set()
+ )
eq_(f.a, None)
eq_(f.b, 12)
def test_deferred_pickleable(self):
- data = {'a': 'this is a', 'b': 12}
+ data = {"a": "this is a", "b": 12}
def loader(state, keys):
for k in keys:
@@ -437,17 +493,20 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(MyTest)
manager = attributes.manager_of_class(MyTest)
manager.deferred_scalar_loader = loader
- attributes.register_attribute(MyTest, 'a', uselist=False,
- useobject=False)
- attributes.register_attribute(MyTest, 'b', uselist=False,
- useobject=False)
+ attributes.register_attribute(
+ MyTest, "a", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ MyTest, "b", uselist=False, useobject=False
+ )
m = MyTest()
- attributes.instance_state(m)._expire(attributes.instance_dict(m),
- set())
- assert 'a' not in m.__dict__
+ attributes.instance_state(m)._expire(
+ attributes.instance_dict(m), set()
+ )
+ assert "a" not in m.__dict__
m2 = pickle.loads(pickle.dumps(m))
- assert 'a' not in m2.__dict__
+ assert "a" not in m2.__dict__
eq_(m2.a, "this is a")
eq_(m2.b, 12)
@@ -460,43 +519,58 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(User)
instrumentation.register_class(Address)
- attributes.register_attribute(User, 'user_id', uselist=False,
- useobject=False)
- attributes.register_attribute(User, 'user_name', uselist=False,
- useobject=False)
- 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)
+ attributes.register_attribute(
+ User, "user_id", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ User, "user_name", uselist=False, useobject=False
+ )
+ 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'
+ u.user_name = "john"
u.addresses = []
a = Address()
a.address_id = 10
- a.email_address = 'lala@123.com'
+ a.email_address = "lala@123.com"
u.addresses.append(a)
- self.assert_(u.user_id == 7 and u.user_name == 'john'
- and u.addresses[0].email_address == 'lala@123.com')
- (u,
- attributes.instance_state(a)._commit_all(attributes.instance_dict(a)))
- self.assert_(u.user_id == 7 and u.user_name == 'john'
- and u.addresses[0].email_address == 'lala@123.com')
+ self.assert_(
+ u.user_id == 7
+ and u.user_name == "john"
+ and u.addresses[0].email_address == "lala@123.com"
+ )
+ (
+ u,
+ attributes.instance_state(a)._commit_all(
+ attributes.instance_dict(a)
+ ),
+ )
+ self.assert_(
+ u.user_id == 7
+ and u.user_name == "john"
+ and u.addresses[0].email_address == "lala@123.com"
+ )
- u.user_name = 'heythere'
+ u.user_name = "heythere"
a = Address()
a.address_id = 11
- a.email_address = 'foo@bar.com'
+ a.email_address = "foo@bar.com"
u.addresses.append(a)
eq_(u.user_id, 7)
- eq_(u.user_name, 'heythere')
- eq_(u.addresses[0].email_address, 'lala@123.com')
- eq_(u.addresses[1].email_address, 'foo@bar.com')
+ eq_(u.user_name, "heythere")
+ eq_(u.addresses[0].email_address, "lala@123.com")
+ eq_(u.addresses[1].email_address, "foo@bar.com")
def test_extension_commit_attr(self):
"""test that an extension which commits attribute history
@@ -534,7 +608,7 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- b1, b2, b3, b4 = Bar(id='b1'), Bar(id='b2'), Bar(id='b3'), Bar(id='b4')
+ b1, b2, b3, b4 = Bar(id="b1"), Bar(id="b2"), Bar(id="b3"), Bar(id="b4")
def loadcollection(state, passive):
if passive is attributes.PASSIVE_NO_FETCH:
@@ -546,40 +620,50 @@ class AttributesTest(fixtures.ORMTest):
return attributes.PASSIVE_NO_RESULT
return b2
- attributes.register_attribute(Foo, 'bars',
- uselist=True,
- useobject=True,
- callable_=loadcollection,
- extension=[ReceiveEvents('bars')])
+ attributes.register_attribute(
+ Foo,
+ "bars",
+ uselist=True,
+ useobject=True,
+ callable_=loadcollection,
+ extension=[ReceiveEvents("bars")],
+ )
- attributes.register_attribute(Foo, 'bar',
- uselist=False,
- useobject=True,
- callable_=loadscalar,
- extension=[ReceiveEvents('bar')])
+ attributes.register_attribute(
+ Foo,
+ "bar",
+ uselist=False,
+ useobject=True,
+ callable_=loadscalar,
+ extension=[ReceiveEvents("bar")],
+ )
- attributes.register_attribute(Foo, 'scalar',
- uselist=False,
- useobject=False,
- extension=[ReceiveEvents('scalar')])
+ attributes.register_attribute(
+ Foo,
+ "scalar",
+ uselist=False,
+ useobject=False,
+ extension=[ReceiveEvents("scalar")],
+ )
def create_hist():
def hist(key, fn, *arg):
attributes.instance_state(f1)._commit_all(
- attributes.instance_dict(f1))
+ attributes.instance_dict(f1)
+ )
fn(*arg)
histories.append(attributes.get_history(f1, key))
f1 = Foo()
- hist('bars', f1.bars.append, b3)
- hist('bars', f1.bars.append, b4)
- hist('bars', f1.bars.remove, b2)
- hist('bar', setattr, f1, 'bar', b3)
- hist('bar', setattr, f1, 'bar', None)
- hist('bar', setattr, f1, 'bar', b4)
- hist('scalar', setattr, f1, 'scalar', 5)
- hist('scalar', setattr, f1, 'scalar', None)
- hist('scalar', setattr, f1, 'scalar', 4)
+ hist("bars", f1.bars.append, b3)
+ hist("bars", f1.bars.append, b4)
+ hist("bars", f1.bars.remove, b2)
+ hist("bar", setattr, f1, "bar", b3)
+ hist("bar", setattr, f1, "bar", None)
+ hist("bar", setattr, f1, "bar", b4)
+ hist("scalar", setattr, f1, "scalar", 5)
+ hist("scalar", setattr, f1, "scalar", None)
+ hist("scalar", setattr, f1, "scalar", 4)
histories = []
commit = False
@@ -624,11 +708,17 @@ class AttributesTest(fixtures.ORMTest):
return [bar1, bar2, bar3]
- attributes.register_attribute(Foo, 'bars', uselist=True,
- callable_=func1, useobject=True,
- extension=[ReceiveEvents()])
- attributes.register_attribute(Bar, 'foos', uselist=True,
- useobject=True, backref='bars')
+ attributes.register_attribute(
+ Foo,
+ "bars",
+ uselist=True,
+ callable_=func1,
+ useobject=True,
+ extension=[ReceiveEvents()],
+ )
+ attributes.register_attribute(
+ Bar, "foos", uselist=True, useobject=True, backref="bars"
+ )
x = Foo()
assert_raises(AssertionError, Bar(id=4).foos.append, x)
@@ -637,7 +727,8 @@ class AttributesTest(fixtures.ORMTest):
b = Bar(id=4)
b.foos.append(x)
attributes.instance_state(x)._expire_attributes(
- attributes.instance_dict(x), ['bars'])
+ attributes.instance_dict(x), ["bars"]
+ )
assert_raises(AssertionError, b.foos.remove, x)
def test_scalar_listener(self):
@@ -663,19 +754,23 @@ class AttributesTest(fixtures.ORMTest):
return child
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'x', uselist=False, useobject=False,
- extension=ReceiveEvents())
+ attributes.register_attribute(
+ Foo, "x", uselist=False, useobject=False, extension=ReceiveEvents()
+ )
f = Foo()
f.x = 5
f.x = 17
del f.x
- eq_(results, [
- ('set', f, 5, attributes.NEVER_SET),
- ('set', f, 17, 5),
- ('remove', f, 17),
- ])
+ eq_(
+ results,
+ [
+ ("set", f, 5, attributes.NEVER_SET),
+ ("set", f, 17, 5),
+ ("remove", f, 17),
+ ],
+ )
def test_lazytrackparent(self):
"""test that the "hasparent" flag works properly
@@ -688,33 +783,51 @@ class AttributesTest(fixtures.ORMTest):
class Blog(object):
pass
+
instrumentation.register_class(Post)
instrumentation.register_class(Blog)
# set up instrumented attributes with backrefs
- attributes.register_attribute(Post, 'blog', uselist=False,
- backref='posts',
- trackparent=True, useobject=True)
- attributes.register_attribute(Blog, 'posts', uselist=True,
- backref='blog',
- trackparent=True, useobject=True)
+ attributes.register_attribute(
+ Post,
+ "blog",
+ uselist=False,
+ backref="posts",
+ trackparent=True,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Blog,
+ "posts",
+ uselist=True,
+ backref="blog",
+ trackparent=True,
+ useobject=True,
+ )
# create objects as if they'd been freshly loaded from the database
# (without history)
b = Blog()
p1 = Post()
- _set_callable(attributes.instance_state(b),
- attributes.instance_dict(b),
- 'posts', lambda state, passive: [p1])
- _set_callable(attributes.instance_state(p1),
- attributes.instance_dict(p1),
- 'blog', lambda state, passive: b)
+ _set_callable(
+ attributes.instance_state(b),
+ attributes.instance_dict(b),
+ "posts",
+ lambda state, passive: [p1],
+ )
+ _set_callable(
+ attributes.instance_state(p1),
+ attributes.instance_dict(p1),
+ "blog",
+ lambda state, passive: b,
+ )
p1, attributes.instance_state(b)._commit_all(
- attributes.instance_dict(b))
+ attributes.instance_dict(b)
+ )
# no orphans (called before the lazy loaders fire off)
- assert attributes.has_parent(Blog, p1, 'posts', optimistic=True)
- assert attributes.has_parent(Post, b, 'blog', optimistic=True)
+ assert attributes.has_parent(Blog, p1, "posts", optimistic=True)
+ assert attributes.has_parent(Post, b, "blog", optimistic=True)
# assert connections
assert p1.blog is b
@@ -724,8 +837,8 @@ class AttributesTest(fixtures.ORMTest):
b2 = Blog()
p2 = Post()
b2.posts.append(p2)
- assert attributes.has_parent(Blog, p2, 'posts')
- assert attributes.has_parent(Post, b2, 'blog')
+ assert attributes.has_parent(Blog, p2, "posts")
+ assert attributes.has_parent(Post, b2, "blog")
def test_illegal_trackparent(self):
class Post(object):
@@ -733,19 +846,26 @@ class AttributesTest(fixtures.ORMTest):
class Blog(object):
pass
+
instrumentation.register_class(Post)
instrumentation.register_class(Blog)
- attributes.register_attribute(Post, 'blog', useobject=True)
+ attributes.register_attribute(Post, "blog", useobject=True)
assert_raises_message(
AssertionError,
"This AttributeImpl is not configured to track parents.",
- attributes.has_parent, Post, Blog(), 'blog'
+ attributes.has_parent,
+ Post,
+ Blog(),
+ "blog",
)
assert_raises_message(
AssertionError,
"This AttributeImpl is not configured to track parents.",
- Post.blog.impl.sethasparent, "x", "x", True
+ Post.blog.impl.sethasparent,
+ "x",
+ "x",
+ True,
)
def test_inheritance(self):
@@ -768,19 +888,23 @@ class AttributesTest(fixtures.ORMTest):
def func3(state, passive):
return "this is the shared attr"
- attributes.register_attribute(Foo, 'element', uselist=False,
- callable_=func1, useobject=True)
- attributes.register_attribute(Foo, 'element2', uselist=False,
- callable_=func3, useobject=True)
- attributes.register_attribute(Bar, 'element', uselist=False,
- callable_=func2, useobject=True)
+
+ attributes.register_attribute(
+ Foo, "element", uselist=False, callable_=func1, useobject=True
+ )
+ attributes.register_attribute(
+ Foo, "element2", uselist=False, callable_=func3, useobject=True
+ )
+ attributes.register_attribute(
+ Bar, "element", uselist=False, callable_=func2, useobject=True
+ )
x = Foo()
y = Bar()
- assert x.element == 'this is the foo attr'
- assert y.element == 'this is the bar attr'
- assert x.element2 == 'this is the shared attr'
- assert y.element2 == 'this is the shared attr'
+ assert x.element == "this is the foo attr"
+ assert y.element == "this is the bar attr"
+ assert x.element2 == "this is the shared attr"
+ assert y.element2 == "this is the shared attr"
def test_no_double_state(self):
states = set()
@@ -817,17 +941,22 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'element', uselist=False,
- useobject=True)
+ attributes.register_attribute(
+ Foo, "element", uselist=False, useobject=True
+ )
el = Element()
x = Bar()
x.element = el
- eq_(attributes.get_state_history(attributes.instance_state(x),
- 'element'), ([el], (), ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(x), "element"
+ ),
+ ([el], (), ()),
+ )
attributes.instance_state(x)._commit_all(attributes.instance_dict(x))
- added, unchanged, deleted = \
- attributes.get_state_history(attributes.instance_state(x),
- 'element')
+ added, unchanged, deleted = attributes.get_state_history(
+ attributes.instance_state(x), "element"
+ )
assert added == ()
assert unchanged == [el]
@@ -842,26 +971,28 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- bar1, bar2, bar3, bar4 = [Bar(id=1), Bar(id=2), Bar(id=3),
- Bar(id=4)]
+ bar1, bar2, bar3, bar4 = [Bar(id=1), Bar(id=2), Bar(id=3), Bar(id=4)]
def func1(state, passive):
- return 'this is func 1'
+ return "this is func 1"
def func2(state, passive):
return [bar1, bar2, bar3]
- attributes.register_attribute(Foo, 'col1', uselist=False,
- callable_=func1, useobject=True)
- attributes.register_attribute(Foo, 'col2', uselist=True,
- callable_=func2, useobject=True)
- attributes.register_attribute(Bar, 'id', uselist=False,
- useobject=True)
+ attributes.register_attribute(
+ Foo, "col1", uselist=False, callable_=func1, useobject=True
+ )
+ attributes.register_attribute(
+ Foo, "col2", uselist=True, callable_=func2, useobject=True
+ )
+ attributes.register_attribute(Bar, "id", uselist=False, useobject=True)
x = Foo()
attributes.instance_state(x)._commit_all(attributes.instance_dict(x))
x.col2.append(bar4)
- eq_(attributes.get_state_history(attributes.instance_state(x), 'col2'),
- ([bar4], [bar1, bar2, bar3], []))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(x), "col2"),
+ ([bar4], [bar1, bar2, bar3], []),
+ )
def test_parenttrack(self):
class Foo(object):
@@ -872,22 +1003,24 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.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)
+ 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')
+ 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')
+ assert not attributes.has_parent(Bar, f2, "element")
# test that double assignment doesn't accidentally reset the
# 'parent' flag.
@@ -895,9 +1028,9 @@ class AttributesTest(fixtures.ORMTest):
b3 = Bar()
f4 = Foo()
b3.element = f4
- assert attributes.has_parent(Bar, f4, 'element')
+ assert attributes.has_parent(Bar, f4, "element")
b3.element = f4
- assert attributes.has_parent(Bar, f4, 'element')
+ assert attributes.has_parent(Bar, f4, "element")
def test_descriptorattributes(self):
"""changeset: 1633 broke ability to use ORM to map classes with
@@ -906,9 +1039,8 @@ class AttributesTest(fixtures.ORMTest):
simple regression test to prevent that defect. """
class des(object):
-
def __get__(self, instance, owner):
- raise AttributeError('fake attribute')
+ raise AttributeError("fake attribute")
class Foo(object):
A = des()
@@ -917,31 +1049,35 @@ class AttributesTest(fixtures.ORMTest):
instrumentation.unregister_class(Foo)
def test_collectionclasses(self):
-
class Foo(object):
pass
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'collection', uselist=True,
- typecallable=set, useobject=True)
- assert attributes.manager_of_class(Foo).is_instrumented('collection'
- )
+ attributes.register_attribute(
+ Foo, "collection", uselist=True, typecallable=set, useobject=True
+ )
+ assert attributes.manager_of_class(Foo).is_instrumented("collection")
assert isinstance(Foo().collection, set)
- attributes.unregister_attribute(Foo, 'collection')
- assert not attributes.manager_of_class(Foo) \
- .is_instrumented('collection')
+ attributes.unregister_attribute(Foo, "collection")
+ assert not attributes.manager_of_class(Foo).is_instrumented(
+ "collection"
+ )
try:
- attributes.register_attribute(Foo, 'collection',
- uselist=True, typecallable=dict,
- useobject=True)
+ attributes.register_attribute(
+ Foo,
+ "collection",
+ uselist=True,
+ typecallable=dict,
+ useobject=True,
+ )
assert False
except sa_exc.ArgumentError as e:
- assert str(e) \
- == 'Type InstrumentedDict must elect an appender '\
- 'method to be a collection class'
+ assert (
+ str(e) == "Type InstrumentedDict must elect an appender "
+ "method to be a collection class"
+ )
class MyDict(dict):
-
@collection.appender
def append(self, item):
self[item.foo] = item
@@ -950,26 +1086,35 @@ class AttributesTest(fixtures.ORMTest):
def remove(self, item):
del self[item.foo]
- attributes.register_attribute(Foo, 'collection', uselist=True,
- typecallable=MyDict, useobject=True)
+ attributes.register_attribute(
+ Foo,
+ "collection",
+ uselist=True,
+ typecallable=MyDict,
+ useobject=True,
+ )
assert isinstance(Foo().collection, MyDict)
- attributes.unregister_attribute(Foo, 'collection')
+ attributes.unregister_attribute(Foo, "collection")
class MyColl(object):
pass
try:
- attributes.register_attribute(Foo, 'collection',
- uselist=True, typecallable=MyColl,
- useobject=True)
+ attributes.register_attribute(
+ Foo,
+ "collection",
+ uselist=True,
+ typecallable=MyColl,
+ useobject=True,
+ )
assert False
except sa_exc.ArgumentError as e:
- assert str(e) \
- == 'Type MyColl must elect an appender method to be a '\
- 'collection class'
+ assert (
+ str(e) == "Type MyColl must elect an appender method to be a "
+ "collection class"
+ )
class MyColl(object):
-
@collection.iterator
def __iter__(self):
return iter([])
@@ -982,8 +1127,13 @@ class AttributesTest(fixtures.ORMTest):
def remove(self, item):
pass
- attributes.register_attribute(Foo, 'collection', uselist=True,
- typecallable=MyColl, useobject=True)
+ attributes.register_attribute(
+ Foo,
+ "collection",
+ uselist=True,
+ typecallable=MyColl,
+ useobject=True,
+ )
try:
Foo().collection
assert True
@@ -995,52 +1145,46 @@ class AttributesTest(fixtures.ORMTest):
pass
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'a', useobject=False)
- attributes.register_attribute(Foo, 'b', useobject=False)
- attributes.register_attribute(Foo, 'c', useobject=False)
+ attributes.register_attribute(Foo, "a", useobject=False)
+ attributes.register_attribute(Foo, "b", useobject=False)
+ attributes.register_attribute(Foo, "c", useobject=False)
f1 = Foo()
state = attributes.instance_state(f1)
- f1.a = 'a1'
- f1.b = 'b1'
- f1.c = 'c1'
+ f1.a = "a1"
+ f1.b = "b1"
+ f1.c = "c1"
assert not state._last_known_values
- state._track_last_known_value('b')
- state._track_last_known_value('c')
+ state._track_last_known_value("b")
+ state._track_last_known_value("c")
eq_(
state._last_known_values,
- {'b': attributes.NO_VALUE, 'c': attributes.NO_VALUE})
+ {"b": attributes.NO_VALUE, "c": attributes.NO_VALUE},
+ )
- state._expire_attributes(state.dict, ['b'])
- eq_(
- state._last_known_values,
- {'b': 'b1', 'c': attributes.NO_VALUE})
+ state._expire_attributes(state.dict, ["b"])
+ eq_(state._last_known_values, {"b": "b1", "c": attributes.NO_VALUE})
state._expire(state.dict, set())
- eq_(
- state._last_known_values,
- {'b': 'b1', 'c': 'c1'})
+ eq_(state._last_known_values, {"b": "b1", "c": "c1"})
- f1.b = 'b2'
+ f1.b = "b2"
- eq_(
- state._last_known_values,
- {'b': attributes.NO_VALUE, 'c': 'c1'})
+ eq_(state._last_known_values, {"b": attributes.NO_VALUE, "c": "c1"})
- f1.c = 'c2'
+ f1.c = "c2"
eq_(
state._last_known_values,
- {'b': attributes.NO_VALUE, 'c': attributes.NO_VALUE})
+ {"b": attributes.NO_VALUE, "c": attributes.NO_VALUE},
+ )
state._expire(state.dict, set())
- eq_(
- state._last_known_values,
- {'b': 'b2', 'c': 'c2'})
+ eq_(state._last_known_values, {"b": "b2", "c": "c2"})
class GetNoValueTest(fixtures.ORMTest):
@@ -1057,60 +1201,64 @@ class GetNoValueTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
if expected is not None:
- attributes.register_attribute(Foo,
- "attr", useobject=True,
- uselist=False,
- callable_=lazy_callable)
+ attributes.register_attribute(
+ Foo,
+ "attr",
+ useobject=True,
+ uselist=False,
+ callable_=lazy_callable,
+ )
else:
- attributes.register_attribute(Foo,
- "attr", useobject=True,
- uselist=False)
+ attributes.register_attribute(
+ Foo, "attr", useobject=True, uselist=False
+ )
f1 = self.f1 = Foo()
- return Foo.attr.impl,\
- attributes.instance_state(f1), \
- attributes.instance_dict(f1)
+ return (
+ Foo.attr.impl,
+ attributes.instance_state(f1),
+ attributes.instance_dict(f1),
+ )
def test_passive_no_result(self):
attr, state, dict_ = self._fixture(attributes.PASSIVE_NO_RESULT)
eq_(
attr.get(state, dict_, passive=attributes.PASSIVE_NO_INITIALIZE),
- attributes.PASSIVE_NO_RESULT
+ attributes.PASSIVE_NO_RESULT,
)
def test_passive_no_result_never_set(self):
attr, state, dict_ = self._fixture(attributes.NEVER_SET)
eq_(
attr.get(state, dict_, passive=attributes.PASSIVE_NO_INITIALIZE),
- attributes.PASSIVE_NO_RESULT
+ attributes.PASSIVE_NO_RESULT,
)
- assert 'attr' not in dict_
+ assert "attr" not in dict_
def test_passive_ret_never_set_never_set(self):
attr, state, dict_ = self._fixture(attributes.NEVER_SET)
eq_(
- attr.get(state, dict_,
- passive=attributes.PASSIVE_RETURN_NEVER_SET),
- attributes.NEVER_SET
+ attr.get(
+ state, dict_, passive=attributes.PASSIVE_RETURN_NEVER_SET
+ ),
+ attributes.NEVER_SET,
)
- assert 'attr' not in dict_
+ assert "attr" not in dict_
def test_passive_ret_never_set_empty(self):
attr, state, dict_ = self._fixture(None)
eq_(
- attr.get(state, dict_,
- passive=attributes.PASSIVE_RETURN_NEVER_SET),
- attributes.NEVER_SET
+ attr.get(
+ state, dict_, passive=attributes.PASSIVE_RETURN_NEVER_SET
+ ),
+ attributes.NEVER_SET,
)
- assert 'attr' not in dict_
+ assert "attr" not in dict_
def test_off_empty(self):
attr, state, dict_ = self._fixture(None)
- eq_(
- attr.get(state, dict_, passive=attributes.PASSIVE_OFF),
- None
- )
- assert 'attr' not in dict_
+ eq_(attr.get(state, dict_, passive=attributes.PASSIVE_OFF), None)
+ assert "attr" not in dict_
class UtilTest(fixtures.ORMTest):
@@ -1124,7 +1272,8 @@ class UtilTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
attributes.register_attribute(
- Foo, "coll", uselist=True, useobject=True)
+ Foo, "coll", uselist=True, useobject=True
+ )
f1 = Foo()
b1 = Bar()
@@ -1150,10 +1299,8 @@ class UtilTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(
- Foo, "a", uselist=False, useobject=False)
- attributes.register_attribute(
- Bar, "b", uselist=False, useobject=False)
+ attributes.register_attribute(Foo, "a", uselist=False, useobject=False)
+ attributes.register_attribute(Bar, "b", uselist=False, useobject=False)
@event.listens_for(Foo.a, "set")
def sync_a(target, value, oldvalue, initiator):
@@ -1172,14 +1319,13 @@ class UtilTest(fixtures.ORMTest):
f1.bar = b1
b1.foo = f1
- f1.a = 'x'
- eq_(b1.b, 'x')
- b1.b = 'y'
- eq_(f1.a, 'y')
+ f1.a = "x"
+ eq_(b1.b, "x")
+ b1.b = "y"
+ eq_(f1.a, "y")
class BackrefTest(fixtures.ORMTest):
-
def test_m2m(self):
class Student(object):
pass
@@ -1189,10 +1335,16 @@ class BackrefTest(fixtures.ORMTest):
instrumentation.register_class(Student)
instrumentation.register_class(Course)
- attributes.register_attribute(Student, 'courses', uselist=True,
- backref="students", useobject=True)
- attributes.register_attribute(Course, 'students', uselist=True,
- backref="courses", useobject=True)
+ attributes.register_attribute(
+ Student,
+ "courses",
+ uselist=True,
+ backref="students",
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Course, "students", uselist=True, backref="courses", useobject=True
+ )
s = Student()
c = Course()
@@ -1218,12 +1370,22 @@ class BackrefTest(fixtures.ORMTest):
instrumentation.register_class(Post)
instrumentation.register_class(Blog)
- attributes.register_attribute(Post, 'blog', uselist=False,
- backref='posts',
- trackparent=True, useobject=True)
- attributes.register_attribute(Blog, 'posts', uselist=True,
- backref='blog',
- trackparent=True, useobject=True)
+ attributes.register_attribute(
+ Post,
+ "blog",
+ uselist=False,
+ backref="posts",
+ trackparent=True,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Blog,
+ "posts",
+ uselist=True,
+ backref="blog",
+ trackparent=True,
+ useobject=True,
+ )
b = Blog()
(p1, p2, p3) = (Post(), Post(), Post())
b.posts.append(p1)
@@ -1253,14 +1415,17 @@ class BackrefTest(fixtures.ORMTest):
class Jack(object):
pass
+
instrumentation.register_class(Port)
instrumentation.register_class(Jack)
- attributes.register_attribute(Port, 'jack', uselist=False,
- useobject=True, backref="port")
+ attributes.register_attribute(
+ Port, "jack", uselist=False, useobject=True, backref="port"
+ )
- attributes.register_attribute(Jack, 'port', uselist=False,
- useobject=True, backref="jack")
+ attributes.register_attribute(
+ Jack, "port", uselist=False, useobject=True, backref="jack"
+ )
p = Port()
j = Jack()
@@ -1294,19 +1459,30 @@ class BackrefTest(fixtures.ORMTest):
instrumentation.register_class(Parent)
instrumentation.register_class(Child)
instrumentation.register_class(SubChild)
- attributes.register_attribute(Parent, 'child', uselist=False,
- backref="parent",
- parent_token=p_token,
- useobject=True)
- attributes.register_attribute(Child, 'parent', uselist=False,
- backref="child",
- parent_token=c_token,
- useobject=True)
- attributes.register_attribute(SubChild, 'parent',
- uselist=False,
- backref="child",
- parent_token=c_token,
- useobject=True)
+ attributes.register_attribute(
+ Parent,
+ "child",
+ uselist=False,
+ backref="parent",
+ parent_token=p_token,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Child,
+ "parent",
+ uselist=False,
+ backref="child",
+ parent_token=c_token,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ SubChild,
+ "parent",
+ uselist=False,
+ backref="child",
+ parent_token=c_token,
+ useobject=True,
+ )
p1 = Parent()
c1 = Child()
@@ -1331,18 +1507,30 @@ class BackrefTest(fixtures.ORMTest):
instrumentation.register_class(Parent)
instrumentation.register_class(SubParent)
instrumentation.register_class(Child)
- attributes.register_attribute(Parent, 'children', uselist=True,
- backref='parent',
- parent_token=p_token,
- useobject=True)
- attributes.register_attribute(SubParent, 'children', uselist=True,
- backref='parent',
- parent_token=p_token,
- useobject=True)
- attributes.register_attribute(Child, 'parent', uselist=False,
- backref='children',
- parent_token=c_token,
- useobject=True)
+ attributes.register_attribute(
+ Parent,
+ "children",
+ uselist=True,
+ backref="parent",
+ parent_token=p_token,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ SubParent,
+ "children",
+ uselist=True,
+ backref="parent",
+ parent_token=p_token,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Child,
+ "parent",
+ uselist=False,
+ backref="children",
+ parent_token=c_token,
+ useobject=True,
+ )
p1 = Parent()
p2 = SubParent()
@@ -1372,11 +1560,14 @@ class CyclicBackrefAssertionTest(fixtures.TestBase):
b1 = B()
assert_raises_message(
ValueError,
- 'Bidirectional attribute conflict detected: '
+ "Bidirectional attribute conflict detected: "
'Passing object <B at .*> to attribute "C.a" '
'triggers a modify event on attribute "C.b" '
'via the backref "B.c".',
- setattr, c1, 'a', b1
+ setattr,
+ c1,
+ "a",
+ b1,
)
def test_collection_append_type_assertion(self):
@@ -1385,11 +1576,12 @@ class CyclicBackrefAssertionTest(fixtures.TestBase):
b1 = B()
assert_raises_message(
ValueError,
- 'Bidirectional attribute conflict detected: '
+ "Bidirectional attribute conflict detected: "
'Passing object <B at .*> to attribute "C.a" '
'triggers a modify event on attribute "C.b" '
'via the backref "B.c".',
- c1.a.append, b1
+ c1.a.append,
+ b1,
)
def _scalar_fixture(self):
@@ -1401,16 +1593,19 @@ class CyclicBackrefAssertionTest(fixtures.TestBase):
class C(object):
pass
+
instrumentation.register_class(A)
instrumentation.register_class(B)
instrumentation.register_class(C)
- attributes.register_attribute(C, 'a', backref='c', useobject=True)
- attributes.register_attribute(C, 'b', backref='c', useobject=True)
+ attributes.register_attribute(C, "a", backref="c", useobject=True)
+ attributes.register_attribute(C, "b", backref="c", useobject=True)
- attributes.register_attribute(A, 'c', backref='a', useobject=True,
- uselist=True)
- attributes.register_attribute(B, 'c', backref='b', useobject=True,
- uselist=True)
+ attributes.register_attribute(
+ A, "c", backref="a", useobject=True, uselist=True
+ )
+ attributes.register_attribute(
+ B, "c", backref="b", useobject=True, uselist=True
+ )
return A, B, C
@@ -1423,17 +1618,20 @@ class CyclicBackrefAssertionTest(fixtures.TestBase):
class C(object):
pass
+
instrumentation.register_class(A)
instrumentation.register_class(B)
instrumentation.register_class(C)
- attributes.register_attribute(C, 'a', backref='c', useobject=True,
- uselist=True)
- attributes.register_attribute(C, 'b', backref='c', useobject=True,
- uselist=True)
+ attributes.register_attribute(
+ C, "a", backref="c", useobject=True, uselist=True
+ )
+ attributes.register_attribute(
+ C, "b", backref="c", useobject=True, uselist=True
+ )
- attributes.register_attribute(A, 'c', backref='a', useobject=True)
- attributes.register_attribute(B, 'c', backref='b', useobject=True)
+ attributes.register_attribute(A, "c", backref="a", useobject=True)
+ attributes.register_attribute(B, "c", backref="b", useobject=True)
return A, B, C
@@ -1443,15 +1641,18 @@ class CyclicBackrefAssertionTest(fixtures.TestBase):
class B(object):
pass
+
instrumentation.register_class(A)
instrumentation.register_class(B)
- attributes.register_attribute(A, 'b', backref='a1', useobject=True)
- attributes.register_attribute(B, 'a1', backref='b', useobject=True,
- uselist=True)
+ attributes.register_attribute(A, "b", backref="a1", useobject=True)
+ attributes.register_attribute(
+ B, "a1", backref="b", useobject=True, uselist=True
+ )
- attributes.register_attribute(B, 'a2', backref='b', useobject=True,
- uselist=True)
+ attributes.register_attribute(
+ B, "a2", backref="b", useobject=True, uselist=True
+ )
return A, B
@@ -1461,11 +1662,12 @@ class CyclicBackrefAssertionTest(fixtures.TestBase):
a1 = A()
assert_raises_message(
ValueError,
- 'Bidirectional attribute conflict detected: '
+ "Bidirectional attribute conflict detected: "
'Passing object <A at .*> to attribute "B.a2" '
'triggers a modify event on attribute "B.a1" '
'via the backref "A.b".',
- b1.a2.append, a1
+ b1.a2.append,
+ a1,
)
@@ -1474,6 +1676,7 @@ class PendingBackrefTest(fixtures.ORMTest):
class Post(object):
def __init__(self, name):
self.name = name
+
__hash__ = None
def __eq__(self, other):
@@ -1482,6 +1685,7 @@ class PendingBackrefTest(fixtures.ORMTest):
class Blog(object):
def __init__(self, name):
self.name = name
+
__hash__ = None
def __eq__(self, other):
@@ -1491,13 +1695,23 @@ class PendingBackrefTest(fixtures.ORMTest):
instrumentation.register_class(Post)
instrumentation.register_class(Blog)
- attributes.register_attribute(Post, 'blog', uselist=False,
- backref='posts', trackparent=True,
- useobject=True)
- attributes.register_attribute(Blog, 'posts', uselist=True,
- backref='blog', callable_=lazy_posts,
- trackparent=True,
- useobject=True)
+ attributes.register_attribute(
+ Post,
+ "blog",
+ uselist=False,
+ backref="posts",
+ trackparent=True,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Blog,
+ "posts",
+ uselist=True,
+ backref="blog",
+ callable_=lazy_posts,
+ trackparent=True,
+ useobject=True,
+ )
return Post, Blog, lazy_posts
@@ -1514,9 +1728,8 @@ class PendingBackrefTest(fixtures.ORMTest):
p.blog = b
eq_(
- lazy_posts.mock_calls, [
- call(b1_state, attributes.PASSIVE_NO_FETCH)
- ]
+ lazy_posts.mock_calls,
+ [call(b1_state, attributes.PASSIVE_NO_FETCH)],
)
p = Post("post 5")
@@ -1524,10 +1737,11 @@ class PendingBackrefTest(fixtures.ORMTest):
# setting blog doesn't call 'posts' callable, calls with no fetch
p.blog = b
eq_(
- lazy_posts.mock_calls, [
+ lazy_posts.mock_calls,
+ [
call(b1_state, attributes.PASSIVE_NO_FETCH),
- call(b1_state, attributes.PASSIVE_NO_FETCH)
- ]
+ call(b1_state, attributes.PASSIVE_NO_FETCH),
+ ],
)
lazy_posts.return_value = [p1, p2, p3]
@@ -1535,11 +1749,12 @@ class PendingBackrefTest(fixtures.ORMTest):
# calling backref calls the callable, populates extra posts
eq_(b.posts, [p1, p2, p3, Post("post 4"), Post("post 5")])
eq_(
- lazy_posts.mock_calls, [
+ lazy_posts.mock_calls,
+ [
call(b1_state, attributes.PASSIVE_NO_FETCH),
call(b1_state, attributes.PASSIVE_NO_FETCH),
- call(b1_state, attributes.PASSIVE_OFF)
- ]
+ call(b1_state, attributes.PASSIVE_OFF),
+ ],
)
def test_lazy_history_collection(self):
@@ -1557,9 +1772,12 @@ class PendingBackrefTest(fixtures.ORMTest):
eq_(lazy_posts.call_count, 1)
- eq_(attributes.instance_state(b).
- get_history('posts', attributes.PASSIVE_OFF),
- ([p, p4], [p1, p2, p3], []))
+ eq_(
+ attributes.instance_state(b).get_history(
+ "posts", attributes.PASSIVE_OFF
+ ),
+ ([p, p4], [p1, p2, p3], []),
+ )
eq_(lazy_posts.call_count, 1)
def test_passive_history_collection_never_set(self):
@@ -1570,34 +1788,36 @@ class PendingBackrefTest(fixtures.ORMTest):
b = Blog("blog 1")
p = Post("post 1")
- state, dict_ = (attributes.instance_state(b),
- attributes.instance_dict(b))
+ state, dict_ = (
+ attributes.instance_state(b),
+ attributes.instance_dict(b),
+ )
# this sets up NEVER_SET on b.posts
p.blog = b
eq_(state.committed_state, {"posts": attributes.NEVER_SET})
- assert 'posts' not in dict_
+ assert "posts" not in dict_
# then suppose the object was made transient again,
# the lazy loader would return this
lazy_posts.return_value = attributes.ATTR_EMPTY
- p2 = Post('asdf')
+ p2 = Post("asdf")
p2.blog = b
eq_(state.committed_state, {"posts": attributes.NEVER_SET})
- eq_(dict_['posts'], [p2])
+ eq_(dict_["posts"], [p2])
# then this would fail.
eq_(
Blog.posts.impl.get_history(state, dict_, passive=True),
- ([p2], (), ())
+ ([p2], (), ()),
)
eq_(
Blog.posts.impl.get_all_pending(state, dict_),
- [(attributes.instance_state(p2), p2)]
+ [(attributes.instance_state(p2), p2)],
)
def test_state_on_add_remove(self):
@@ -1608,18 +1828,28 @@ class PendingBackrefTest(fixtures.ORMTest):
b1_state = attributes.instance_state(b)
p = Post("post 1")
p.blog = b
- eq_(lazy_posts.mock_calls,
- [call(b1_state, attributes.PASSIVE_NO_FETCH)])
+ eq_(
+ lazy_posts.mock_calls,
+ [call(b1_state, attributes.PASSIVE_NO_FETCH)],
+ )
p.blog = None
- eq_(lazy_posts.mock_calls,
- [call(b1_state, attributes.PASSIVE_NO_FETCH),
- call(b1_state, attributes.PASSIVE_NO_FETCH)])
+ eq_(
+ lazy_posts.mock_calls,
+ [
+ call(b1_state, attributes.PASSIVE_NO_FETCH),
+ call(b1_state, attributes.PASSIVE_NO_FETCH),
+ ],
+ )
lazy_posts.return_value = []
eq_(b.posts, [])
- eq_(lazy_posts.mock_calls,
- [call(b1_state, attributes.PASSIVE_NO_FETCH),
- call(b1_state, attributes.PASSIVE_NO_FETCH),
- call(b1_state, attributes.PASSIVE_OFF)])
+ eq_(
+ lazy_posts.mock_calls,
+ [
+ call(b1_state, attributes.PASSIVE_NO_FETCH),
+ call(b1_state, attributes.PASSIVE_NO_FETCH),
+ call(b1_state, attributes.PASSIVE_OFF),
+ ],
+ )
def test_pending_combines_with_lazy(self):
Post, Blog, lazy_posts = self._fixture()
@@ -1644,13 +1874,16 @@ class PendingBackrefTest(fixtures.ORMTest):
def test_normal_load(self):
Post, Blog, lazy_posts = self._fixture()
- lazy_posts.return_value = \
- (p1, p2, p3) = [Post("post 1"), Post("post 2"), Post("post 3")]
+ lazy_posts.return_value = (p1, p2, p3) = [
+ Post("post 1"),
+ Post("post 2"),
+ Post("post 3"),
+ ]
b = Blog("blog 1")
# assign without using backref system
- p2.__dict__['blog'] = b
+ p2.__dict__["blog"] = b
eq_(b.posts, [Post("post 1"), Post("post 2"), Post("post 3")])
@@ -1663,8 +1896,7 @@ class PendingBackrefTest(fixtures.ORMTest):
b_state = attributes.instance_state(b)
eq_(lazy_posts.call_count, 1)
- eq_(lazy_posts.mock_calls,
- [call(b_state, attributes.PASSIVE_OFF)])
+ eq_(lazy_posts.mock_calls, [call(b_state, attributes.PASSIVE_OFF)])
def test_commit_removes_pending(self):
Post, Blog, lazy_posts = self._fixture()
@@ -1681,24 +1913,29 @@ class PendingBackrefTest(fixtures.ORMTest):
p1_state._commit_all(attributes.instance_dict(p1))
lazy_posts.return_value = [p1]
eq_(b.posts, [Post("post 1")])
- eq_(lazy_posts.mock_calls,
- [call(b_state, attributes.PASSIVE_NO_FETCH),
- call(b_state, attributes.PASSIVE_OFF)])
+ eq_(
+ lazy_posts.mock_calls,
+ [
+ call(b_state, attributes.PASSIVE_NO_FETCH),
+ call(b_state, attributes.PASSIVE_OFF),
+ ],
+ )
class HistoryTest(fixtures.TestBase):
-
def _fixture(self, uselist, useobject, active_history, **kw):
class Foo(fixtures.BasicEntity):
pass
instrumentation.register_class(Foo)
attributes.register_attribute(
- Foo, 'someattr',
+ Foo,
+ "someattr",
uselist=uselist,
useobject=useobject,
active_history=active_history,
- **kw)
+ **kw
+ )
return Foo
def _two_obj_fixture(self, uselist, active_history=False):
@@ -1711,75 +1948,85 @@ class HistoryTest(fixtures.TestBase):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'someattr', uselist=uselist,
- useobject=True,
- active_history=active_history)
+ attributes.register_attribute(
+ Foo,
+ "someattr",
+ uselist=uselist,
+ useobject=True,
+ active_history=active_history,
+ )
return Foo, Bar
def _someattr_history(self, f, **kw):
- passive = kw.pop('passive', None)
+ passive = kw.pop("passive", None)
if passive is True:
- kw['passive'] = attributes.PASSIVE_NO_INITIALIZE
+ kw["passive"] = attributes.PASSIVE_NO_INITIALIZE
elif passive is False:
- kw['passive'] = attributes.PASSIVE_OFF
+ kw["passive"] = attributes.PASSIVE_OFF
return attributes.get_state_history(
- attributes.instance_state(f),
- 'someattr', **kw)
+ attributes.instance_state(f), "someattr", **kw
+ )
def _commit_someattr(self, f):
- attributes.instance_state(f)._commit(attributes.instance_dict(f),
- ['someattr'])
+ attributes.instance_state(f)._commit(
+ attributes.instance_dict(f), ["someattr"]
+ )
def _someattr_committed_state(self, f):
Foo = f.__class__
return Foo.someattr.impl.get_committed_value(
- attributes.instance_state(f),
- attributes.instance_dict(f))
+ attributes.instance_state(f), attributes.instance_dict(f)
+ )
def test_committed_value_init(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
eq_(self._someattr_committed_state(f), None)
def test_committed_value_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
f.someattr = 3
eq_(self._someattr_committed_state(f), None)
def test_committed_value_set_active_hist(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
f.someattr = 3
eq_(self._someattr_committed_state(f), None)
def test_committed_value_set_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
f.someattr = 3
self._commit_someattr(f)
eq_(self._someattr_committed_state(f), 3)
def test_scalar_init(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
eq_(self._someattr_history(f), ((), (), ()))
def test_object_init(self):
- Foo = self._fixture(uselist=False, useobject=True,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=True, active_history=False
+ )
f = Foo()
eq_(self._someattr_history(f), ((), (), ()))
def test_object_init_active_history(self):
- Foo = self._fixture(uselist=False, useobject=True,
- active_history=True)
+ Foo = self._fixture(uselist=False, useobject=True, active_history=True)
f = Foo()
eq_(self._someattr_history(f), ((), (), ()))
@@ -1810,8 +2057,8 @@ class HistoryTest(fixtures.TestBase):
f.someattr = b1
self._commit_someattr(f)
- attributes.instance_state(f).dict.pop('someattr', None)
- attributes.instance_state(f).expired_attributes.add('someattr')
+ attributes.instance_state(f).dict.pop("someattr", None)
+ attributes.instance_state(f).expired_attributes.add("someattr")
f.someattr = None
eq_(self._someattr_history(f), ([None], (), ()))
@@ -1838,29 +2085,31 @@ class HistoryTest(fixtures.TestBase):
# is db-loaded when testing if an empty "del" is valid,
# because there's nothing else to look at for a related
# object, there's no "expired" status
- attributes.instance_state(f).key = ('foo', )
+ attributes.instance_state(f).key = ("foo",)
attributes.instance_state(f)._expire_attributes(
- attributes.instance_dict(f),
- ['someattr'])
+ attributes.instance_dict(f), ["someattr"]
+ )
del f.someattr
eq_(self._someattr_history(f), ([None], (), ()))
def test_scalar_no_init_side_effect(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
self._someattr_history(f)
# no side effects
- assert 'someattr' not in f.__dict__
- assert 'someattr' not in attributes.instance_state(f).committed_state
+ assert "someattr" not in f.__dict__
+ assert "someattr" not in attributes.instance_state(f).committed_state
def test_scalar_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'hi'
- eq_(self._someattr_history(f), (['hi'], (), ()))
+ f.someattr = "hi"
+ eq_(self._someattr_history(f), (["hi"], (), ()))
def test_scalar_set_None(self):
# note - compare:
@@ -1868,8 +2117,9 @@ class HistoryTest(fixtures.TestBase):
# test_scalar_get_first_set_None,
# test_use_object_set_None,
# test_use_object_get_first_set_None
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
f.someattr = None
eq_(self._someattr_history(f), ([None], (), ()))
@@ -1880,11 +2130,12 @@ class HistoryTest(fixtures.TestBase):
# test_scalar_get_first_set_None,
# test_use_object_set_None,
# test_use_object_get_first_set_None
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
f.someattr = 5
- attributes.instance_state(f).key = ('foo', )
+ attributes.instance_state(f).key = ("foo",)
self._commit_someattr(f)
del f.someattr
@@ -1896,15 +2147,16 @@ class HistoryTest(fixtures.TestBase):
# test_scalar_get_first_set_None,
# test_use_object_set_None,
# test_use_object_get_first_set_None
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
f.someattr = 5
self._commit_someattr(f)
attributes.instance_state(f)._expire_attributes(
- attributes.instance_dict(f),
- ['someattr'])
+ attributes.instance_dict(f), ["someattr"]
+ )
del f.someattr
eq_(self._someattr_history(f), ([None], (), ()))
@@ -1914,224 +2166,247 @@ class HistoryTest(fixtures.TestBase):
# test_scalar_get_first_set_None,
# test_use_object_set_None,
# test_use_object_get_first_set_None
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
assert f.someattr is None
f.someattr = None
eq_(self._someattr_history(f), ([None], (), ()))
def test_scalar_set_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'hi'
+ f.someattr = "hi"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['hi'], ()))
+ eq_(self._someattr_history(f), ((), ["hi"], ()))
def test_scalar_set_commit_reset(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'hi'
+ f.someattr = "hi"
self._commit_someattr(f)
- f.someattr = 'there'
- eq_(self._someattr_history(f), (['there'], (), ['hi']))
+ f.someattr = "there"
+ eq_(self._someattr_history(f), (["there"], (), ["hi"]))
def test_scalar_set_commit_reset_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'hi'
+ f.someattr = "hi"
self._commit_someattr(f)
- f.someattr = 'there'
+ f.someattr = "there"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['there'], ()))
+ eq_(self._someattr_history(f), ((), ["there"], ()))
def test_scalar_set_commit_reset_commit_del(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'there'
+ f.someattr = "there"
self._commit_someattr(f)
del f.someattr
- eq_(self._someattr_history(f), ((), (), ['there']))
+ eq_(self._someattr_history(f), ((), (), ["there"]))
def test_scalar_set_dict(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
- eq_(self._someattr_history(f), ((), ['new'], ()))
+ f.__dict__["someattr"] = "new"
+ eq_(self._someattr_history(f), ((), ["new"], ()))
def test_scalar_set_dict_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
+ f.__dict__["someattr"] = "new"
self._someattr_history(f)
- f.someattr = 'old'
- eq_(self._someattr_history(f), (['old'], (), ['new']))
+ f.someattr = "old"
+ eq_(self._someattr_history(f), (["old"], (), ["new"]))
def test_scalar_set_dict_set_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
+ f.__dict__["someattr"] = "new"
self._someattr_history(f)
- f.someattr = 'old'
+ f.someattr = "old"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['old'], ()))
+ eq_(self._someattr_history(f), ((), ["old"], ()))
def test_scalar_set_None_from_dict_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
+ f.__dict__["someattr"] = "new"
f.someattr = None
- eq_(self._someattr_history(f), ([None], (), ['new']))
+ eq_(self._someattr_history(f), ([None], (), ["new"]))
def test_scalar_set_twice_no_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'one'
- eq_(self._someattr_history(f), (['one'], (), ()))
- f.someattr = 'two'
- eq_(self._someattr_history(f), (['two'], (), ()))
+ f.someattr = "one"
+ eq_(self._someattr_history(f), (["one"], (), ()))
+ f.someattr = "two"
+ eq_(self._someattr_history(f), (["two"], (), ()))
def test_scalar_active_init(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
eq_(self._someattr_history(f), ((), (), ()))
def test_scalar_active_no_init_side_effect(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
self._someattr_history(f)
# no side effects
- assert 'someattr' not in f.__dict__
- assert 'someattr' not in attributes.instance_state(f).committed_state
+ assert "someattr" not in f.__dict__
+ assert "someattr" not in attributes.instance_state(f).committed_state
def test_collection_never_set(self):
- Foo = self._fixture(uselist=True, useobject=True,
- active_history=True)
+ Foo = self._fixture(uselist=True, useobject=True, active_history=True)
f = Foo()
eq_(self._someattr_history(f, passive=True), (None, None, None))
def test_scalar_obj_never_set(self):
- Foo = self._fixture(uselist=False, useobject=True,
- active_history=True)
+ Foo = self._fixture(uselist=False, useobject=True, active_history=True)
f = Foo()
eq_(self._someattr_history(f, passive=True), (None, None, None))
def test_scalar_never_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
eq_(self._someattr_history(f, passive=True), (None, None, None))
def test_scalar_active_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'hi'
- eq_(self._someattr_history(f), (['hi'], (), ()))
+ f.someattr = "hi"
+ eq_(self._someattr_history(f), (["hi"], (), ()))
def test_scalar_active_set_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'hi'
+ f.someattr = "hi"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['hi'], ()))
+ eq_(self._someattr_history(f), ((), ["hi"], ()))
def test_scalar_active_set_commit_reset(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'hi'
+ f.someattr = "hi"
self._commit_someattr(f)
- f.someattr = 'there'
- eq_(self._someattr_history(f), (['there'], (), ['hi']))
+ f.someattr = "there"
+ eq_(self._someattr_history(f), (["there"], (), ["hi"]))
def test_scalar_active_set_commit_reset_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'hi'
+ f.someattr = "hi"
self._commit_someattr(f)
- f.someattr = 'there'
+ f.someattr = "there"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['there'], ()))
+ eq_(self._someattr_history(f), ((), ["there"], ()))
def test_scalar_active_set_commit_reset_commit_del(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'there'
+ f.someattr = "there"
self._commit_someattr(f)
del f.someattr
- eq_(self._someattr_history(f), ((), (), ['there']))
+ eq_(self._someattr_history(f), ((), (), ["there"]))
def test_scalar_active_set_dict(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
- eq_(self._someattr_history(f), ((), ['new'], ()))
+ f.__dict__["someattr"] = "new"
+ eq_(self._someattr_history(f), ((), ["new"], ()))
def test_scalar_active_set_dict_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
+ f.__dict__["someattr"] = "new"
self._someattr_history(f)
- f.someattr = 'old'
- eq_(self._someattr_history(f), (['old'], (), ['new']))
+ f.someattr = "old"
+ eq_(self._someattr_history(f), (["old"], (), ["new"]))
def test_scalar_active_set_dict_set_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
+ f.__dict__["someattr"] = "new"
self._someattr_history(f)
- f.someattr = 'old'
+ f.someattr = "old"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['old'], ()))
+ eq_(self._someattr_history(f), ((), ["old"], ()))
def test_scalar_active_set_None(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
f.someattr = None
eq_(self._someattr_history(f), ([None], (), ()))
def test_scalar_active_set_None_from_dict_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.__dict__['someattr'] = 'new'
+ f.__dict__["someattr"] = "new"
f.someattr = None
- eq_(self._someattr_history(f), ([None], (), ['new']))
+ eq_(self._someattr_history(f), ([None], (), ["new"]))
def test_scalar_active_set_twice_no_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'one'
- eq_(self._someattr_history(f), (['one'], (), ()))
- f.someattr = 'two'
- eq_(self._someattr_history(f), (['two'], (), ()))
+ f.someattr = "one"
+ eq_(self._someattr_history(f), (["one"], (), ()))
+ f.someattr = "two"
+ eq_(self._someattr_history(f), (["two"], (), ()))
def test_scalar_passive_flag(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=True)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=True
+ )
f = Foo()
- f.someattr = 'one'
- eq_(self._someattr_history(f), (['one'], (), ()))
+ f.someattr = "one"
+ eq_(self._someattr_history(f), (["one"], (), ()))
self._commit_someattr(f)
@@ -2139,114 +2414,126 @@ class HistoryTest(fixtures.TestBase):
# do the same thing that
# populators.expire.append((self.key, True))
# does in loading.py
- state.dict.pop('someattr', None)
- state.expired_attributes.add('someattr')
+ state.dict.pop("someattr", None)
+ state.expired_attributes.add("someattr")
def scalar_loader(state, toload):
- state.dict['someattr'] = 'one'
+ state.dict["someattr"] = "one"
+
state.manager.deferred_scalar_loader = scalar_loader
- eq_(self._someattr_history(f), ((), ['one'], ()))
+ eq_(self._someattr_history(f), ((), ["one"], ()))
def test_scalar_inplace_mutation_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
- eq_(self._someattr_history(f), ([{'a': 'b'}], (), ()))
+ f.someattr = {"a": "b"}
+ eq_(self._someattr_history(f), ([{"a": "b"}], (), ()))
def test_scalar_inplace_mutation_set_commit(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
+ f.someattr = {"a": "b"}
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), [{'a': 'b'}], ()))
+ eq_(self._someattr_history(f), ((), [{"a": "b"}], ()))
def test_scalar_inplace_mutation_set_commit_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
+ f.someattr = {"a": "b"}
self._commit_someattr(f)
- f.someattr['a'] = 'c'
- eq_(self._someattr_history(f), ((), [{'a': 'c'}], ()))
+ f.someattr["a"] = "c"
+ eq_(self._someattr_history(f), ((), [{"a": "c"}], ()))
def test_scalar_inplace_mutation_set_commit_flag_modified(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
+ f.someattr = {"a": "b"}
self._commit_someattr(f)
- attributes.flag_modified(f, 'someattr')
- eq_(self._someattr_history(f), ([{'a': 'b'}], (), ()))
+ attributes.flag_modified(f, "someattr")
+ eq_(self._someattr_history(f), ([{"a": "b"}], (), ()))
def test_scalar_inplace_mutation_set_commit_set_flag_modified(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
+ f.someattr = {"a": "b"}
self._commit_someattr(f)
- f.someattr['a'] = 'c'
- attributes.flag_modified(f, 'someattr')
- eq_(self._someattr_history(f), ([{'a': 'c'}], (), ()))
+ f.someattr["a"] = "c"
+ attributes.flag_modified(f, "someattr")
+ eq_(self._someattr_history(f), ([{"a": "c"}], (), ()))
def test_scalar_inplace_mutation_set_commit_flag_modified_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
+ f.someattr = {"a": "b"}
self._commit_someattr(f)
- attributes.flag_modified(f, 'someattr')
- eq_(self._someattr_history(f), ([{'a': 'b'}], (), ()))
- f.someattr = ['a']
- eq_(self._someattr_history(f), ([['a']], (), ()))
+ attributes.flag_modified(f, "someattr")
+ eq_(self._someattr_history(f), ([{"a": "b"}], (), ()))
+ f.someattr = ["a"]
+ eq_(self._someattr_history(f), ([["a"]], (), ()))
def test_scalar_inplace_mutation_replace_self_flag_modified_set(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = {'a': 'b'}
+ f.someattr = {"a": "b"}
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), [{'a': 'b'}], ()))
+ eq_(self._someattr_history(f), ((), [{"a": "b"}], ()))
# set the attribute to itself; this places a copy
# in committed_state
f.someattr = f.someattr
- attributes.flag_modified(f, 'someattr')
- eq_(self._someattr_history(f), ([{'a': 'b'}], (), ()))
+ attributes.flag_modified(f, "someattr")
+ eq_(self._someattr_history(f), ([{"a": "b"}], (), ()))
def test_flag_modified_but_no_value_raises(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'foo'
+ f.someattr = "foo"
self._commit_someattr(f)
- eq_(self._someattr_history(f), ((), ['foo'], ()))
+ eq_(self._someattr_history(f), ((), ["foo"], ()))
attributes.instance_state(f)._expire_attributes(
- attributes.instance_dict(f),
- ['someattr'])
+ attributes.instance_dict(f), ["someattr"]
+ )
assert_raises_message(
sa_exc.InvalidRequestError,
"Can't flag attribute 'someattr' modified; it's "
"not present in the object state",
- attributes.flag_modified, f, 'someattr'
+ attributes.flag_modified,
+ f,
+ "someattr",
)
def test_mark_dirty_no_attr(self):
- Foo = self._fixture(uselist=False, useobject=False,
- active_history=False)
+ Foo = self._fixture(
+ uselist=False, useobject=False, active_history=False
+ )
f = Foo()
- f.someattr = 'foo'
+ f.someattr = "foo"
attributes.instance_state(f)._commit_all(f.__dict__)
- eq_(self._someattr_history(f), ((), ['foo'], ()))
+ eq_(self._someattr_history(f), ((), ["foo"], ()))
attributes.instance_state(f)._expire_attributes(
- attributes.instance_dict(f),
- ['someattr'])
+ attributes.instance_dict(f), ["someattr"]
+ )
is_false(attributes.instance_state(f).modified)
@@ -2263,20 +2550,20 @@ class HistoryTest(fixtures.TestBase):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
self._someattr_history(f)
- assert 'someattr' not in f.__dict__
- assert 'someattr' not in attributes.instance_state(f).committed_state
+ assert "someattr" not in f.__dict__
+ assert "someattr" not in attributes.instance_state(f).committed_state
def test_use_object_set(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
+ hi = Bar(name="hi")
f.someattr = hi
eq_(self._someattr_history(f), ([hi], (), ()))
def test_use_object_set_commit(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
+ hi = Bar(name="hi")
f.someattr = hi
self._commit_someattr(f)
eq_(self._someattr_history(f), ((), [hi], ()))
@@ -2284,20 +2571,20 @@ class HistoryTest(fixtures.TestBase):
def test_use_object_set_commit_set(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
+ hi = Bar(name="hi")
f.someattr = hi
self._commit_someattr(f)
- there = Bar(name='there')
+ there = Bar(name="there")
f.someattr = there
eq_(self._someattr_history(f), ([there], (), [hi]))
def test_use_object_set_commit_set_commit(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
+ hi = Bar(name="hi")
f.someattr = hi
self._commit_someattr(f)
- there = Bar(name='there')
+ there = Bar(name="there")
f.someattr = there
self._commit_someattr(f)
eq_(self._someattr_history(f), ((), [there], ()))
@@ -2305,7 +2592,7 @@ class HistoryTest(fixtures.TestBase):
def test_use_object_set_commit_del(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
+ hi = Bar(name="hi")
f.someattr = hi
self._commit_someattr(f)
del f.someattr
@@ -2314,27 +2601,27 @@ class HistoryTest(fixtures.TestBase):
def test_use_object_set_dict(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
- f.__dict__['someattr'] = hi
+ hi = Bar(name="hi")
+ f.__dict__["someattr"] = hi
eq_(self._someattr_history(f), ((), [hi], ()))
def test_use_object_set_dict_set(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
- f.__dict__['someattr'] = hi
+ hi = Bar(name="hi")
+ f.__dict__["someattr"] = hi
- there = Bar(name='there')
+ there = Bar(name="there")
f.someattr = there
eq_(self._someattr_history(f), ([there], (), [hi]))
def test_use_object_set_dict_set_commit(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
- f.__dict__['someattr'] = hi
+ hi = Bar(name="hi")
+ f.__dict__["someattr"] = hi
- there = Bar(name='there')
+ there = Bar(name="there")
f.someattr = there
self._commit_someattr(f)
eq_(self._someattr_history(f), ((), [there], ()))
@@ -2365,16 +2652,16 @@ class HistoryTest(fixtures.TestBase):
def test_use_object_set_dict_set_None(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
- f.__dict__['someattr'] = hi
+ hi = Bar(name="hi")
+ f.__dict__["someattr"] = hi
f.someattr = None
eq_(self._someattr_history(f), ([None], (), [hi]))
def test_use_object_set_value_twice(self):
Foo, Bar = self._two_obj_fixture(uselist=False)
f = Foo()
- hi = Bar(name='hi')
- there = Bar(name='there')
+ hi = Bar(name="hi")
+ there = Bar(name="there")
f.someattr = hi
f.someattr = there
eq_(self._someattr_history(f), ([there], (), ()))
@@ -2383,51 +2670,90 @@ class HistoryTest(fixtures.TestBase):
# TODO: break into individual tests
Foo, Bar = self._two_obj_fixture(uselist=True)
- hi = Bar(name='hi')
- there = Bar(name='there')
- old = Bar(name='old')
- new = Bar(name='new')
+ hi = Bar(name="hi")
+ there = Bar(name="there")
+ old = Bar(name="old")
+ new = Bar(name="new")
# case 1. new object
f = Foo()
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [], ()),
+ )
f.someattr = [hi]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([hi], [], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi], [], []),
+ )
self._commit_someattr(f)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [hi], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [hi], ()),
+ )
f.someattr = [there]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([there], [], [hi]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([there], [], [hi]),
+ )
self._commit_someattr(f)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [there], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [there], ()),
+ )
f.someattr = [hi]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([hi], [], [there]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi], [], [there]),
+ )
f.someattr = [old, new]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'),
- ([old, new], [], [there]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([old, new], [], [there]),
+ )
# case 2. object with direct settings (similar to a load
# operation)
f = Foo()
- collection = attributes.init_collection(f, 'someattr')
+ collection = attributes.init_collection(f, "someattr")
collection.append_without_event(new)
attributes.instance_state(f)._commit_all(attributes.instance_dict(f))
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [new], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [new], ()),
+ )
f.someattr = [old]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([old], [], [new]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([old], [], [new]),
+ )
self._commit_someattr(f)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [old], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [old], ()),
+ )
def test_dict_collections(self):
# TODO: break into individual tests
@@ -2439,31 +2765,58 @@ class HistoryTest(fixtures.TestBase):
pass
from sqlalchemy.orm.collections import attribute_mapped_collection
+
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
attributes.register_attribute(
- Foo, 'someattr', uselist=True, useobject=True,
- typecallable=attribute_mapped_collection('name'))
- hi = Bar(name='hi')
- there = Bar(name='there')
- old = Bar(name='old')
- new = Bar(name='new')
- f = Foo()
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [], ()))
- f.someattr['hi'] = hi
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([hi], [], []))
- f.someattr['there'] = there
- eq_(tuple([set(x) for x in
- attributes.get_state_history(attributes.instance_state(f),
- 'someattr')]),
- (set([hi, there]), set(), set()))
+ Foo,
+ "someattr",
+ uselist=True,
+ useobject=True,
+ typecallable=attribute_mapped_collection("name"),
+ )
+ hi = Bar(name="hi")
+ there = Bar(name="there")
+ old = Bar(name="old")
+ new = Bar(name="new")
+ f = Foo()
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [], ()),
+ )
+ f.someattr["hi"] = hi
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi], [], []),
+ )
+ f.someattr["there"] = there
+ eq_(
+ tuple(
+ [
+ set(x)
+ for x in attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ )
+ ]
+ ),
+ (set([hi, there]), set(), set()),
+ )
self._commit_someattr(f)
- eq_(tuple([set(x) for x in
- attributes.get_state_history(attributes.instance_state(f),
- 'someattr')]),
- (set(), set([hi, there]), set()))
+ eq_(
+ tuple(
+ [
+ set(x)
+ for x in attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ )
+ ]
+ ),
+ (set(), set([hi, there]), set()),
+ )
def test_object_collections_mutate(self):
# TODO: break into individual tests
@@ -2475,89 +2828,160 @@ class HistoryTest(fixtures.TestBase):
pass
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'someattr', uselist=True,
- useobject=True)
- attributes.register_attribute(Foo, 'id', uselist=False,
- useobject=False)
+ attributes.register_attribute(
+ Foo, "someattr", uselist=True, useobject=True
+ )
+ attributes.register_attribute(
+ Foo, "id", uselist=False, useobject=False
+ )
instrumentation.register_class(Bar)
- hi = Bar(name='hi')
- there = Bar(name='there')
- old = Bar(name='old')
- new = Bar(name='new')
+ hi = Bar(name="hi")
+ there = Bar(name="there")
+ old = Bar(name="old")
+ new = Bar(name="new")
# case 1. new object
f = Foo(id=1)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [], ()),
+ )
f.someattr.append(hi)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([hi], [], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi], [], []),
+ )
self._commit_someattr(f)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [hi], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [hi], ()),
+ )
f.someattr.append(there)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([there], [hi], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([there], [hi], []),
+ )
self._commit_someattr(f)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [hi, there], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [hi, there], ()),
+ )
f.someattr.remove(there)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([], [hi], [there]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([], [hi], [there]),
+ )
f.someattr.append(old)
f.someattr.append(new)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'),
- ([old, new], [hi], [there]))
- attributes.instance_state(f)._commit(attributes.instance_dict(f),
- ['someattr'])
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [hi, old, new], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([old, new], [hi], [there]),
+ )
+ attributes.instance_state(f)._commit(
+ attributes.instance_dict(f), ["someattr"]
+ )
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [hi, old, new], ()),
+ )
f.someattr.pop(0)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([], [old, new], [hi]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([], [old, new], [hi]),
+ )
# case 2. object with direct settings (similar to a load
# operation)
f = Foo()
- f.__dict__['id'] = 1
- collection = attributes.init_collection(f, 'someattr')
+ f.__dict__["id"] = 1
+ collection = attributes.init_collection(f, "someattr")
collection.append_without_event(new)
attributes.instance_state(f)._commit_all(attributes.instance_dict(f))
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [new], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [new], ()),
+ )
f.someattr.append(old)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([old], [new], []))
- attributes.instance_state(f)._commit(attributes.instance_dict(f),
- ['someattr'])
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [new, old], ()))
- f = Foo()
- collection = attributes.init_collection(f, 'someattr')
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([old], [new], []),
+ )
+ attributes.instance_state(f)._commit(
+ attributes.instance_dict(f), ["someattr"]
+ )
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [new, old], ()),
+ )
+ f = Foo()
+ collection = attributes.init_collection(f, "someattr")
collection.append_without_event(new)
attributes.instance_state(f)._commit_all(attributes.instance_dict(f))
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ((), [new], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [new], ()),
+ )
f.id = 1
f.someattr.remove(new)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([], [], [new]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([], [], [new]),
+ )
# case 3. mixing appends with sets
f = Foo()
f.someattr.append(hi)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([hi], [], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi], [], []),
+ )
f.someattr.append(there)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([hi, there], [], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi, there], [], []),
+ )
f.someattr = [there]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'), ([there], [], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([there], [], []),
+ )
# case 4. ensure duplicates show up, order is maintained
@@ -2565,17 +2989,26 @@ class HistoryTest(fixtures.TestBase):
f.someattr.append(hi)
f.someattr.append(there)
f.someattr.append(hi)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'),
- ([hi, there, hi], [], []))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([hi, there, hi], [], []),
+ )
attributes.instance_state(f)._commit_all(attributes.instance_dict(f))
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'),
- ((), [hi, there, hi], ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ((), [hi, there, hi], ()),
+ )
f.someattr = []
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'someattr'),
- ([], [], [hi, there, hi]))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f), "someattr"
+ ),
+ ([], [], [hi, there, hi]),
+ )
def test_collections_via_backref(self):
# TODO: break into individual tests
@@ -2588,48 +3021,84 @@ class HistoryTest(fixtures.TestBase):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'bars', uselist=True,
- backref='foo', trackparent=True,
- useobject=True)
- attributes.register_attribute(Bar, 'foo', uselist=False,
- backref='bars', trackparent=True,
- useobject=True)
+ attributes.register_attribute(
+ Foo,
+ "bars",
+ uselist=True,
+ backref="foo",
+ trackparent=True,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Bar,
+ "foo",
+ uselist=False,
+ backref="bars",
+ trackparent=True,
+ useobject=True,
+ )
f1 = Foo()
b1 = Bar()
- eq_(attributes.get_state_history(attributes.instance_state(f1),
- 'bars'), ((), [], ()))
- eq_(attributes.get_state_history(attributes.instance_state(b1),
- 'foo'), ((), (), ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f1), "bars"
+ ),
+ ((), [], ()),
+ )
+ eq_(
+ attributes.get_state_history(attributes.instance_state(b1), "foo"),
+ ((), (), ()),
+ )
# b1.foo = f1
f1.bars.append(b1)
- eq_(attributes.get_state_history(attributes.instance_state(f1),
- 'bars'), ([b1], [], []))
- eq_(attributes.get_state_history(attributes.instance_state(b1),
- 'foo'), ([f1], (), ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f1), "bars"
+ ),
+ ([b1], [], []),
+ )
+ eq_(
+ attributes.get_state_history(attributes.instance_state(b1), "foo"),
+ ([f1], (), ()),
+ )
b2 = Bar()
f1.bars.append(b2)
- eq_(attributes.get_state_history(attributes.instance_state(f1),
- 'bars'), ([b1, b2], [], []))
- eq_(attributes.get_state_history(attributes.instance_state(b1),
- 'foo'), ([f1], (), ()))
- eq_(attributes.get_state_history(attributes.instance_state(b2),
- 'foo'), ([f1], (), ()))
+ eq_(
+ attributes.get_state_history(
+ attributes.instance_state(f1), "bars"
+ ),
+ ([b1, b2], [], []),
+ )
+ eq_(
+ attributes.get_state_history(attributes.instance_state(b1), "foo"),
+ ([f1], (), ()),
+ )
+ eq_(
+ attributes.get_state_history(attributes.instance_state(b2), "foo"),
+ ([f1], (), ()),
+ )
def test_deprecated_flags(self):
assert_raises_message(
sa_exc.SADeprecationWarning,
"Passing True for 'passive' is deprecated. "
"Use attributes.PASSIVE_NO_INITIALIZE",
- attributes.get_history, object(), 'foo', True
+ attributes.get_history,
+ object(),
+ "foo",
+ True,
)
assert_raises_message(
sa_exc.SADeprecationWarning,
"Passing False for 'passive' is deprecated. "
"Use attributes.PASSIVE_OFF",
- attributes.get_history, object(), 'foo', False
+ attributes.get_history,
+ object(),
+ "foo",
+ False,
)
@@ -2650,34 +3119,48 @@ class LazyloadHistoryTest(fixtures.TestBase):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'bars', uselist=True,
- backref='foo', trackparent=True,
- callable_=lazyload,
- useobject=True)
- attributes.register_attribute(Bar, 'foo', uselist=False,
- backref='bars', trackparent=True,
- useobject=True)
- bar1, bar2, bar3, bar4 = [Bar(id=1), Bar(id=2), Bar(id=3),
- Bar(id=4)]
+ attributes.register_attribute(
+ Foo,
+ "bars",
+ uselist=True,
+ backref="foo",
+ trackparent=True,
+ callable_=lazyload,
+ useobject=True,
+ )
+ attributes.register_attribute(
+ Bar,
+ "foo",
+ uselist=False,
+ backref="bars",
+ 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()
bar4 = Bar()
bar4.foo = f
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'bars'),
- ([bar4], [bar1, bar2, bar3], []))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([bar4], [bar1, bar2, bar3], []),
+ )
lazy_load = None
f = Foo()
bar4 = Bar()
bar4.foo = f
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bars'),
- ([bar4], [], []))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([bar4], [], []),
+ )
lazy_load = [bar1, bar2, bar3]
attributes.instance_state(f)._expire_attributes(
- attributes.instance_dict(f),
- ['bars'])
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bars'),
- ((), [bar1, bar2, bar3], ()))
+ attributes.instance_dict(f), ["bars"]
+ )
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ((), [bar1, bar2, bar3], ()),
+ )
def test_collections_via_lazyload(self):
# TODO: break into individual tests
@@ -2695,36 +3178,52 @@ class LazyloadHistoryTest(fixtures.TestBase):
instrumentation.register_class(Foo)
instrumentation.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)]
+ 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 = []
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bars'),
- ([], [], [bar1, bar2, bar3]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([], [], [bar1, bar2, bar3]),
+ )
f = Foo()
f.bars.append(bar4)
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bars'),
- ([bar4], [bar1, bar2, bar3], []))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([bar4], [bar1, bar2, bar3], []),
+ )
f = Foo()
f.bars.remove(bar2)
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'bars'), ([], [bar1, bar3], [bar2]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([], [bar1, bar3], [bar2]),
+ )
f.bars.append(bar4)
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bars'),
- ([bar4], [bar1, bar3], [bar2]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([bar4], [bar1, bar3], [bar2]),
+ )
f = Foo()
del f.bars[1]
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'bars'), ([], [bar1, bar3], [bar2]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([], [bar1, bar3], [bar2]),
+ )
lazy_load = None
f = Foo()
f.bars.append(bar2)
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bars'),
- ([bar2], [], []))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bars"),
+ ([bar2], [], []),
+ )
def test_scalar_via_lazyload(self):
# TODO: break into individual tests
@@ -2738,36 +3237,49 @@ class LazyloadHistoryTest(fixtures.TestBase):
return lazy_load
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'bar', uselist=False,
- callable_=lazyload, useobject=False)
- lazy_load = 'hi'
+ attributes.register_attribute(
+ Foo, "bar", uselist=False, callable_=lazyload, useobject=False
+ )
+ lazy_load = "hi"
# with scalar non-object and active_history=False, the lazy
# callable is only executed on gets, not history operations
f = Foo()
- eq_(f.bar, 'hi')
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), ['hi'], ()))
+ eq_(f.bar, "hi")
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), ["hi"], ()),
+ )
f = Foo()
f.bar = None
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'bar'), ([None], (), ()))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ([None], (), ()),
+ )
f = Foo()
- f.bar = 'there'
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- (['there'], (), ()))
- f.bar = 'hi'
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'bar'), (['hi'], (), ()))
+ f.bar = "there"
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ (["there"], (), ()),
+ )
+ f.bar = "hi"
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ (["hi"], (), ()),
+ )
f = Foo()
- eq_(f.bar, 'hi')
+ eq_(f.bar, "hi")
del f.bar
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), (), ['hi']))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), (), ["hi"]),
+ )
assert f.bar is None
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), (), ['hi']))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), (), ["hi"]),
+ )
def test_scalar_via_lazyload_with_active(self):
# TODO: break into individual tests
@@ -2781,37 +3293,54 @@ class LazyloadHistoryTest(fixtures.TestBase):
return lazy_load
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'bar', uselist=False,
- callable_=lazyload, useobject=False,
- active_history=True)
- lazy_load = 'hi'
+ attributes.register_attribute(
+ Foo,
+ "bar",
+ uselist=False,
+ callable_=lazyload,
+ useobject=False,
+ active_history=True,
+ )
+ lazy_load = "hi"
# active_history=True means the lazy callable is executed on set
# as well as get, causing the old value to appear in the history
f = Foo()
- eq_(f.bar, 'hi')
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), ['hi'], ()))
+ eq_(f.bar, "hi")
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), ["hi"], ()),
+ )
f = Foo()
f.bar = None
- eq_(attributes.get_state_history(attributes.instance_state(f),
- 'bar'), ([None], (), ['hi']))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ([None], (), ["hi"]),
+ )
f = Foo()
- f.bar = 'there'
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- (['there'], (), ['hi']))
- f.bar = 'hi'
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), ['hi'], ()))
+ f.bar = "there"
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ (["there"], (), ["hi"]),
+ )
+ f.bar = "hi"
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), ["hi"], ()),
+ )
f = Foo()
- eq_(f.bar, 'hi')
+ eq_(f.bar, "hi")
del f.bar
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), (), ['hi']))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), (), ["hi"]),
+ )
assert f.bar is None
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), (), ['hi']))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), (), ["hi"]),
+ )
def test_scalar_object_via_lazyload(self):
# TODO: break into individual tests
@@ -2829,9 +3358,14 @@ class LazyloadHistoryTest(fixtures.TestBase):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'bar', uselist=False,
- callable_=lazyload, trackparent=True,
- useobject=True)
+ attributes.register_attribute(
+ Foo,
+ "bar",
+ uselist=False,
+ callable_=lazyload,
+ trackparent=True,
+ useobject=True,
+ )
bar1, bar2 = [Bar(id=1), Bar(id=2)]
lazy_load = bar1
@@ -2839,27 +3373,39 @@ class LazyloadHistoryTest(fixtures.TestBase):
# and history operations
f = Foo()
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), [bar1], ()))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), [bar1], ()),
+ )
f = Foo()
f.bar = None
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ([None], (), [bar1]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ([None], (), [bar1]),
+ )
f = Foo()
f.bar = bar2
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ([bar2], (), [bar1]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ([bar2], (), [bar1]),
+ )
f.bar = bar1
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), [bar1], ()))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), [bar1], ()),
+ )
f = Foo()
eq_(f.bar, bar1)
del f.bar
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), (), [bar1]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), (), [bar1]),
+ )
assert f.bar is None
- eq_(attributes.get_state_history(attributes.instance_state(f), 'bar'),
- ((), (), [bar1]))
+ eq_(
+ attributes.get_state_history(attributes.instance_state(f), "bar"),
+ ((), (), [bar1]),
+ )
class ListenerTest(fixtures.ORMTest):
@@ -2882,27 +3428,31 @@ class ListenerTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'data', uselist=False,
- useobject=False)
- attributes.register_attribute(Foo, 'barlist', uselist=True,
- useobject=True)
- attributes.register_attribute(Foo, 'barset', typecallable=set,
- uselist=True, useobject=True)
- attributes.register_attribute(Bar, 'data', uselist=False,
- useobject=False)
- event.listen(Foo.data, 'set', on_set, retval=True)
- event.listen(Foo.barlist, 'append', append, retval=True)
- event.listen(Foo.barset, 'append', append, retval=True)
+ attributes.register_attribute(
+ Foo, "data", uselist=False, useobject=False
+ )
+ attributes.register_attribute(
+ Foo, "barlist", uselist=True, useobject=True
+ )
+ attributes.register_attribute(
+ Foo, "barset", typecallable=set, uselist=True, useobject=True
+ )
+ attributes.register_attribute(
+ Bar, "data", uselist=False, useobject=False
+ )
+ event.listen(Foo.data, "set", on_set, retval=True)
+ event.listen(Foo.barlist, "append", append, retval=True)
+ event.listen(Foo.barset, "append", append, retval=True)
f1 = Foo()
- f1.data = 'some data'
- eq_(f1.data, 'some data modified')
+ f1.data = "some data"
+ eq_(f1.data, "some data modified")
b1 = Bar()
- b1.data = 'some bar'
+ b1.data = "some bar"
f1.barlist.append(b1)
- assert b1.data == 'some bar'
- assert f1.barlist[0].data == 'some bar appended'
+ assert b1.data == "some bar"
+ assert f1.barlist[0].data == "some bar appended"
f1.barset.add(b1)
- assert f1.barset.pop().data == 'some bar appended'
+ assert f1.barset.pop().data == "some bar appended"
def test_named(self):
canary = Mock()
@@ -2916,15 +3466,15 @@ class ListenerTest(fixtures.ORMTest):
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
attributes.register_attribute(
- Foo, 'data', uselist=False,
- useobject=False)
+ Foo, "data", uselist=False, useobject=False
+ )
attributes.register_attribute(
- Foo, 'barlist', uselist=True,
- useobject=True)
+ Foo, "barlist", uselist=True, useobject=True
+ )
- event.listen(Foo.data, 'set', canary.set, named=True)
- event.listen(Foo.barlist, 'append', canary.append, named=True)
- event.listen(Foo.barlist, 'remove', canary.remove, named=True)
+ event.listen(Foo.data, "set", canary.set, named=True)
+ event.listen(Foo.barlist, "append", canary.append, named=True)
+ event.listen(Foo.barlist, "remove", canary.remove, named=True)
f1 = Foo()
b1 = Bar()
@@ -2937,18 +3487,26 @@ class ListenerTest(fixtures.ORMTest):
call.set(
oldvalue=attributes.NO_VALUE,
initiator=attributes.Event(
- Foo.data.impl, attributes.OP_REPLACE),
- target=f1, value=5),
+ Foo.data.impl, attributes.OP_REPLACE
+ ),
+ target=f1,
+ value=5,
+ ),
call.append(
initiator=attributes.Event(
- Foo.barlist.impl, attributes.OP_APPEND),
+ Foo.barlist.impl, attributes.OP_APPEND
+ ),
target=f1,
- value=b1),
+ value=b1,
+ ),
call.remove(
initiator=attributes.Event(
- Foo.barlist.impl, attributes.OP_REMOVE),
+ Foo.barlist.impl, attributes.OP_REMOVE
+ ),
target=f1,
- value=b1)]
+ value=b1,
+ ),
+ ],
)
def test_collection_link_events(self):
@@ -2957,10 +3515,12 @@ class ListenerTest(fixtures.ORMTest):
class Bar(object):
pass
+
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'barlist', uselist=True,
- useobject=True)
+ attributes.register_attribute(
+ Foo, "barlist", uselist=True, useobject=True
+ )
canary = Mock()
event.listen(Foo.barlist, "init_collection", canary.init)
@@ -2977,18 +3537,16 @@ class ListenerTest(fixtures.ORMTest):
b2 = Bar()
f1.barlist = [b2]
adapter_two = f1.barlist._sa_adapter
- eq_(canary.init.mock_calls, [
- call(f1, [b1], adapter_one), # note the f1.barlist that
- # we saved earlier has been mutated
- # in place, new as of [ticket:3913]
- call(f1, [b2], adapter_two),
- ])
- eq_(
- canary.dispose.mock_calls,
+ eq_(
+ canary.init.mock_calls,
[
- call(f1, [b1], adapter_one)
- ]
+ call(f1, [b1], adapter_one), # note the f1.barlist that
+ # we saved earlier has been mutated
+ # in place, new as of [ticket:3913]
+ call(f1, [b2], adapter_two),
+ ],
)
+ eq_(canary.dispose.mock_calls, [call(f1, [b1], adapter_one)])
def test_none_on_collection_event(self):
"""test that append/remove of None in collections emits events.
@@ -2996,15 +3554,18 @@ class ListenerTest(fixtures.ORMTest):
This is new behavior as of 0.8.
"""
+
class Foo(object):
pass
class Bar(object):
pass
+
instrumentation.register_class(Foo)
instrumentation.register_class(Bar)
- attributes.register_attribute(Foo, 'barlist', uselist=True,
- useobject=True)
+ attributes.register_attribute(
+ Foo, "barlist", uselist=True, useobject=True
+ )
canary = []
def append(state, child, initiator):
@@ -3012,8 +3573,9 @@ class ListenerTest(fixtures.ORMTest):
def remove(state, child, initiator):
canary.append((state, child))
- event.listen(Foo.barlist, 'append', append)
- event.listen(Foo.barlist, 'remove', remove)
+
+ event.listen(Foo.barlist, "append", append)
+ event.listen(Foo.barlist, "remove", remove)
b1, b2 = Bar(), Bar()
f1 = Foo()
@@ -3038,16 +3600,17 @@ class ListenerTest(fixtures.ORMTest):
class Foo(object):
pass
+
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'bar')
+ attributes.register_attribute(Foo, "bar")
event.listen(Foo.bar, "modified", canary)
f1 = Foo()
- f1.bar = 'hi'
+ f1.bar = "hi"
attributes.flag_modified(f1, "bar")
eq_(
canary.mock_calls,
- [call(f1, attributes.Event(Foo.bar.impl, attributes.OP_MODIFIED))]
+ [call(f1, attributes.Event(Foo.bar.impl, attributes.OP_MODIFIED))],
)
def test_none_init_scalar(self):
@@ -3055,8 +3618,9 @@ class ListenerTest(fixtures.ORMTest):
class Foo(object):
pass
+
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'bar')
+ attributes.register_attribute(Foo, "bar")
event.listen(Foo.bar, "set", canary)
@@ -3070,8 +3634,9 @@ class ListenerTest(fixtures.ORMTest):
class Foo(object):
pass
+
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'bar', useobject=True)
+ attributes.register_attribute(Foo, "bar", useobject=True)
event.listen(Foo.bar, "set", canary)
@@ -3085,8 +3650,9 @@ class ListenerTest(fixtures.ORMTest):
class Foo(object):
pass
+
instrumentation.register_class(Foo)
- attributes.register_attribute(Foo, 'bar', useobject=True, uselist=True)
+ attributes.register_attribute(Foo, "bar", useobject=True, uselist=True)
event.listen(Foo.bar, "set", canary)
@@ -3102,16 +3668,19 @@ class ListenerTest(fixtures.ORMTest):
def make_a():
class A(object):
pass
+
classes[0] = A
def make_b():
class B(classes[0]):
pass
+
classes[1] = B
def make_c():
class C(classes[1]):
pass
+
classes[2] = C
def instrument_a():
@@ -3124,22 +3693,25 @@ class ListenerTest(fixtures.ORMTest):
instrumentation.register_class(classes[2])
def attr_a():
- attributes.register_attribute(classes[0], 'attrib',
- uselist=False, useobject=False)
+ attributes.register_attribute(
+ classes[0], "attrib", uselist=False, useobject=False
+ )
def attr_b():
- attributes.register_attribute(classes[1], 'attrib',
- uselist=False, useobject=False)
+ attributes.register_attribute(
+ classes[1], "attrib", uselist=False, useobject=False
+ )
def attr_c():
- attributes.register_attribute(classes[2], 'attrib',
- uselist=False, useobject=False)
+ attributes.register_attribute(
+ classes[2], "attrib", uselist=False, useobject=False
+ )
def set(state, value, oldvalue, initiator):
canary.append(value)
def events_a():
- event.listen(classes[0].attrib, 'set', set, propagate=True)
+ event.listen(classes[0].attrib, "set", set, propagate=True)
def teardown():
classes[:] = [None, None, None]
@@ -3158,11 +3730,20 @@ class ListenerTest(fixtures.ORMTest):
(make_c, instrument_c),
(instrument_c, attr_c),
(make_a, make_b),
- (make_b, make_c)
+ (make_b, make_c),
+ ]
+ elements = [
+ make_a,
+ make_b,
+ make_c,
+ instrument_a,
+ instrument_b,
+ instrument_c,
+ attr_a,
+ attr_b,
+ attr_c,
+ events_a,
]
- elements = [make_a, make_b, make_c,
- instrument_a, instrument_b, instrument_c,
- attr_a, attr_b, attr_c, events_a]
for i, series in enumerate(all_partial_orderings(ordering, elements)):
for fn in series:
@@ -3188,12 +3769,12 @@ class TestUnlink(fixtures.TestBase):
class B(object):
pass
+
self.A = A
self.B = B
instrumentation.register_class(A)
instrumentation.register_class(B)
- attributes.register_attribute(A, 'bs', uselist=True,
- useobject=True)
+ attributes.register_attribute(A, "bs", uselist=True, useobject=True)
def test_expired(self):
A, B = self.A, self.B
@@ -3202,10 +3783,7 @@ class TestUnlink(fixtures.TestBase):
a1.bs.append(B())
state = attributes.instance_state(a1)
state._expire(state.dict, set())
- assert_raises(
- Warning,
- coll.append, B()
- )
+ assert_raises(Warning, coll.append, B())
def test_replaced(self):
A, B = self.A, self.B
@@ -3226,10 +3804,7 @@ class TestUnlink(fixtures.TestBase):
a1.bs.append(B())
state = attributes.instance_state(a1)
state._reset(state.dict, "bs")
- assert_raises(
- Warning,
- coll.append, B()
- )
+ assert_raises(Warning, coll.append, B())
def test_ad_hoc_lazy(self):
A, B = self.A, self.B
@@ -3238,7 +3813,4 @@ class TestUnlink(fixtures.TestBase):
a1.bs.append(B())
state = attributes.instance_state(a1)
_set_callable(state, state.dict, "bs", lambda: B())
- assert_raises(
- Warning,
- coll.append, B()
- )
+ assert_raises(Warning, coll.append, B())