summaryrefslogtreecommitdiff
path: root/cmd2/decorators.py
diff options
context:
space:
mode:
authorxNinjaKittyx <xNinjaKittyx@users.noreply.github.com>2020-12-15 17:21:33 -0800
committerxNinjaKittyx <xNinjaKittyx@users.noreply.github.com>2020-12-15 18:20:13 -0800
commit9aa54a5b27468d61337528cb1e1b5b9b11a80978 (patch)
tree567693115cc101efb9254a96d96d80e9f9ccd557 /cmd2/decorators.py
parent03c65c60b39e369958b056c5c844d36d515c8a63 (diff)
downloadcmd2-git-ci_improvements.tar.gz
Adds pre-commit config to run various lintersci_improvements
This ads black, isort, pyupgrade, and flake8 to pre-commit-config.yaml There are also some small changes to travis.yml and tasks.py to reduce some repeated configurations that should be consolidated into setup.cfg. Most other changes are automated by the linter scripts.
Diffstat (limited to 'cmd2/decorators.py')
-rw-r--r--cmd2/decorators.py67
1 files changed, 41 insertions, 26 deletions
diff --git a/cmd2/decorators.py b/cmd2/decorators.py
index 4ee61754..208b8e64 100644
--- a/cmd2/decorators.py
+++ b/cmd2/decorators.py
@@ -28,12 +28,16 @@ def with_category(category: str) -> Callable:
For an alternative approach to categorizing commands using a function, see
:func:`~cmd2.utils.categorize`
"""
+
def cat_decorator(func):
from .utils import categorize
+
categorize(func, category)
return func
+
return cat_decorator
+
##########################
# The _parse_positionals and _arg_swap functions allow for additional positional args to be preserved
# in cmd2 command functions/callables. As long as the 2-ple of arguments we expect to be there can be
@@ -50,6 +54,7 @@ def _parse_positionals(args: Tuple) -> Tuple[Union['cmd2.Cmd', 'cmd2.CommandSet'
"""
for pos, arg in enumerate(args):
from cmd2 import Cmd, CommandSet
+
if (isinstance(arg, Cmd) or isinstance(arg, CommandSet)) and len(args) > pos:
if isinstance(arg, CommandSet):
arg = arg._cmd
@@ -72,7 +77,7 @@ def _arg_swap(args: Union[Tuple[Any], List[Any]], search_arg: Any, *replace_arg:
"""
index = args.index(search_arg)
args_list = list(args)
- args_list[index:index + 1] = replace_arg
+ args_list[index : index + 1] = replace_arg
return args_list
@@ -109,13 +114,11 @@ def with_argument_list(*args: List[Callable], preserve_quotes: bool = False) ->
:return: return value of command function
"""
cmd2_app, statement = _parse_positionals(args)
- _, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(command_name,
- statement,
- preserve_quotes)
+ _, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(command_name, statement, preserve_quotes)
args_list = _arg_swap(args, statement, parsed_arglist)
return func(*args_list, **kwargs)
- command_name = func.__name__[len(constants.COMMAND_FUNC_PREFIX):]
+ command_name = func.__name__[len(constants.COMMAND_FUNC_PREFIX) :]
cmd_wrapper.__doc__ = func.__doc__
return cmd_wrapper
@@ -170,10 +173,12 @@ def _set_parser_prog(parser: argparse.ArgumentParser, prog: str):
break
-def with_argparser_and_unknown_args(parser: argparse.ArgumentParser, *,
- ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
- preserve_quotes: bool = False) -> \
- Callable[[argparse.Namespace, List], Optional[bool]]:
+def with_argparser_and_unknown_args(
+ parser: argparse.ArgumentParser,
+ *,
+ ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
+ preserve_quotes: bool = False
+) -> Callable[[argparse.Namespace, List], Optional[bool]]:
"""
Deprecated decorator. Use `with_argparser(parser, with_unknown_args=True)` instead.
@@ -207,16 +212,23 @@ def with_argparser_and_unknown_args(parser: argparse.ArgumentParser, *,
>>> self.poutput('unknowns: {}'.format(unknown))
"""
import warnings
- warnings.warn('This decorator will be deprecated. Use `with_argparser(parser, with_unknown_args=True)`.',
- PendingDeprecationWarning, stacklevel=2)
+
+ warnings.warn(
+ 'This decorator will be deprecated. Use `with_argparser(parser, with_unknown_args=True)`.',
+ PendingDeprecationWarning,
+ stacklevel=2,
+ )
return with_argparser(parser, ns_provider=ns_provider, preserve_quotes=preserve_quotes, with_unknown_args=True)
-def with_argparser(parser: argparse.ArgumentParser, *,
- ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
- preserve_quotes: bool = False,
- with_unknown_args: bool = False) -> Callable[[argparse.Namespace], Optional[bool]]:
+def with_argparser(
+ parser: argparse.ArgumentParser,
+ *,
+ ns_provider: Optional[Callable[..., argparse.Namespace]] = None,
+ preserve_quotes: bool = False,
+ with_unknown_args: bool = False
+) -> Callable[[argparse.Namespace], Optional[bool]]:
"""A decorator to alter a cmd2 method to populate its ``args`` argument by parsing arguments
with the given instance of argparse.ArgumentParser.
@@ -277,9 +289,9 @@ def with_argparser(parser: argparse.ArgumentParser, *,
:raises: Cmd2ArgparseError if argparse has error parsing command line
"""
cmd2_app, statement_arg = _parse_positionals(args)
- statement, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(command_name,
- statement_arg,
- preserve_quotes)
+ statement, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(
+ command_name, statement_arg, preserve_quotes
+ )
if ns_provider is None:
namespace = None
@@ -294,7 +306,7 @@ def with_argparser(parser: argparse.ArgumentParser, *,
if with_unknown_args:
new_args = parser.parse_known_args(parsed_arglist, namespace)
else:
- new_args = (parser.parse_args(parsed_arglist, namespace), )
+ new_args = (parser.parse_args(parsed_arglist, namespace),)
ns = new_args[0]
except SystemExit:
raise Cmd2ArgparseError
@@ -318,7 +330,7 @@ def with_argparser(parser: argparse.ArgumentParser, *,
return func(*args_list, **kwargs)
# argparser defaults the program name to sys.argv[0], but we want it to be the name of our command
- command_name = func.__name__[len(constants.COMMAND_FUNC_PREFIX):]
+ command_name = func.__name__[len(constants.COMMAND_FUNC_PREFIX) :]
_set_parser_prog(parser, command_name)
# If the description has not been set, then use the method docstring if one exists
@@ -338,12 +350,14 @@ def with_argparser(parser: argparse.ArgumentParser, *,
return arg_decorator
-def as_subcommand_to(command: str,
- subcommand: str,
- parser: argparse.ArgumentParser,
- *,
- help: Optional[str] = None,
- aliases: Iterable[str] = None) -> Callable[[argparse.Namespace], Optional[bool]]:
+def as_subcommand_to(
+ command: str,
+ subcommand: str,
+ parser: argparse.ArgumentParser,
+ *,
+ help: Optional[str] = None,
+ aliases: Iterable[str] = None
+) -> Callable[[argparse.Namespace], Optional[bool]]:
"""
Tag this method as a subcommand to an existing argparse decorated command.
@@ -356,6 +370,7 @@ def as_subcommand_to(command: str,
ArgumentParser.add_subparser().
:return: Wrapper function that can receive an argparse.Namespace
"""
+
def arg_decorator(func: Callable):
_set_parser_prog(parser, command + ' ' + subcommand)