diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-07-26 19:11:33 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2013-07-26 19:11:33 -0400 |
commit | c903f071a82ce8784a4aa7f5e0d4264443e1944b (patch) | |
tree | 38fa94349896a54bce2ddcfa11b7bf4365381a17 | |
parent | 4505425a38b079a8e2a59fdbe31bc033de25e871 (diff) | |
download | sqlalchemy-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.rst | 1 | ||||
-rw-r--r-- | lib/sqlalchemy/event/__init__.py | 2 | ||||
-rw-r--r-- | lib/sqlalchemy/event/api.py | 34 | ||||
-rw-r--r-- | lib/sqlalchemy/event/registry.py | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/ext/mutable.py | 2 |
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() |