summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/events.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/orm/events.py')
-rw-r--r--lib/sqlalchemy/orm/events.py175
1 files changed, 109 insertions, 66 deletions
diff --git a/lib/sqlalchemy/orm/events.py b/lib/sqlalchemy/orm/events.py
index c414f548e..c2a2d15ee 100644
--- a/lib/sqlalchemy/orm/events.py
+++ b/lib/sqlalchemy/orm/events.py
@@ -20,6 +20,7 @@ from .attributes import QueryableAttribute
from .query import Query
from sqlalchemy.util.compat import inspect_getargspec
+
class InstrumentationEvents(event.Events):
"""Events related to class instrumentation events.
@@ -61,9 +62,11 @@ class InstrumentationEvents(event.Events):
@classmethod
def _listen(cls, event_key, propagate=True, **kw):
- target, identifier, fn = \
- event_key.dispatch_target, event_key.identifier, \
- event_key._listen_fn
+ target, identifier, fn = (
+ event_key.dispatch_target,
+ event_key.identifier,
+ event_key._listen_fn,
+ )
def listen(target_cls, *arg):
listen_cls = target()
@@ -74,16 +77,20 @@ class InstrumentationEvents(event.Events):
def remove(ref):
key = event.registry._EventKey(
- None, identifier, listen,
- instrumentation._instrumentation_factory)
- getattr(instrumentation._instrumentation_factory.dispatch,
- identifier).remove(key)
+ None,
+ identifier,
+ listen,
+ instrumentation._instrumentation_factory,
+ )
+ getattr(
+ instrumentation._instrumentation_factory.dispatch, identifier
+ ).remove(key)
target = weakref.ref(target.class_, remove)
- event_key.\
- with_dispatch_target(instrumentation._instrumentation_factory).\
- with_wrapper(listen).base_listen(**kw)
+ event_key.with_dispatch_target(
+ instrumentation._instrumentation_factory
+ ).with_wrapper(listen).base_listen(**kw)
@classmethod
def _clear(cls):
@@ -193,21 +200,24 @@ class InstanceEvents(event.Events):
@classmethod
def _listen(cls, event_key, raw=False, propagate=False, **kw):
- target, identifier, fn = \
- event_key.dispatch_target, event_key.identifier, \
- event_key._listen_fn
+ target, identifier, fn = (
+ event_key.dispatch_target,
+ event_key.identifier,
+ event_key._listen_fn,
+ )
if not raw:
+
def wrap(state, *arg, **kw):
return fn(state.obj(), *arg, **kw)
+
event_key = event_key.with_wrapper(wrap)
event_key.base_listen(propagate=propagate, **kw)
if propagate:
for mgr in target.subclass_managers(True):
- event_key.with_dispatch_target(mgr).base_listen(
- propagate=True)
+ event_key.with_dispatch_target(mgr).base_listen(propagate=True)
@classmethod
def _clear(cls):
@@ -438,10 +448,13 @@ class _EventsHold(event.RefCollection):
@classmethod
def _listen(
- cls, event_key, raw=False, propagate=False,
- retval=False, **kw):
- target, identifier, fn = \
- event_key.dispatch_target, event_key.identifier, event_key.fn
+ cls, event_key, raw=False, propagate=False, retval=False, **kw
+ ):
+ target, identifier, fn = (
+ event_key.dispatch_target,
+ event_key.identifier,
+ event_key.fn,
+ )
if target.class_ in target.all_holds:
collection = target.all_holds[target.class_]
@@ -460,12 +473,16 @@ class _EventsHold(event.RefCollection):
if subject is not None:
# we are already going through __subclasses__()
# so leave generic propagate flag False
- event_key.with_dispatch_target(subject).\
- listen(raw=raw, propagate=False, retval=retval, **kw)
+ event_key.with_dispatch_target(subject).listen(
+ raw=raw, propagate=False, retval=retval, **kw
+ )
def remove(self, event_key):
- target, identifier, fn = \
- event_key.dispatch_target, event_key.identifier, event_key.fn
+ target, identifier, fn = (
+ event_key.dispatch_target,
+ event_key.identifier,
+ event_key.fn,
+ )
if isinstance(target, _EventsHold):
collection = target.all_holds[target.class_]
@@ -483,8 +500,9 @@ class _EventsHold(event.RefCollection):
# populate(), we rely upon _EventsHold for all event
# assignment, instead of using the generic propagate
# flag.
- event_key.with_dispatch_target(subject).\
- listen(raw=raw, propagate=False, retval=retval)
+ event_key.with_dispatch_target(subject).listen(
+ raw=raw, propagate=False, retval=retval
+ )
class _InstanceEventsHold(_EventsHold):
@@ -594,24 +612,31 @@ class MapperEvents(event.Events):
@classmethod
def _listen(
- cls, event_key, raw=False, retval=False, propagate=False, **kw):
- target, identifier, fn = \
- event_key.dispatch_target, event_key.identifier, \
- event_key._listen_fn
-
- if identifier in ("before_configured", "after_configured") and \
- target is not mapperlib.Mapper:
+ cls, event_key, raw=False, retval=False, propagate=False, **kw
+ ):
+ target, identifier, fn = (
+ event_key.dispatch_target,
+ event_key.identifier,
+ event_key._listen_fn,
+ )
+
+ if (
+ identifier in ("before_configured", "after_configured")
+ and target is not mapperlib.Mapper
+ ):
util.warn(
"'before_configured' and 'after_configured' ORM events "
"only invoke with the mapper() function or Mapper class "
- "as the target.")
+ "as the target."
+ )
if not raw or not retval:
if not raw:
meth = getattr(cls, identifier)
try:
- target_index = \
- inspect_getargspec(meth)[0].index('target') - 1
+ target_index = (
+ inspect_getargspec(meth)[0].index("target") - 1
+ )
except ValueError:
target_index = None
@@ -624,12 +649,14 @@ class MapperEvents(event.Events):
return interfaces.EXT_CONTINUE
else:
return fn(*arg, **kw)
+
event_key = event_key.with_wrapper(wrap)
if propagate:
for mapper in target.self_and_descendants:
event_key.with_dispatch_target(mapper).base_listen(
- propagate=True, **kw)
+ propagate=True, **kw
+ )
else:
event_key.base_listen(**kw)
@@ -1219,15 +1246,14 @@ class SessionEvents(event.Events):
if isinstance(target, scoped_session):
target = target.session_factory
- if not isinstance(target, sessionmaker) and \
- (
- not isinstance(target, type) or
- not issubclass(target, Session)
+ if not isinstance(target, sessionmaker) and (
+ not isinstance(target, type) or not issubclass(target, Session)
):
raise exc.ArgumentError(
"Session event listen on a scoped_session "
"requires that its creation callable "
- "is associated with the Session class.")
+ "is associated with the Session class."
+ )
if isinstance(target, sessionmaker):
return target.class_
@@ -1561,13 +1587,16 @@ class SessionEvents(event.Events):
"""
- @event._legacy_signature("0.9",
- ["session", "query", "query_context", "result"],
- lambda update_context: (
- update_context.session,
- update_context.query,
- update_context.context,
- update_context.result))
+ @event._legacy_signature(
+ "0.9",
+ ["session", "query", "query_context", "result"],
+ lambda update_context: (
+ update_context.session,
+ update_context.query,
+ update_context.context,
+ update_context.result,
+ ),
+ )
def after_bulk_update(self, update_context):
"""Execute after a bulk update operation to the session.
@@ -1587,13 +1616,16 @@ class SessionEvents(event.Events):
"""
- @event._legacy_signature("0.9",
- ["session", "query", "query_context", "result"],
- lambda delete_context: (
- delete_context.session,
- delete_context.query,
- delete_context.context,
- delete_context.result))
+ @event._legacy_signature(
+ "0.9",
+ ["session", "query", "query_context", "result"],
+ lambda delete_context: (
+ delete_context.session,
+ delete_context.query,
+ delete_context.context,
+ delete_context.result,
+ ),
+ )
def after_bulk_delete(self, delete_context):
"""Execute after a bulk delete operation to the session.
@@ -1927,18 +1959,26 @@ class AttributeEvents(event.Events):
return target
@classmethod
- def _listen(cls, event_key, active_history=False,
- raw=False, retval=False,
- propagate=False):
-
- target, identifier, fn = \
- event_key.dispatch_target, event_key.identifier, \
- event_key._listen_fn
+ def _listen(
+ cls,
+ event_key,
+ active_history=False,
+ raw=False,
+ retval=False,
+ propagate=False,
+ ):
+
+ target, identifier, fn = (
+ event_key.dispatch_target,
+ event_key.identifier,
+ event_key._listen_fn,
+ )
if active_history:
target.dispatch._active_history = True
if not raw or not retval:
+
def wrap(target, *arg):
if not raw:
target = target.obj()
@@ -1951,6 +1991,7 @@ class AttributeEvents(event.Events):
return value
else:
return fn(target, *arg)
+
event_key = event_key.with_wrapper(wrap)
event_key.base_listen(propagate=propagate)
@@ -1959,8 +2000,9 @@ class AttributeEvents(event.Events):
manager = instrumentation.manager_of_class(target.class_)
for mgr in manager.subclass_managers(True):
- event_key.with_dispatch_target(
- mgr[target.key]).base_listen(propagate=True)
+ event_key.with_dispatch_target(mgr[target.key]).base_listen(
+ propagate=True
+ )
def append(self, target, value, initiator):
"""Receive a collection append event.
@@ -2315,11 +2357,11 @@ class QueryEvents(event.Events):
"""
@classmethod
- def _listen(
- cls, event_key, retval=False, **kw):
+ def _listen(cls, event_key, retval=False, **kw):
fn = event_key._listen_fn
if not retval:
+
def wrap(*arg, **kw):
if not retval:
query = arg[0]
@@ -2327,6 +2369,7 @@ class QueryEvents(event.Events):
return query
else:
return fn(*arg, **kw)
+
event_key = event_key.with_wrapper(wrap)
event_key.base_listen(**kw)