John Vandenberg has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/175419

Change subject: Set __signature__ in decorators
......................................................................

Set __signature__ in decorators

PEP 362 introduces __signature__ for functions as a way to alter
function arguments in a decorator in a way that can be reliably
inspected.  It is implemented in Python 3.4, and back ports are
available.

Sphinx 1.3 on Python 3.4 uses the inspect module to automatically
describe function arguments, allowing documentation to be accurate
even in the presence of decorators.

deprecated_args updates the signature to include the deprecated
arguments, either providing a note in the default value, or
a default of NotImplemented if there is no substitute argument.

Change-Id: I2aeef8c8f31cdb01f18e199834b2f1a8ef8b043c
---
M pywikibot/site.py
M pywikibot/tools.py
2 files changed, 24 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.wikimedia.org:29418/pywikibot/core 
refs/changes/19/175419/1

diff --git a/pywikibot/site.py b/pywikibot/site.py
index 1e6e614..2a55df6 100644
--- a/pywikibot/site.py
+++ b/pywikibot/site.py
@@ -30,7 +30,7 @@
 from pywikibot.tools import (
     itergroup, deprecated, deprecate_arg, UnicodeMixin, ComparableMixin,
     redirect_func, add_decorated_full_name, deprecated_args,
-    SelfCallDict, SelfCallString,
+    SelfCallDict, SelfCallString, signature,
 )
 from pywikibot.tools import MediaWikiVersion as LV
 from pywikibot.throttle import Throttle
@@ -973,6 +973,7 @@
         if not hasattr(fn, '__full_name__'):
             add_decorated_full_name(fn)
         callee.__full_name__ = fn.__full_name__
+        callee.__signature__ = signature(fn)
         return callee
 
     return decorator
@@ -1001,6 +1002,7 @@
         callee.__name__ = fn.__name__
         callee.__doc__ = fn.__doc__
         callee.__module__ = fn.__module__
+        callee.__signature__ = signature(fn)
         if not hasattr(fn, '__full_name__'):
             add_decorated_full_name(fn)
         callee.__full_name__ = fn.__full_name__
diff --git a/pywikibot/tools.py b/pywikibot/tools.py
index d71ad8a..777149b 100644
--- a/pywikibot/tools.py
+++ b/pywikibot/tools.py
@@ -456,6 +456,12 @@
 # only one arg, and that arg be a callable, as it will be detected as
 # a deprecator without any arguments.
 
+# Use a dummy function if inspect.signature (PEP 362; py 3.4) does not exist.
+if 'signature' in inspect.__dict__:
+    signature = inspect.signature
+else:
+    signature = lambda x: None
+
 
 def add_decorated_full_name(obj):
     """Extract full object name, including class, and store in __full_name__.
@@ -527,6 +533,7 @@
         inner_wrapper.__doc__ = obj.__doc__
         inner_wrapper.__name__ = obj.__name__
         inner_wrapper.__module__ = obj.__module__
+        inner_wrapper.__signature__ = signature(obj)
 
         # The decorator being decorated may have args, so both
         # syntax need to be supported.
@@ -581,6 +588,7 @@
         wrapper.__doc__ = obj.__doc__
         wrapper.__name__ = obj.__name__
         wrapper.__module__ = obj.__module__
+        wrapper.__signature__ = signature(obj)
         return wrapper
 
     without_parameters = len(args) == 1 and len(kwargs) == 0 and 
callable(args[0])
@@ -662,6 +670,19 @@
         wrapper.__doc__ = obj.__doc__
         wrapper.__name__ = obj.__name__
         wrapper.__module__ = obj.__module__
+        wrapper.__signature__ = signature(obj)
+        if wrapper.__signature__:
+            # Build a new signature with deprecated args added.
+            params = collections.OrderedDict()
+            for param in wrapper.__signature__.parameters.values():
+                params[param.name] = param.replace()
+            for old_arg, new_arg in arg_pairs.items():
+                params[old_arg] = inspect.Parameter(
+                    old_arg, kind=inspect._POSITIONAL_OR_KEYWORD,
+                    default='[deprecated name of ' + new_arg + ']' if new_arg
+                    else NotImplemented)
+            wrapper.__signature__ = inspect.Signature()
+            wrapper.__signature__._parameters = params
         if not hasattr(obj, '__full_name__'):
             add_decorated_full_name(obj)
         wrapper.__full_name__ = obj.__full_name__

-- 
To view, visit https://gerrit.wikimedia.org/r/175419
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2aeef8c8f31cdb01f18e199834b2f1a8ef8b043c
Gerrit-PatchSet: 1
Gerrit-Project: pywikibot/core
Gerrit-Branch: master
Gerrit-Owner: John Vandenberg <jay...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to