summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Van Brunt <kmvanbrunt@gmail.com>2021-09-01 13:13:13 -0400
committerKevin Van Brunt <kmvanbrunt@gmail.com>2021-09-01 13:33:22 -0400
commit64fdc44febc5d2551889cd973699d84dbb849f37 (patch)
tree5a2fcf0353b7457d1ab088d61141efedbdec2cc6
parent81d5f0458ee767f4c1cd76cb9a8f4036beb15273 (diff)
downloadcmd2-git-64fdc44febc5d2551889cd973699d84dbb849f37.tar.gz
Added cmd2.Cmd method to determine what ArgparseCompleter type to use
-rw-r--r--cmd2/argparse_completer.py18
-rw-r--r--cmd2/cmd2.py25
2 files changed, 22 insertions, 21 deletions
diff --git a/cmd2/argparse_completer.py b/cmd2/argparse_completer.py
index c00f3e60..f614ac32 100644
--- a/cmd2/argparse_completer.py
+++ b/cmd2/argparse_completer.py
@@ -408,11 +408,7 @@ class ArgparseCompleter:
parent_tokens[action.dest] = [token]
parser: argparse.ArgumentParser = self._subcommand_action.choices[token]
- completer_type: Optional[
- Type[ArgparseCompleter]
- ] = parser.get_ap_completer_type() # type: ignore[attr-defined]
- if completer_type is None:
- completer_type = DEFAULT_AP_COMPLETER
+ completer_type = self._cmd2_app._determine_ap_completer_type(parser)
completer = completer_type(parser, self._cmd2_app, parent_tokens=parent_tokens)
@@ -616,11 +612,7 @@ class ArgparseCompleter:
for token_index, token in enumerate(tokens):
if token in self._subcommand_action.choices:
parser: argparse.ArgumentParser = self._subcommand_action.choices[token]
- completer_type: Optional[
- Type[ArgparseCompleter]
- ] = parser.get_ap_completer_type() # type: ignore[attr-defined]
- if completer_type is None:
- completer_type = DEFAULT_AP_COMPLETER
+ completer_type = self._cmd2_app._determine_ap_completer_type(parser)
completer = completer_type(parser, self._cmd2_app)
return completer.complete_subcommand_help(text, line, begidx, endidx, tokens[token_index + 1 :])
@@ -643,11 +635,7 @@ class ArgparseCompleter:
for token_index, token in enumerate(tokens):
if token in self._subcommand_action.choices:
parser: argparse.ArgumentParser = self._subcommand_action.choices[token]
- completer_type: Optional[
- Type[ArgparseCompleter]
- ] = parser.get_ap_completer_type() # type: ignore[attr-defined]
- if completer_type is None:
- completer_type = DEFAULT_AP_COMPLETER
+ completer_type = self._cmd2_app._determine_ap_completer_type(parser)
completer = completer_type(parser, self._cmd2_app)
return completer.format_help(tokens[token_index + 1 :])
diff --git a/cmd2/cmd2.py b/cmd2/cmd2.py
index 128cfa76..eaa0655d 100644
--- a/cmd2/cmd2.py
+++ b/cmd2/cmd2.py
@@ -1841,6 +1841,23 @@ class Cmd(cmd.Cmd):
# Display matches using actual display function. This also redraws the prompt and input lines.
orig_pyreadline_display(matches_to_display)
+ @staticmethod
+ def _determine_ap_completer_type(parser: argparse.ArgumentParser) -> Type[argparse_completer.ArgparseCompleter]:
+ """
+ Determine what type of ArgparseCompleter to use on a given parser. If the parser does not have one
+ set, then use argparse_completer.DEFAULT_AP_COMPLETER.
+
+ :param parser: the parser to examine
+ :return: type of ArgparseCompleter
+ """
+ completer_type: Optional[
+ Type[argparse_completer.ArgparseCompleter]
+ ] = parser.get_ap_completer_type() # type: ignore[attr-defined]
+
+ if completer_type is None:
+ completer_type = argparse_completer.DEFAULT_AP_COMPLETER
+ return completer_type
+
def _perform_completion(
self, text: str, line: str, begidx: int, endidx: int, custom_settings: Optional[utils.CustomCompletionSettings] = None
) -> None:
@@ -1910,9 +1927,7 @@ class Cmd(cmd.Cmd):
cmd_set = self._cmd_to_command_sets[command] if command in self._cmd_to_command_sets else None
# Create the argparse completer
- completer_type = argparser.get_ap_completer_type() # type: ignore[attr-defined]
- if completer_type is None:
- completer_type = argparse_completer.DEFAULT_AP_COMPLETER
+ completer_type = self._determine_ap_completer_type(argparser)
completer = completer_type(argparser, self)
completer_func = functools.partial(
@@ -1932,9 +1947,7 @@ class Cmd(cmd.Cmd):
# Otherwise we are completing the command token or performing custom completion
else:
# Create the argparse completer
- completer_type = custom_settings.parser.get_ap_completer_type() # type: ignore[attr-defined]
- if completer_type is None:
- completer_type = argparse_completer.DEFAULT_AP_COMPLETER
+ completer_type = self._determine_ap_completer_type(custom_settings.parser)
completer = completer_type(custom_settings.parser, self)
completer_func = functools.partial(