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 | |
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.
-rwxr-xr-x | cmd2/argparse_completer.py | 18 | ||||
-rwxr-xr-x | cmd2/cmd2.py | 2 | ||||
-rwxr-xr-x | examples/tab_autocompletion.py | 6 |
3 files changed, 21 insertions, 5 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) diff --git a/examples/tab_autocompletion.py b/examples/tab_autocompletion.py index 17c8391d..a1a8daee 100755 --- a/examples/tab_autocompletion.py +++ b/examples/tab_autocompletion.py @@ -95,6 +95,10 @@ class TabCompleteExample(cmd2.Cmd): }, } + def instance_query_actors(self) -> List[str]: + """Simulating a function that queries and returns a completion values""" + return actors + # This demonstrates a number of customizations of the AutoCompleter version of ArgumentParser # - The help output will separately group required vs optional flags # - The help output for arguments with multiple flags or with append=True is more concise @@ -222,7 +226,7 @@ class TabCompleteExample(cmd2.Cmd): # tag the action objects with completion providers. This can be a collection or a callable setattr(director_action, argparse_completer.ACTION_ARG_CHOICES, static_list_directors) - setattr(actor_action, argparse_completer.ACTION_ARG_CHOICES, query_actors) + setattr(actor_action, argparse_completer.ACTION_ARG_CHOICES, instance_query_actors) vid_movies_delete_parser = vid_movies_commands_subparsers.add_parser('delete') |