summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Lin <anselor@gmail.com>2018-04-23 15:19:54 -0400
committerEric Lin <anselor@gmail.com>2018-04-23 15:19:54 -0400
commit25d52d7301064278d4159dbb967ffd2f7d9fd21c (patch)
tree84b7f3db681aca1c357d56be4f169887823747c9
parentcbb94bff0cfed8c0ccbf8e0c2dd4c61f59881573 (diff)
downloadcmd2-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-xcmd2/argparse_completer.py18
-rwxr-xr-xcmd2/cmd2.py2
-rwxr-xr-xexamples/tab_autocompletion.py6
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')