diff options
author | Kevin Van Brunt <kmvanbrunt@gmail.com> | 2021-09-02 14:45:56 -0400 |
---|---|---|
committer | Kevin Van Brunt <kmvanbrunt@gmail.com> | 2021-09-07 13:14:50 -0400 |
commit | 967a8ba26746afa0a59e763f26f70805ab574868 (patch) | |
tree | 408b2901df32ac9c318ed0896b4c0d854740194c | |
parent | ceacf225e5e267a96bf5db4fc5bb7702fa6f8a72 (diff) | |
download | cmd2-git-967a8ba26746afa0a59e763f26f70805ab574868.tar.gz |
Argparse tab completer will complete remaining flag names if there are no more positionals to complete.
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | cmd2/argparse_completer.py | 7 | ||||
-rw-r--r-- | tests/test_argparse_completer.py | 14 |
3 files changed, 19 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index f0a1daaf..dfd6ee05 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ * Tab completion of `CompletionItems` now includes divider row comprised of `Cmd.ruler` character. * Removed `--verbose` flag from set command since descriptions always show now. * All cmd2 built-in commands now populate `self.last_result`. + * Argparse tab completer will complete remaining flag names if there are no more positionals to complete. * Deletions (potentially breaking changes) * Deleted ``set_choices_provider()`` and ``set_completer()`` which were deprecated in 2.1.2 diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py index f614ac32..26835513 100644 --- a/cmd2/argparse_completer.py +++ b/cmd2/argparse_completer.py @@ -504,9 +504,10 @@ class ArgparseCompleter: elif not _single_prefix_char(text, self._parser) or skip_remaining_flags: raise _NoResultsError(self._parser, pos_arg_state.action) - # Handle case in which text is a single flag prefix character that - # didn't complete against any argument values. - if _single_prefix_char(text, self._parser) and not skip_remaining_flags: + # If we aren't skipping remaining flags, then complete flag names if either is True: + # 1. text is a single flag prefix character that didn't complete against any argument values + # 2. there are no more positionals to complete + if not skip_remaining_flags and (_single_prefix_char(text, self._parser) or not remaining_positionals): return self._complete_flags(text, line, begidx, endidx, matched_flags) return completion_results diff --git a/tests/test_argparse_completer.py b/tests/test_argparse_completer.py index 6cd9a7fe..1d585122 100644 --- a/tests/test_argparse_completer.py +++ b/tests/test_argparse_completer.py @@ -98,6 +98,15 @@ class ArgparseCompleterTester(cmd2.Cmd): def do_plus_flag(self, args: argparse.Namespace) -> None: pass + # A parser with a positional and flags. Used to test that remaining flag names are completed when all positionals are done. + pos_and_flag_parser = Cmd2ArgumentParser() + pos_and_flag_parser.add_argument("positional", choices=["a", "choice"]) + pos_and_flag_parser.add_argument("-f", "--flag", action='store_true') + + @with_argparser(pos_and_flag_parser) + def do_pos_and_flag(self, args: argparse.Namespace) -> None: + pass + ############################################################################################################ # Begin code related to testing choices and choices_provider parameters ############################################################################################################ @@ -519,6 +528,11 @@ def test_subcommand_completions(ac_app, subcommand, text, completions): ('flag --help --', '--', [], []), ('plus_flag --', '++', [], []), ('plus_flag ++help --', '++', [], []), + # Test remaining flag names complete after all positionals are complete + ('pos_and_flag', '', ['a', 'choice'], ['a', 'choice']), + ('pos_and_flag choice ', '', ['--flag', '--help', '-f', '-h'], ['[-f, --flag]', '[-h, --help]']), + ('pos_and_flag choice -f ', '', ['--help', '-h'], ['[-h, --help]']), + ('pos_and_flag choice -f -h ', '', [], []), ], ) def test_autcomp_flag_completion(ac_app, command_and_args, text, completion_matches, display_matches): |