diff options
Diffstat (limited to 'lib/sqlalchemy/event.py')
-rw-r--r-- | lib/sqlalchemy/event.py | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/lib/sqlalchemy/event.py b/lib/sqlalchemy/event.py index c702d9d34..bf996ae3c 100644 --- a/lib/sqlalchemy/event.py +++ b/lib/sqlalchemy/event.py @@ -12,6 +12,7 @@ from itertools import chain CANCEL = util.symbol('CANCEL') NO_RETVAL = util.symbol('NO_RETVAL') + def listen(target, identifier, fn, *args, **kw): """Register a listener function for the given target. @@ -40,6 +41,7 @@ def listen(target, identifier, fn, *args, **kw): raise exc.InvalidRequestError("No such event '%s' for target '%s'" % (identifier, target)) + def listens_for(target, identifier, *args, **kw): """Decorate a function as a listener for the given target + identifier. @@ -60,6 +62,7 @@ def listens_for(target, identifier, *args, **kw): return fn return decorate + def remove(target, identifier, fn): """Remove an event listener. @@ -75,12 +78,14 @@ def remove(target, identifier, fn): _registrars = util.defaultdict(list) + def _is_event_name(name): return not name.startswith('_') and name != 'dispatch' + class _UnpickleDispatch(object): - """Serializable callable that re-generates an instance of :class:`_Dispatch` - given a particular :class:`.Events` subclass. + """Serializable callable that re-generates an instance of + :class:`_Dispatch` given a particular :class:`.Events` subclass. """ def __call__(self, _parent_cls): @@ -90,6 +95,7 @@ class _UnpickleDispatch(object): else: raise AttributeError("No class with a 'dispatch' member present.") + class _Dispatch(object): """Mirror the event listening definitions of an Events class with listener collections. @@ -154,9 +160,11 @@ class _Dispatch(object): 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)] + class _EventMeta(type): """Intercept new Event subclasses and create associated _Dispatch classes.""" @@ -165,6 +173,7 @@ class _EventMeta(type): _create_dispatcher_class(cls, classname, bases, dict_) return type.__init__(cls, classname, bases, dict_) + def _create_dispatcher_class(cls, classname, bases, dict_): """Create a :class:`._Dispatch` class corresponding to an :class:`.Events` class.""" @@ -182,6 +191,7 @@ def _create_dispatcher_class(cls, classname, bases, dict_): setattr(dispatch_cls, k, _DispatchDescriptor(dict_[k])) _registrars[k].append(cls) + def _remove_dispatcher(cls): for k in dir(cls): if _is_event_name(k): @@ -189,10 +199,10 @@ def _remove_dispatcher(cls): if not _registrars[k]: del _registrars[k] + class Events(object): """Define event listening functions for a particular target type.""" - __metaclass__ = _EventMeta @classmethod @@ -225,6 +235,7 @@ class Events(object): def _clear(cls): cls.dispatch._clear() + class _DispatchDescriptor(object): """Class-level attributes on :class:`._Dispatch` classes.""" @@ -357,6 +368,7 @@ class _EmptyListener(object): def __nonzero__(self): return bool(self.parent_listeners) + class _CompoundListener(object): _exec_once = False @@ -479,8 +491,10 @@ class _JoinedDispatchDescriptor(object): ) return ret + class _JoinedListener(_CompoundListener): _exec_once = False + def __init__(self, parent, name, local): self.parent = parent self.name = name @@ -527,4 +541,3 @@ class dispatcher(object): return self.dispatch_cls obj.__dict__['dispatch'] = disp = self.dispatch_cls(cls) return disp - |