diff options
author | Eric Lin <anselor@gmail.com> | 2018-04-20 15:50:53 -0400 |
---|---|---|
committer | Eric Lin <anselor@gmail.com> | 2018-04-20 15:50:53 -0400 |
commit | 85c2c6bba46900af6012b54c31e650095194b1aa (patch) | |
tree | 4519d86d44f5c40376a820f530b69fa2ee745de3 /cmd2/argparse_completer.py | |
parent | a0a46f9396a72f440f65e46d7170a0d366796574 (diff) | |
download | cmd2-git-85c2c6bba46900af6012b54c31e650095194b1aa.tar.gz |
Changed cmd2 to use autocompleter by default for all argparse commands. Not all tests are passing yet.
Diffstat (limited to 'cmd2/argparse_completer.py')
-rwxr-xr-x | cmd2/argparse_completer.py | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py index 35f9342b..6c291e86 100755 --- a/cmd2/argparse_completer.py +++ b/cmd2/argparse_completer.py @@ -70,6 +70,8 @@ import re as _re from .rl_utils import rl_force_redisplay +ACTION_ARG_CHOICES = 'arg_choices' + class _RangeAction(object): def __init__(self, nargs: Union[int, str, Tuple[int, int], None]): @@ -220,6 +222,9 @@ class AutoCompleter(object): # if there are choices defined, record them in the arguments dictionary if action.choices is not None: self._arg_choices[action.dest] = action.choices + elif hasattr(action, ACTION_ARG_CHOICES): + action_arg_choices = getattr(action, ACTION_ARG_CHOICES) + self._arg_choices[action.dest] = action_arg_choices # if the parameter is flag based, it will have option_strings if action.option_strings: @@ -406,6 +411,22 @@ class AutoCompleter(object): return completion_results + def complete_command_help(self, tokens: List[str], text: str, line: str, begidx: int, endidx: int) -> List[str]: + for idx, token in enumerate(tokens): + is_last_token = idx > len(tokens) - 1 + + if idx >= self._token_start_index: + if self._positional_completers: + # For now argparse only allows 1 sub-command group per level + # so this will only loop once. + for completers in self._positional_completers.values(): + if token in completers: + return completers[token].complete_command_help(tokens, text, line, begidx, endidx) + else: + return self.basic_complete(text, line, begidx, endidx, completers.keys()) + return [] + + @staticmethod def _process_action_nargs(action: argparse.Action, arg_state: _ArgumentState) -> None: if isinstance(action, _RangeAction): @@ -467,6 +488,7 @@ class AutoCompleter(object): def _resolve_choices_for_arg(self, action: argparse.Action, used_values=()) -> List[str]: if action.dest in self._arg_choices: args = self._arg_choices[action.dest] + if callable(args): args = args() |