summaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-06-20 18:55:13 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2012-06-20 18:55:13 -0400
commit40098941007ff3aa1593e834915c4042c1668dc2 (patch)
treed40068f9a997720d96a2c517717e0267953c75e6 /test/base
parente15fc03a16a322298e27c416dce3f3fe869bdf1a (diff)
downloadsqlalchemy-40098941007ff3aa1593e834915c4042c1668dc2.tar.gz
- [feature] Dramatic improvement in memory
usage of the event system; instance-level collections are no longer created for a particular type of event until instance-level listeners are established for that event. [ticket:2516] Also in 0.7.9.
Diffstat (limited to 'test/base')
-rw-r--r--test/base/test_events.py79
1 files changed, 50 insertions, 29 deletions
diff --git a/test/base/test_events.py b/test/base/test_events.py
index 3ec0f9953..61a4b9c71 100644
--- a/test/base/test_events.py
+++ b/test/base/test_events.py
@@ -1,6 +1,7 @@
"""Test event registration and listening."""
-from test.lib.testing import eq_, assert_raises
+from test.lib.testing import eq_, assert_raises, assert_raises_message, \
+ is_, is_not_
from sqlalchemy import event, exc, util
from test.lib import fixtures
@@ -117,7 +118,55 @@ class TestEvents(fixtures.TestBase):
[listen_two]
)
+ def test_no_instance_level_collections(self):
+ @event.listens_for(self.Target, "event_one")
+ def listen_one(x, y):
+ pass
+ t1 = self.Target()
+ t2 = self.Target()
+ t1.dispatch.event_one(5, 6)
+ t2.dispatch.event_one(5, 6)
+ is_(
+ t1.dispatch.__dict__['event_one'],
+ self.Target.dispatch.event_one.\
+ _empty_listeners[self.Target]
+ )
+
+ @event.listens_for(t1, "event_one")
+ def listen_two(x, y):
+ pass
+ is_not_(
+ t1.dispatch.__dict__['event_one'],
+ self.Target.dispatch.event_one.\
+ _empty_listeners[self.Target]
+ )
+ is_(
+ t2.dispatch.__dict__['event_one'],
+ self.Target.dispatch.event_one.\
+ _empty_listeners[self.Target]
+ )
+
+ def test_immutable_methods(self):
+ t1 = self.Target()
+ for meth in [
+ t1.dispatch.event_one.exec_once,
+ t1.dispatch.event_one.insert,
+ t1.dispatch.event_one.append,
+ t1.dispatch.event_one.remove,
+ t1.dispatch.event_one.clear,
+ ]:
+ assert_raises_message(
+ NotImplementedError,
+ r"need to call for_modify\(\)",
+ meth
+ )
+
class TestClsLevelListen(fixtures.TestBase):
+
+
+ def tearDown(self):
+ event._remove_dispatcher(self.TargetOne.__dict__['dispatch'].events)
+
def setUp(self):
class TargetEventsOne(event.Events):
def event_one(self, x, y):
@@ -193,34 +242,6 @@ class TestClsLevelListen(fixtures.TestBase):
assert handler2 not in s2.dispatch.event_one
-class TestClsLevelListen(fixtures.TestBase):
- def setUp(self):
- class TargetEventsOne(event.Events):
- def event_one(self, x, y):
- pass
- class TargetOne(object):
- dispatch = event.dispatcher(TargetEventsOne)
- self.TargetOne = TargetOne
-
- def tearDown(self):
- event._remove_dispatcher(self.TargetOne.__dict__['dispatch'].events)
-
- def test_lis_subcalss_lis(self):
- @event.listens_for(self.TargetOne, "event_one")
- def handler1(x, y):
- print 'handler1'
-
- class SubTarget(self.TargetOne):
- pass
-
- @event.listens_for(self.TargetOne, "event_one")
- def handler2(x, y):
- pass
-
- eq_(
- len(SubTarget().dispatch.event_one),
- 2
- )
class TestAcceptTargets(fixtures.TestBase):
"""Test default target acceptance."""