summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2013-07-26 19:11:33 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2013-07-26 19:11:33 -0400
commitc903f071a82ce8784a4aa7f5e0d4264443e1944b (patch)
tree38fa94349896a54bce2ddcfa11b7bf4365381a17
parent4505425a38b079a8e2a59fdbe31bc033de25e871 (diff)
downloadsqlalchemy-c903f071a82ce8784a4aa7f5e0d4264443e1944b.tar.gz
- add event.contains() function to the event package, returns True
if the given target/event/fn is set up to listen. - repair mutable package which is doing some conditional event listening
-rw-r--r--doc/build/core/event.rst1
-rw-r--r--lib/sqlalchemy/event/__init__.py2
-rw-r--r--lib/sqlalchemy/event/api.py34
-rw-r--r--lib/sqlalchemy/event/registry.py4
-rw-r--r--lib/sqlalchemy/ext/mutable.py2
5 files changed, 25 insertions, 18 deletions
diff --git a/doc/build/core/event.rst b/doc/build/core/event.rst
index 848cc15cb..d5111b0c0 100644
--- a/doc/build/core/event.rst
+++ b/doc/build/core/event.rst
@@ -161,3 +161,4 @@ API Reference
.. autofunction:: sqlalchemy.event.remove
+.. autofunction:: sqlalchemy.event.contains
diff --git a/lib/sqlalchemy/event/__init__.py b/lib/sqlalchemy/event/__init__.py
index 787da4231..b996d0bbe 100644
--- a/lib/sqlalchemy/event/__init__.py
+++ b/lib/sqlalchemy/event/__init__.py
@@ -4,7 +4,7 @@
# This module is part of SQLAlchemy and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
-from .api import CANCEL, NO_RETVAL, listen, listens_for, remove
+from .api import CANCEL, NO_RETVAL, listen, listens_for, remove, contains
from .base import Events
from .attr import dispatcher, RefCollection
from .legacy import _legacy_signature
diff --git a/lib/sqlalchemy/event/api.py b/lib/sqlalchemy/event/api.py
index 3a6c46e6a..33a6b817f 100644
--- a/lib/sqlalchemy/event/api.py
+++ b/lib/sqlalchemy/event/api.py
@@ -11,6 +11,15 @@ CANCEL = util.symbol('CANCEL')
NO_RETVAL = util.symbol('NO_RETVAL')
+def _event_key(target, identifier, fn):
+ for evt_cls in _registrars[identifier]:
+ tgt = evt_cls._accept_with(target)
+ if tgt is not None:
+ return _EventKey(target, identifier, fn, tgt)
+ else:
+ raise exc.InvalidRequestError("No such event '%s' for target '%s'" %
+ (identifier, target))
+
def listen(target, identifier, fn, *args, **kw):
"""Register a listener function for the given target.
@@ -31,14 +40,7 @@ def listen(target, identifier, fn, *args, **kw):
"""
- for evt_cls in _registrars[identifier]:
- tgt = evt_cls._accept_with(target)
- if tgt is not None:
- _EventKey(target, identifier, fn, tgt).listen(*args, **kw)
- break
- else:
- raise exc.InvalidRequestError("No such event '%s' for target '%s'" %
- (identifier, target))
+ _event_key(target, identifier, fn).listen(*args, **kw)
def listens_for(target, identifier, *args, **kw):
@@ -87,13 +89,13 @@ def remove(target, identifier, fn):
.. versionadded:: 0.9.0
"""
- for evt_cls in _registrars[identifier]:
- tgt = evt_cls._accept_with(target)
- if tgt is not None:
- _EventKey(target, identifier, fn, tgt).remove()
- break
- else:
- raise exc.InvalidRequestError("No such event '%s' for target '%s'" %
- (identifier, target))
+ _event_key(target, identifier, fn).remove()
+
+def contains(target, identifier, fn):
+ """Return True if the given target/ident/fn is set up to listen.
+ .. versionadded:: 0.9.0
+
+ """
+ return _event_key(target, identifier, fn).contains()
diff --git a/lib/sqlalchemy/event/registry.py b/lib/sqlalchemy/event/registry.py
index 42daef525..af07493f4 100644
--- a/lib/sqlalchemy/event/registry.py
+++ b/lib/sqlalchemy/event/registry.py
@@ -181,6 +181,10 @@ class _EventKey(object):
if collection is not None and listener_fn is not None:
collection.remove(self.with_wrapper(listener_fn))
+ def contains(self):
+ """Return True if this event key is registered to listen.
+ """
+ return self._key in _key_to_collection
def base_listen(self, propagate=False, insert=False,
named=False):
diff --git a/lib/sqlalchemy/ext/mutable.py b/lib/sqlalchemy/ext/mutable.py
index d3133b1f5..5458de381 100644
--- a/lib/sqlalchemy/ext/mutable.py
+++ b/lib/sqlalchemy/ext/mutable.py
@@ -595,7 +595,7 @@ def _setup_composite_listener():
issubclass(prop.composite_class, MutableComposite)):
prop.composite_class._listen_on_attribute(
getattr(class_, prop.key), False, class_)
- if not Mapper.dispatch.mapper_configured._contains(Mapper, _listen_for_type):
+ if not event.contains(Mapper, "mapper_configured", _listen_for_type):
event.listen(Mapper, 'mapper_configured', _listen_for_type)
_setup_composite_listener()