summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2016-04-10 14:56:01 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2016-04-18 12:55:48 -0400
commit243b222a232da0da0ac42386f3f38364750b1fcc (patch)
treeaf8870e5f7d8ba2b9eec6897e369b7febfd7e381 /lib
parent35e93db7ffb5806df22e997fde1f966fa8c453b0 (diff)
downloadsqlalchemy-243b222a232da0da0ac42386f3f38364750b1fcc.tar.gz
Honor hybrid property / method docstrings
The docstring specified on a hybrid property or method is now honored at the class level, allowing it to work with tools like Sphinx autodoc. The mechanics here necessarily involve some wrapping of expressions to occur for hybrid properties, which may cause them to appear differently using introspection. Fixes: #3653 Change-Id: I02549977fe8b2a051802eed7b00cc532fbc214e3 Pull-request: https://github.com/zzzeek/sqlalchemy/pull/239
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/ext/hybrid.py30
1 files changed, 25 insertions, 5 deletions
diff --git a/lib/sqlalchemy/ext/hybrid.py b/lib/sqlalchemy/ext/hybrid.py
index bbf386742..18516eae3 100644
--- a/lib/sqlalchemy/ext/hybrid.py
+++ b/lib/sqlalchemy/ext/hybrid.py
@@ -687,7 +687,7 @@ class hybrid_method(interfaces.InspectionAttrInfo):
"""
self.func = func
- self.expr = expr or func
+ self.expression(expr or func)
def __get__(self, instance, owner):
if instance is None:
@@ -700,6 +700,8 @@ class hybrid_method(interfaces.InspectionAttrInfo):
SQL-expression producing method."""
self.expr = expr
+ if not self.expr.__doc__:
+ self.expr.__doc__ = self.func.__doc__
return self
@@ -732,7 +734,7 @@ class hybrid_property(interfaces.InspectionAttrInfo):
self.fget = fget
self.fset = fset
self.fdel = fdel
- self.expr = expr or fget
+ self.expression(expr or fget)
util.update_wrapper(self, fget)
def __get__(self, instance, owner):
@@ -768,8 +770,12 @@ class hybrid_property(interfaces.InspectionAttrInfo):
"""Provide a modifying decorator that defines a SQL-expression
producing method."""
- self.expr = expr
- return self
+ def _expr(cls):
+ return ExprComparator(expr(cls))
+ util.update_wrapper(_expr, expr)
+
+ self.expr = _expr
+ return self.comparator(_expr)
def comparator(self, comparator):
"""Provide a modifying decorator that defines a custom
@@ -784,7 +790,9 @@ class hybrid_property(interfaces.InspectionAttrInfo):
create_proxied_attribute(self)
def expr(owner):
- return proxy_attr(owner, self.__name__, self, comparator(owner))
+ return proxy_attr(
+ owner, self.__name__, self, comparator(owner),
+ doc=comparator.__doc__ or self.__doc__)
self.expr = expr
return self
@@ -808,3 +816,15 @@ class Comparator(interfaces.PropComparator):
def adapt_to_entity(self, adapt_to_entity):
# interesting....
return self
+
+
+class ExprComparator(Comparator):
+
+ def __getattr__(self, key):
+ return getattr(self.expression, key)
+
+ def operate(self, op, *other, **kwargs):
+ return op(self.expression, *other, **kwargs)
+
+ def reverse_operate(self, op, other, **kwargs):
+ return op(other, self.expression, **kwargs)