diff options
author | kmvanbrunt <kmvanbrunt@gmail.com> | 2018-04-23 15:48:53 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-23 15:48:53 -0400 |
commit | f11b06374aaf56b755de33a763220140d36eab64 (patch) | |
tree | c99bcdfcb3e73484e956c0e6df98da16fd6a44e4 | |
parent | c9b676ab80872a61f5d843fc3804d14eca6786ba (diff) | |
parent | 4bc454f376c609e9bdf8e013d2b85c49c3ca1a6c (diff) | |
download | cmd2-git-f11b06374aaf56b755de33a763220140d36eab64.tar.gz |
Merge pull request #367 from python-cmd2/autocompleter
Autocompleter updates
-rwxr-xr-x | cmd2/argparse_completer.py | 20 | ||||
-rwxr-xr-x | cmd2/cmd2.py | 4 | ||||
-rwxr-xr-x | examples/tab_autocompletion.py | 6 |
3 files changed, 24 insertions, 6 deletions
diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py index e87e9c04..03f2d965 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 @@ -199,6 +200,8 @@ class AutoCompleter(object): :param arg_choices: dictionary mapping from argparse argument 'dest' name to list of choices :param subcmd_args_lookup: mapping a sub-command group name to a tuple to fill the child\ AutoCompleter's arg_choices and subcmd_args_lookup parameters + :param tab_for_arg_help: Enable of disable argument help when there's no completion result + :param cmd2_app: reference to the Cmd2 application. Enables argparse argument completion with class methods """ if not subcmd_args_lookup: subcmd_args_lookup = {} @@ -209,6 +212,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 +256,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 +497,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..8d8a5b07 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) @@ -2070,7 +2070,7 @@ class Cmd(cmd.Cmd): :param line: str - line of text read from input :return: bool - True if cmdloop() should exit, False otherwise """ - stop = 0 + stop = False try: statement = self._complete_statement(line) (stop, statement) = self.postparsing_precmd(statement) 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') |