diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-04-10 14:56:01 -0400 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2016-04-18 12:55:48 -0400 |
| commit | 243b222a232da0da0ac42386f3f38364750b1fcc (patch) | |
| tree | af8870e5f7d8ba2b9eec6897e369b7febfd7e381 /lib | |
| parent | 35e93db7ffb5806df22e997fde1f966fa8c453b0 (diff) | |
| download | sqlalchemy-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.py | 30 |
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) |
