summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/ext/instrumentation.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/ext/instrumentation.py')
-rw-r--r--lib/sqlalchemy/ext/instrumentation.py78
1 files changed, 47 insertions, 31 deletions
diff --git a/lib/sqlalchemy/ext/instrumentation.py b/lib/sqlalchemy/ext/instrumentation.py
index 30a0ab7d7..b2b8dd7c5 100644
--- a/lib/sqlalchemy/ext/instrumentation.py
+++ b/lib/sqlalchemy/ext/instrumentation.py
@@ -28,15 +28,18 @@ see the example :ref:`examples_instrumentation`.
"""
from ..orm import instrumentation as orm_instrumentation
from ..orm.instrumentation import (
- ClassManager, InstrumentationFactory, _default_state_getter,
- _default_dict_getter, _default_manager_getter
+ ClassManager,
+ InstrumentationFactory,
+ _default_state_getter,
+ _default_dict_getter,
+ _default_manager_getter,
)
from ..orm import attributes, collections, base as orm_base
from .. import util
from ..orm import exc as orm_exc
import weakref
-INSTRUMENTATION_MANAGER = '__sa_instrumentation_manager__'
+INSTRUMENTATION_MANAGER = "__sa_instrumentation_manager__"
"""Attribute, elects custom instrumentation when present on a mapped class.
Allows a class to specify a slightly or wildly different technique for
@@ -66,6 +69,7 @@ def find_native_user_instrumentation_hook(cls):
"""Find user-specified instrumentation management for a class."""
return getattr(cls, INSTRUMENTATION_MANAGER, None)
+
instrumentation_finders = [find_native_user_instrumentation_hook]
"""An extensible sequence of callables which return instrumentation
implementations
@@ -89,6 +93,7 @@ class ExtendedInstrumentationRegistry(InstrumentationFactory):
class managers.
"""
+
_manager_finders = weakref.WeakKeyDictionary()
_state_finders = weakref.WeakKeyDictionary()
_dict_finders = weakref.WeakKeyDictionary()
@@ -104,13 +109,15 @@ class ExtendedInstrumentationRegistry(InstrumentationFactory):
return None, None
def _check_conflicts(self, class_, factory):
- existing_factories = self._collect_management_factories_for(class_).\
- difference([factory])
+ existing_factories = self._collect_management_factories_for(
+ class_
+ ).difference([factory])
if existing_factories:
raise TypeError(
"multiple instrumentation implementations specified "
- "in %s inheritance hierarchy: %r" % (
- class_.__name__, list(existing_factories)))
+ "in %s inheritance hierarchy: %r"
+ % (class_.__name__, list(existing_factories))
+ )
def _extended_class_manager(self, class_, factory):
manager = factory(class_)
@@ -178,17 +185,20 @@ class ExtendedInstrumentationRegistry(InstrumentationFactory):
if instance is None:
raise AttributeError("None has no persistent state.")
return self._state_finders.get(
- instance.__class__, _default_state_getter)(instance)
+ instance.__class__, _default_state_getter
+ )(instance)
def dict_of(self, instance):
if instance is None:
raise AttributeError("None has no persistent state.")
return self._dict_finders.get(
- instance.__class__, _default_dict_getter)(instance)
+ instance.__class__, _default_dict_getter
+ )(instance)
-orm_instrumentation._instrumentation_factory = \
- _instrumentation_factory = ExtendedInstrumentationRegistry()
+orm_instrumentation._instrumentation_factory = (
+ _instrumentation_factory
+) = ExtendedInstrumentationRegistry()
orm_instrumentation.instrumentation_finders = instrumentation_finders
@@ -222,14 +232,15 @@ class InstrumentationManager(object):
pass
def manage(self, class_, manager):
- setattr(class_, '_default_class_manager', manager)
+ setattr(class_, "_default_class_manager", manager)
def dispose(self, class_, manager):
- delattr(class_, '_default_class_manager')
+ delattr(class_, "_default_class_manager")
def manager_getter(self, class_):
def get(cls):
return cls._default_class_manager
+
return get
def instrument_attribute(self, class_, key, inst):
@@ -260,13 +271,13 @@ class InstrumentationManager(object):
pass
def install_state(self, class_, instance, state):
- setattr(instance, '_default_state', state)
+ setattr(instance, "_default_state", state)
def remove_state(self, class_, instance):
- delattr(instance, '_default_state')
+ delattr(instance, "_default_state")
def state_getter(self, class_):
- return lambda instance: getattr(instance, '_default_state')
+ return lambda instance: getattr(instance, "_default_state")
def dict_getter(self, class_):
return lambda inst: self.get_instance_dict(class_, inst)
@@ -314,15 +325,17 @@ class _ClassInstrumentationAdapter(ClassManager):
def instrument_collection_class(self, key, collection_class):
return self._adapted.instrument_collection_class(
- self.class_, key, collection_class)
+ self.class_, key, collection_class
+ )
def initialize_collection(self, key, state, factory):
- delegate = getattr(self._adapted, 'initialize_collection', None)
+ delegate = getattr(self._adapted, "initialize_collection", None)
if delegate:
return delegate(key, state, factory)
else:
- return ClassManager.initialize_collection(self, key,
- state, factory)
+ return ClassManager.initialize_collection(
+ self, key, state, factory
+ )
def new_instance(self, state=None):
instance = self.class_.__new__(self.class_)
@@ -384,7 +397,7 @@ def _install_instrumented_lookups():
dict(
instance_state=_instrumentation_factory.state_of,
instance_dict=_instrumentation_factory.dict_of,
- manager_of_class=_instrumentation_factory.manager_of_class
+ manager_of_class=_instrumentation_factory.manager_of_class,
)
)
@@ -395,7 +408,7 @@ def _reinstall_default_lookups():
dict(
instance_state=_default_state_getter,
instance_dict=_default_dict_getter,
- manager_of_class=_default_manager_getter
+ manager_of_class=_default_manager_getter,
)
)
_instrumentation_factory._extended = False
@@ -403,12 +416,15 @@ def _reinstall_default_lookups():
def _install_lookups(lookups):
global instance_state, instance_dict, manager_of_class
- instance_state = lookups['instance_state']
- instance_dict = lookups['instance_dict']
- manager_of_class = lookups['manager_of_class']
- orm_base.instance_state = attributes.instance_state = \
- orm_instrumentation.instance_state = instance_state
- orm_base.instance_dict = attributes.instance_dict = \
- orm_instrumentation.instance_dict = instance_dict
- orm_base.manager_of_class = attributes.manager_of_class = \
- orm_instrumentation.manager_of_class = manager_of_class
+ instance_state = lookups["instance_state"]
+ instance_dict = lookups["instance_dict"]
+ manager_of_class = lookups["manager_of_class"]
+ orm_base.instance_state = (
+ attributes.instance_state
+ ) = orm_instrumentation.instance_state = instance_state
+ orm_base.instance_dict = (
+ attributes.instance_dict
+ ) = orm_instrumentation.instance_dict = instance_dict
+ orm_base.manager_of_class = (
+ attributes.manager_of_class
+ ) = orm_instrumentation.manager_of_class = manager_of_class