]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- add event.contains() function to the event package, returns True
authorMike Bayer <mike_mp@zzzcomputing.com>
Fri, 26 Jul 2013 23:11:33 +0000 (19:11 -0400)
committerMike Bayer <mike_mp@zzzcomputing.com>
Fri, 26 Jul 2013 23:11:33 +0000 (19:11 -0400)
if the given target/event/fn is set up to listen.
- repair mutable package which is doing some conditional event listening

doc/build/core/event.rst
lib/sqlalchemy/event/__init__.py
lib/sqlalchemy/event/api.py
lib/sqlalchemy/event/registry.py
lib/sqlalchemy/ext/mutable.py

index 848cc15cb133ad40c882f3c7452528b4d5ab522c..d5111b0c0cdad2230f2dd89c6af7326b8b537e60 100644 (file)
@@ -161,3 +161,4 @@ API Reference
 
 .. autofunction:: sqlalchemy.event.remove
 
+.. autofunction:: sqlalchemy.event.contains
index 787da423103a848160b137605f23c63a84886735..b996d0bbef73571ca0c2949a9cc3154304ad5336 100644 (file)
@@ -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
index 3a6c46e6af76291ba47410820262352efec06924..33a6b817f433b77e548196d26de23d210c0c820a 100644 (file)
@@ -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()
index 42daef52580e710c08e6da19b2ed2162f839baa2..af07493f4ab6a5ff89312303680c005cd73b2557 100644 (file)
@@ -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):
index d3133b1f53df59fd86b5b3e4e6859ccf73b2b5e0..5458de38149a5bbfb0ce4d1e8586f87d0dd78e0e 100644 (file)
@@ -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()