summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/event.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2012-10-12 17:21:08 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2012-10-12 17:21:08 -0400
commitc30e6d063e6dcec7d6f8ab28692049aaf387a5fa (patch)
tree865e54515ddcfea9a554d2c458379d85d9599138 /lib/sqlalchemy/event.py
parent40af03f8879412051518df8aadd8886c6c33aac0 (diff)
downloadsqlalchemy-c30e6d063e6dcec7d6f8ab28692049aaf387a5fa.tar.gz
- [feature] Improvements to event listening for
mapped classes allows that unmapped classes can be specified for instance- and mapper-events. The established events will be automatically set up on subclasses of that class when the propagate=True flag is passed, and the events will be set up for that class itself if and when it is ultimately mapped. [ticket:2585] - [bug] The instrumentation events class_instrument(), class_uninstrument(), and attribute_instrument() will now fire off only for descendant classes of the class assigned to listen(). Previously, an event listener would be assigned to listen for all classes in all cases regardless of the "target" argument passed. [ticket:2590]
Diffstat (limited to 'lib/sqlalchemy/event.py')
-rw-r--r--lib/sqlalchemy/event.py11
1 files changed, 7 insertions, 4 deletions
diff --git a/lib/sqlalchemy/event.py b/lib/sqlalchemy/event.py
index 633cb96f8..c702d9d34 100644
--- a/lib/sqlalchemy/event.py
+++ b/lib/sqlalchemy/event.py
@@ -148,6 +148,12 @@ class _Dispatch(object):
getattr(self, ls.name).\
for_modify(self)._update(ls, only_propagate=only_propagate)
+ @util.hybridmethod
+ def _clear(self):
+ for attr in dir(self):
+ if _is_event_name(attr):
+ getattr(self, attr).for_modify(self).clear()
+
def _event_descriptors(target):
return [getattr(target, k) for k in dir(target) if _is_event_name(k)]
@@ -170,7 +176,6 @@ def _create_dispatcher_class(cls, classname, bases, dict_):
cls.dispatch = dispatch_cls = type("%sDispatch" % classname,
(dispatch_base, ), {})
dispatch_cls._listen = cls._listen
- dispatch_cls._clear = cls._clear
for k in dict_:
if _is_event_name(k):
@@ -218,9 +223,7 @@ class Events(object):
@classmethod
def _clear(cls):
- for attr in dir(cls.dispatch):
- if _is_event_name(attr):
- getattr(cls.dispatch, attr).clear()
+ cls.dispatch._clear()
class _DispatchDescriptor(object):
"""Class-level attributes on :class:`._Dispatch` classes."""