From d7b510f30905e4c783d7d154ec519f9f62a8b586 Mon Sep 17 00:00:00 2001 From: Meghan Jones Date: Wed, 16 Jun 2021 18:53:18 -0400 Subject: [PATCH] Support tab completion in Jupyter by inserting aliases into the method signature (#1282) Add a new insert_alias() function in pygmt/helpers/decorators.py that is used by the use_alias() decorator to insert aliases into the method signature, to support tab completion in Jupyter and iPython. Co-authored-by: Wei Ji <23487320+weiji14@users.noreply.github.com> Co-authored-by: Dongdong Tian --- pygmt/helpers/decorators.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pygmt/helpers/decorators.py b/pygmt/helpers/decorators.py index 729234a4d66..bec2a06ec9e 100644 --- a/pygmt/helpers/decorators.py +++ b/pygmt/helpers/decorators.py @@ -8,6 +8,7 @@ import functools import textwrap import warnings +from inspect import Parameter, signature import numpy as np from pygmt.exceptions import GMTInvalidInput @@ -322,6 +323,30 @@ def fmt_docstring(module_func): return module_func +def _insert_alias(module_func, default_value=None): + """ + Function to insert PyGMT long aliases into the signature of a method. + """ + + # Get current signature and parameters + sig = signature(module_func) + wrapped_params = list(sig.parameters.values()) + kwargs_param = wrapped_params.pop(-1) + # Add new parameters from aliases + for alias in module_func.aliases.values(): + if alias not in sig.parameters.keys(): + new_param = Parameter( + alias, kind=Parameter.KEYWORD_ONLY, default=default_value + ) + wrapped_params = wrapped_params + [new_param] + all_params = wrapped_params + [kwargs_param] + # Update method signature + sig_new = sig.replace(parameters=all_params) + module_func.__signature__ = sig_new + + return module_func + + def use_alias(**aliases): """ Decorator to add aliases to keyword arguments of a function. @@ -383,6 +408,8 @@ def new_module(*args, **kwargs): new_module.aliases = aliases + new_module = _insert_alias(new_module) + return new_module return alias_decorator