"""
from sqlalchemy import util
+from sqlalchemy.orm import attributes, interfaces
class method(object):
def __init__(self, func, expr=None):
self.expr = expr
return self
+ def compare_with(self, comparator):
+ proxy_attr = attributes.\
+ create_proxied_attribute(self)
+ def expr(owner):
+ return proxy_attr(self.__name__, self, comparator(owner))
+ self.expr = expr
+ return self
+
+
+class Comparator(interfaces.PropComparator):
+ def __init__(self, expression, adapter=None):
+ self._expression = expression
+ self.adapter = adapter
+
+ @property
+ def expression(self):
+ return self.__clause_element__()
+
+ def __clause_element__(self):
+ if self.adapter:
+ return self.adapter(self._expression)
+ else:
+ return self._expression
+
+ def adapted(self, adapter):
+ return self.__class__(self._expression, adapter)
+
+
+
+
\ No newline at end of file
return self.impl.get(instance_state(instance),
instance_dict(instance))
-class _ProxyImpl(object):
- accepts_scalar_loader = False
- expire_missing = True
-
- def __init__(self, key):
- self.key = key
-
-def proxied_attribute_factory(descriptor):
- """Create an InstrumentedAttribute / user descriptor hybrid.
+def create_proxied_attribute(descriptor):
+ """Create an QueryableAttribute / user descriptor hybrid.
- Returns a new InstrumentedAttribute type that delegates descriptor
+ Returns a new QueryableAttribute type that delegates descriptor
behavior and getattr() to the given descriptor.
"""
def __init__(self, key, descriptor, comparator, adapter=None):
self.key = key
- # maintain ProxiedAttribute.user_prop compatability.
- self.descriptor = self.user_prop = descriptor
+ self.descriptor = descriptor
self._comparator = comparator
- self.impl = _ProxyImpl(key)
self.adapter = adapter
@util.memoized_property
return self.__class__(self.key, self.descriptor,
self._comparator,
adapter)
-
- def __get__(self, instance, owner):
- """Delegate __get__ to the original descriptor."""
- if instance is None:
- descriptor.__get__(instance, owner)
- return self
- return descriptor.__get__(instance, owner)
-
- def __set__(self, instance, value):
- """Delegate __set__ to the original descriptor."""
- return descriptor.__set__(instance, value)
-
- def __delete__(self, instance):
- """Delegate __delete__ to the original descriptor."""
- return descriptor.__delete__(instance)
+ def __str__(self):
+ return self.key
+
def __getattr__(self, attribute):
"""Delegate __getattr__ to the original descriptor and/or
comparator."""
return getattr(descriptor, attribute)
except AttributeError:
try:
- return getattr(self.comparator, attribute)
+ return getattr(self._comparator, attribute)
except AttributeError:
raise AttributeError(
'Neither %r object nor %r object has an attribute %r' % (
instrumentation_registry.unregister(class_)
def register_attribute(class_, key, **kw):
- proxy_property = kw.pop('proxy_property', None)
-
comparator = kw.pop('comparator', None)
parententity = kw.pop('parententity', None)
doc = kw.pop('doc', None)
- register_descriptor(class_, key, proxy_property,
+ register_descriptor(class_, key,
comparator, parententity, doc=doc)
- if not proxy_property:
- register_attribute_impl(class_, key, **kw)
+ register_attribute_impl(class_, key, **kw)
def register_attribute_impl(class_, key,
uselist=False, callable_=None,
manager.post_configure_attribute(key)
-def register_descriptor(class_, key, proxy_property=None, comparator=None,
+def register_descriptor(class_, key, comparator=None,
parententity=None, property_=None, doc=None):
manager = manager_of_class(class_)
- if proxy_property:
- raise NotImplementedError()
- proxy_type = proxied_attribute_factory(proxy_property)
- descriptor = proxy_type(key, proxy_property, comparator, parententity)
- else:
- descriptor = InstrumentedAttribute(key, comparator=comparator,
+ descriptor = InstrumentedAttribute(key, comparator=comparator,
parententity=parententity)
descriptor.__doc__ = doc
)
proxy_attr = attributes.\
- proxied_attribute_factory(self.descriptor
- or descriptor)\
- (self.key, self.descriptor or descriptor,
- lambda: self._comparator_factory(mapper))
+ create_proxied_attribute(self.descriptor or descriptor)\
+ (
+ self.key,
+ self.descriptor or descriptor,
+ lambda: self._comparator_factory(mapper)
+ )
def get_comparator(owner):
return proxy_attr
descriptor.expr = get_comparator
-
descriptor.impl = _ProxyImpl(self.key)
mapper.class_manager.instrument_attribute(self.key, descriptor)
"""
- extension = None
-
def _comparator_factory(self, mapper):
comparator_callable = None
class SynonymProperty(DescriptorProperty):
- extension = None
-
def __init__(self, name, map_column=None,
descriptor=None, comparator_factory=None,
doc=None):
return self.comparator_factory(self, mapper)
-
-
class RelationshipProperty(StrategizedProperty):
"""Describes an object property that holds a single item or list
of items that correspond to a related database table.