diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-11-20 11:39:44 -0500 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-11-20 11:39:44 -0500 |
commit | d505ea71aed44ecae718052131dc0a2fb2c9dd99 (patch) | |
tree | 8ecf16d2aa1c23bf7721403d6ff13d0ee5b1da48 /lib/sqlalchemy/orm/util.py | |
parent | 4af7bc6cfc8790bf6ef267c059a47952de7c64fa (diff) | |
parent | 61c76f92df7c0b5b1ce0178148bab71bc4a64ec7 (diff) | |
download | sqlalchemy-d505ea71aed44ecae718052131dc0a2fb2c9dd99.tar.gz |
- merge events branch, [ticket:1902]
Diffstat (limited to 'lib/sqlalchemy/orm/util.py')
-rw-r--r-- | lib/sqlalchemy/orm/util.py | 74 |
1 files changed, 1 insertions, 73 deletions
diff --git a/lib/sqlalchemy/orm/util.py b/lib/sqlalchemy/orm/util.py index db28089ef..9447eed30 100644 --- a/lib/sqlalchemy/orm/util.py +++ b/lib/sqlalchemy/orm/util.py @@ -185,78 +185,6 @@ def identity_key(*args, **kwargs): mapper = object_mapper(instance) return mapper.identity_key_from_instance(instance) -class ExtensionCarrier(dict): - """Fronts an ordered collection of MapperExtension objects. - - Bundles multiple MapperExtensions into a unified callable unit, - encapsulating ordering, looping and EXT_CONTINUE logic. The - ExtensionCarrier implements the MapperExtension interface, e.g.:: - - carrier.after_insert(...args...) - - The dictionary interface provides containment for implemented - method names mapped to a callable which executes that method - for participating extensions. - - """ - - interface = set(method for method in dir(MapperExtension) - if not method.startswith('_')) - - def __init__(self, extensions=None): - self._extensions = [] - for ext in extensions or (): - self.append(ext) - - def copy(self): - return ExtensionCarrier(self._extensions) - - def push(self, extension): - """Insert a MapperExtension at the beginning of the collection.""" - self._register(extension) - self._extensions.insert(0, extension) - - def append(self, extension): - """Append a MapperExtension at the end of the collection.""" - self._register(extension) - self._extensions.append(extension) - - def __iter__(self): - """Iterate over MapperExtensions in the collection.""" - return iter(self._extensions) - - def _register(self, extension): - """Register callable fronts for overridden interface methods.""" - - for method in self.interface.difference(self): - impl = getattr(extension, method, None) - if impl and impl is not getattr(MapperExtension, method): - self[method] = self._create_do(method) - - def _create_do(self, method): - """Return a closure that loops over impls of the named method.""" - - def _do(*args, **kwargs): - for ext in self._extensions: - ret = getattr(ext, method)(*args, **kwargs) - if ret is not EXT_CONTINUE: - return ret - else: - return EXT_CONTINUE - _do.__name__ = method - return _do - - @staticmethod - def _pass(*args, **kwargs): - return EXT_CONTINUE - - def __getattr__(self, key): - """Delegate MapperExtension methods to bundled fronts.""" - - if key not in self.interface: - raise AttributeError(key) - return self.get(key, self._pass) - class ORMAdapter(sql_util.ColumnAdapter): """Extends ColumnAdapter to accept ORM entities. @@ -341,7 +269,7 @@ class AliasedClass(object): existing = getattr(self.__target, prop.key) comparator = existing.comparator.adapted(self.__adapt_element) - queryattr = attributes.QueryableAttribute(prop.key, + queryattr = attributes.QueryableAttribute(self, prop.key, impl=existing.impl, parententity=self, comparator=comparator) setattr(self, prop.key, queryattr) return queryattr |