diff options
author | Kevin Van Brunt <kmvanbrunt@gmail.com> | 2020-04-20 23:52:24 -0400 |
---|---|---|
committer | Kevin Van Brunt <kmvanbrunt@gmail.com> | 2020-04-20 23:52:24 -0400 |
commit | 0ccde8ba416e36af2484276d9763a8742214528d (patch) | |
tree | 62f29e3038bef861128174035b158d9d771e163c | |
parent | e7a0be4df68346ac15626c20c4a19c8fabb1bf49 (diff) | |
download | cmd2-git-0ccde8ba416e36af2484276d9763a8742214528d.tar.gz |
argument_list and argparse wrappers now pass kwargs through to the wrapped command function
-rw-r--r-- | cmd2/decorators.py | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/cmd2/decorators.py b/cmd2/decorators.py index deac4701..dc196032 100644 --- a/cmd2/decorators.py +++ b/cmd2/decorators.py @@ -1,7 +1,7 @@ # coding=utf-8 """Decorators for ``cmd2`` commands""" import argparse -from typing import Callable, List, Optional, Union +from typing import Any, Callable, Dict, List, Optional, Union from . import constants from .exceptions import Cmd2ArgparseError @@ -53,12 +53,20 @@ def with_argument_list(*args: List[Callable], preserve_quotes: bool = False) -> def arg_decorator(func: Callable): @functools.wraps(func) - def cmd_wrapper(cmd2_app, statement: Union[Statement, str]): + def cmd_wrapper(cmd2_app, statement: Union[Statement, str], **kwargs: Dict[str, Any]) -> Optional[bool]: + """ + Command function wrapper which translates command line into an argument list and calls actual command function + + :param cmd2_app: CLI instance passed as self parameter to command function + :param statement: command line string or already generated Statement + :param kwargs: any keyword arguments being passed to command function + :return: return value of command function + """ _, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(command_name, statement, preserve_quotes) - return func(cmd2_app, parsed_arglist) + return func(cmd2_app, parsed_arglist, **kwargs) command_name = func.__name__[len(constants.COMMAND_FUNC_PREFIX):] cmd_wrapper.__doc__ = func.__doc__ @@ -132,7 +140,17 @@ def with_argparser_and_unknown_args(parser: argparse.ArgumentParser, *, def arg_decorator(func: Callable): @functools.wraps(func) - def cmd_wrapper(cmd2_app, statement: Union[Statement, str]): + def cmd_wrapper(cmd2_app, statement: Union[Statement, str], **kwargs: Dict[str, Any]) -> Optional[bool]: + """ + Command function wrapper which translates command line into argparse Namespace and calls actual + command function + + :param cmd2_app: CLI instance passed as self parameter to command function + :param statement: command line string or already generated Statement + :param kwargs: any keyword arguments being passed to command function + :return: return value of command function + :raises: Cmd2ArgparseError if argparse has error parsing command line + """ statement, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(command_name, statement, preserve_quotes) @@ -148,7 +166,7 @@ def with_argparser_and_unknown_args(parser: argparse.ArgumentParser, *, raise Cmd2ArgparseError else: setattr(args, '__statement__', statement) - return func(cmd2_app, args, unknown) + return func(cmd2_app, args, unknown, **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):] @@ -204,7 +222,17 @@ def with_argparser(parser: argparse.ArgumentParser, *, def arg_decorator(func: Callable): @functools.wraps(func) - def cmd_wrapper(cmd2_app, statement: Union[Statement, str]): + def cmd_wrapper(cmd2_app, statement: Union[Statement, str], **kwargs: Dict[str, Any]) -> Optional[bool]: + """ + Command function wrapper which translates command line into argparse Namespace and calls actual + command function + + :param cmd2_app: CLI instance passed as self parameter to command function + :param statement: command line string or already generated Statement + :param kwargs: any keyword arguments being passed to command function + :return: return value of command function + :raises: Cmd2ArgparseError if argparse has error parsing command line + """ statement, parsed_arglist = cmd2_app.statement_parser.get_command_arg_list(command_name, statement, preserve_quotes) @@ -220,7 +248,7 @@ def with_argparser(parser: argparse.ArgumentParser, *, raise Cmd2ArgparseError else: setattr(args, '__statement__', statement) - return func(cmd2_app, args) + return func(cmd2_app, args, **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):] |