Skip to content

Commit 64fdc44

Browse files
committed
Added cmd2.Cmd method to determine what ArgparseCompleter type to use
1 parent 81d5f04 commit 64fdc44

File tree

2 files changed

+22
-21
lines changed

2 files changed

+22
-21
lines changed

cmd2/argparse_completer.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -408,11 +408,7 @@ def update_mutex_groups(arg_action: argparse.Action) -> None:
408408
parent_tokens[action.dest] = [token]
409409

410410
parser: argparse.ArgumentParser = self._subcommand_action.choices[token]
411-
completer_type: Optional[
412-
Type[ArgparseCompleter]
413-
] = parser.get_ap_completer_type() # type: ignore[attr-defined]
414-
if completer_type is None:
415-
completer_type = DEFAULT_AP_COMPLETER
411+
completer_type = self._cmd2_app._determine_ap_completer_type(parser)
416412

417413
completer = completer_type(parser, self._cmd2_app, parent_tokens=parent_tokens)
418414

@@ -616,11 +612,7 @@ def complete_subcommand_help(self, text: str, line: str, begidx: int, endidx: in
616612
for token_index, token in enumerate(tokens):
617613
if token in self._subcommand_action.choices:
618614
parser: argparse.ArgumentParser = self._subcommand_action.choices[token]
619-
completer_type: Optional[
620-
Type[ArgparseCompleter]
621-
] = parser.get_ap_completer_type() # type: ignore[attr-defined]
622-
if completer_type is None:
623-
completer_type = DEFAULT_AP_COMPLETER
615+
completer_type = self._cmd2_app._determine_ap_completer_type(parser)
624616

625617
completer = completer_type(parser, self._cmd2_app)
626618
return completer.complete_subcommand_help(text, line, begidx, endidx, tokens[token_index + 1 :])
@@ -643,11 +635,7 @@ def format_help(self, tokens: List[str]) -> str:
643635
for token_index, token in enumerate(tokens):
644636
if token in self._subcommand_action.choices:
645637
parser: argparse.ArgumentParser = self._subcommand_action.choices[token]
646-
completer_type: Optional[
647-
Type[ArgparseCompleter]
648-
] = parser.get_ap_completer_type() # type: ignore[attr-defined]
649-
if completer_type is None:
650-
completer_type = DEFAULT_AP_COMPLETER
638+
completer_type = self._cmd2_app._determine_ap_completer_type(parser)
651639

652640
completer = completer_type(parser, self._cmd2_app)
653641
return completer.format_help(tokens[token_index + 1 :])

cmd2/cmd2.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1841,6 +1841,23 @@ def _display_matches_pyreadline(self, matches: List[str]) -> None: # pragma: no
18411841
# Display matches using actual display function. This also redraws the prompt and input lines.
18421842
orig_pyreadline_display(matches_to_display)
18431843

1844+
@staticmethod
1845+
def _determine_ap_completer_type(parser: argparse.ArgumentParser) -> Type[argparse_completer.ArgparseCompleter]:
1846+
"""
1847+
Determine what type of ArgparseCompleter to use on a given parser. If the parser does not have one
1848+
set, then use argparse_completer.DEFAULT_AP_COMPLETER.
1849+
1850+
:param parser: the parser to examine
1851+
:return: type of ArgparseCompleter
1852+
"""
1853+
completer_type: Optional[
1854+
Type[argparse_completer.ArgparseCompleter]
1855+
] = parser.get_ap_completer_type() # type: ignore[attr-defined]
1856+
1857+
if completer_type is None:
1858+
completer_type = argparse_completer.DEFAULT_AP_COMPLETER
1859+
return completer_type
1860+
18441861
def _perform_completion(
18451862
self, text: str, line: str, begidx: int, endidx: int, custom_settings: Optional[utils.CustomCompletionSettings] = None
18461863
) -> None:
@@ -1910,9 +1927,7 @@ def _perform_completion(
19101927
cmd_set = self._cmd_to_command_sets[command] if command in self._cmd_to_command_sets else None
19111928

19121929
# Create the argparse completer
1913-
completer_type = argparser.get_ap_completer_type() # type: ignore[attr-defined]
1914-
if completer_type is None:
1915-
completer_type = argparse_completer.DEFAULT_AP_COMPLETER
1930+
completer_type = self._determine_ap_completer_type(argparser)
19161931
completer = completer_type(argparser, self)
19171932

19181933
completer_func = functools.partial(
@@ -1932,9 +1947,7 @@ def _perform_completion(
19321947
# Otherwise we are completing the command token or performing custom completion
19331948
else:
19341949
# Create the argparse completer
1935-
completer_type = custom_settings.parser.get_ap_completer_type() # type: ignore[attr-defined]
1936-
if completer_type is None:
1937-
completer_type = argparse_completer.DEFAULT_AP_COMPLETER
1950+
completer_type = self._determine_ap_completer_type(custom_settings.parser)
19381951
completer = completer_type(custom_settings.parser, self)
19391952

19401953
completer_func = functools.partial(

0 commit comments

Comments
 (0)