summaryrefslogtreecommitdiff
path: root/cmd2
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 /cmd2
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.
Diffstat (limited to 'cmd2')
-rwxr-xr-xcmd2/argparse_completer.py18
-rwxr-xr-xcmd2/cmd2.py2
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)