diff options
author | Eric Lin <anselor@gmail.com> | 2018-04-23 15:19:54 -0400 |
---|---|---|
committer | Eric Lin <anselor@gmail.com> | 2018-04-23 15:19:54 -0400 |
commit | 25d52d7301064278d4159dbb967ffd2f7d9fd21c (patch) | |
tree | 84b7f3db681aca1c357d56be4f169887823747c9 /cmd2 | |
parent | cbb94bff0cfed8c0ccbf8e0c2dd4c61f59881573 (diff) | |
download | cmd2-git-25d52d7301064278d4159dbb967ffd2f7d9fd21c.tar.gz |
Added support for using cmd2 application class methods as an argument completion provider. The default completion implementation in Cmd2 automatically passes self to AutoCompleter to be passed to the class method.
Diffstat (limited to 'cmd2')
-rwxr-xr-x | cmd2/argparse_completer.py | 18 | ||||
-rwxr-xr-x | cmd2/cmd2.py | 2 |
2 files changed, 16 insertions, 4 deletions
diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py index e87e9c04..1b75411c 100755 --- a/cmd2/argparse_completer.py +++ b/cmd2/argparse_completer.py @@ -190,7 +190,8 @@ class AutoCompleter(object): token_start_index: int = 1, arg_choices: Dict[str, Union[List, Tuple, Callable]] = None, subcmd_args_lookup: dict = None, - tab_for_arg_help: bool = True): + tab_for_arg_help: bool = True, + cmd2_app=None): """ Create an AutoCompleter @@ -209,6 +210,7 @@ class AutoCompleter(object): self._arg_choices = arg_choices.copy() if arg_choices is not None else {} self._token_start_index = token_start_index self._tab_for_arg_help = tab_for_arg_help + self._cmd2_app = cmd2_app self._flags = [] # all flags in this command self._flags_without_args = [] # all flags that don't take arguments @@ -252,7 +254,8 @@ class AutoCompleter(object): subcmd_start = token_start_index + len(self._positional_actions) sub_completers[subcmd] = AutoCompleter(action.choices[subcmd], subcmd_start, arg_choices=subcmd_args, - subcmd_args_lookup=subcmd_lookup) + subcmd_args_lookup=subcmd_lookup, + cmd2_app=cmd2_app) sub_commands.append(subcmd) self._positional_completers[action.dest] = sub_completers self._arg_choices[action.dest] = sub_commands @@ -492,7 +495,16 @@ class AutoCompleter(object): args = self._arg_choices[action.dest] if callable(args): - args = args() + try: + if self._cmd2_app is not None: + try: + args = args(self._cmd2_app) + except TypeError: + args = args() + else: + args = args() + except TypeError: + return [] try: iter(args) diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py index 288a506b..820e9441 100755 --- a/cmd2/cmd2.py +++ b/cmd2/cmd2.py @@ -1838,7 +1838,7 @@ class Cmd(cmd.Cmd): def _autocomplete_default(self, text: str, line: str, begidx: int, endidx: int, argparser: argparse.ArgumentParser) -> List[str]: """Default completion function for argparse commands.""" - completer = AutoCompleter(argparser) + completer = AutoCompleter(argparser, cmd2_app=self) tokens, _ = self.tokens_for_completion(line, begidx, endidx) results = completer.complete_command(tokens, text, line, begidx, endidx) |