Skip to content

Commit

Permalink
Added cmd2.Cmd method to determine what ArgparseCompleter type to use
Browse files Browse the repository at this point in the history
  • Loading branch information
kmvanbrunt committed Sep 1, 2021
1 parent 81d5f04 commit 64fdc44
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 21 deletions.
18 changes: 3 additions & 15 deletions cmd2/argparse_completer.py
Original file line number Diff line number Diff line change
Expand Up @@ -408,11 +408,7 @@ def update_mutex_groups(arg_action: argparse.Action) -> None:
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)

Expand Down Expand Up @@ -616,11 +612,7 @@ def complete_subcommand_help(self, text: str, line: str, begidx: int, endidx: in
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 :])
Expand All @@ -643,11 +635,7 @@ def format_help(self, tokens: List[str]) -> str:
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 :])
Expand Down
25 changes: 19 additions & 6 deletions cmd2/cmd2.py
Original file line number Diff line number Diff line change
Expand Up @@ -1841,6 +1841,23 @@ def _display_matches_pyreadline(self, matches: List[str]) -> None: # pragma: no
# 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:
Expand Down Expand Up @@ -1910,9 +1927,7 @@ def _perform_completion(
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(
Expand All @@ -1932,9 +1947,7 @@ def _perform_completion(
# 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(
Expand Down

0 comments on commit 64fdc44

Please sign in to comment.