summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Van Brunt <kmvanbrunt@gmail.com>2021-09-02 14:45:56 -0400
committerKevin Van Brunt <kmvanbrunt@gmail.com>2021-09-07 13:14:50 -0400
commit967a8ba26746afa0a59e763f26f70805ab574868 (patch)
tree408b2901df32ac9c318ed0896b4c0d854740194c
parentceacf225e5e267a96bf5db4fc5bb7702fa6f8a72 (diff)
downloadcmd2-git-967a8ba26746afa0a59e763f26f70805ab574868.tar.gz
Argparse tab completer will complete remaining flag names if there are no more positionals to complete.
-rw-r--r--CHANGELOG.md1
-rw-r--r--cmd2/argparse_completer.py7
-rw-r--r--tests/test_argparse_completer.py14
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):