summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkmvanbrunt <kmvanbrunt@gmail.com>2018-04-23 15:48:53 -0400
committerGitHub <noreply@github.com>2018-04-23 15:48:53 -0400
commitf11b06374aaf56b755de33a763220140d36eab64 (patch)
treec99bcdfcb3e73484e956c0e6df98da16fd6a44e4
parentc9b676ab80872a61f5d843fc3804d14eca6786ba (diff)
parent4bc454f376c609e9bdf8e013d2b85c49c3ca1a6c (diff)
downloadcmd2-git-f11b06374aaf56b755de33a763220140d36eab64.tar.gz
Merge pull request #367 from python-cmd2/autocompleter
Autocompleter updates
-rwxr-xr-xcmd2/argparse_completer.py20
-rwxr-xr-xcmd2/cmd2.py4
-rwxr-xr-xexamples/tab_autocompletion.py6
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')