Skip to content

Commit 52f6a3d

Browse files
committed
Moved _get_nargs_pattern and _match_argument overrides into Cmd2ArgumentParser.
1 parent 41be698 commit 52f6a3d

1 file changed

Lines changed: 29 additions & 58 deletions

File tree

cmd2/argparse_custom.py

Lines changed: 29 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -214,12 +214,6 @@ def get_choices(self) -> Choices:
214214
completion and enables nargs range parsing. See _add_argument_wrapper for
215215
more details on these arguments.
216216
217-
``argparse.ArgumentParser._get_nargs_pattern`` - adds support for nargs ranges.
218-
See ``_get_nargs_pattern_wrapper`` for more details.
219-
220-
``argparse.ArgumentParser._match_argument`` - adds support for nargs ranges.
221-
See ``_match_argument_wrapper`` for more details.
222-
223217
**Added accessor methods**
224218
225219
cmd2 has patched ``argparse.Action`` to include the following accessor methods
@@ -694,7 +688,7 @@ def _add_argument_wrapper(
694688
table_columns: Sequence[str | Column] | None = None,
695689
**kwargs: Any,
696690
) -> argparse.Action:
697-
"""Wrap ActionsContainer.add_argument() which supports more settings used by cmd2.
691+
"""Wrap ActionsContainer.add_argument() to support cmd2-specific settings.
698692
699693
# Args from original function
700694
:param self: instance of the _ActionsContainer being added to
@@ -815,57 +809,6 @@ def _add_argument_wrapper(
815809
# Overwrite _ActionsContainer.add_argument with our wrapper
816810
setattr(argparse._ActionsContainer, 'add_argument', _add_argument_wrapper)
817811

818-
############################################################################################################
819-
# Patch ArgumentParser._get_nargs_pattern with our wrapper to support nargs ranges
820-
############################################################################################################
821-
822-
# Save original ArgumentParser._get_nargs_pattern so we can call it in our wrapper
823-
orig_argument_parser_get_nargs_pattern = argparse.ArgumentParser._get_nargs_pattern
824-
825-
826-
def _get_nargs_pattern_wrapper(self: argparse.ArgumentParser, action: argparse.Action) -> str:
827-
# Wrapper around ArgumentParser._get_nargs_pattern behavior to support nargs ranges
828-
nargs_range = action.get_nargs_range() # type: ignore[attr-defined]
829-
if nargs_range:
830-
range_max = '' if nargs_range[1] == constants.INFINITY else nargs_range[1]
831-
nargs_pattern = f'(-*A{{{nargs_range[0]},{range_max}}}-*)'
832-
833-
# if this is an optional action, -- is not allowed
834-
if action.option_strings:
835-
nargs_pattern = nargs_pattern.replace('-*', '')
836-
nargs_pattern = nargs_pattern.replace('-', '')
837-
return nargs_pattern
838-
839-
return orig_argument_parser_get_nargs_pattern(self, action)
840-
841-
842-
# Overwrite ArgumentParser._get_nargs_pattern with our wrapper
843-
setattr(argparse.ArgumentParser, '_get_nargs_pattern', _get_nargs_pattern_wrapper)
844-
845-
846-
############################################################################################################
847-
# Patch ArgumentParser._match_argument with our wrapper to support nargs ranges
848-
############################################################################################################
849-
orig_argument_parser_match_argument = argparse.ArgumentParser._match_argument
850-
851-
852-
def _match_argument_wrapper(self: argparse.ArgumentParser, action: argparse.Action, arg_strings_pattern: str) -> int:
853-
# Wrapper around ArgumentParser._match_argument behavior to support nargs ranges
854-
nargs_pattern = self._get_nargs_pattern(action)
855-
match = re.match(nargs_pattern, arg_strings_pattern)
856-
857-
# raise an exception if we weren't able to find a match
858-
if match is None:
859-
nargs_range = action.get_nargs_range() # type: ignore[attr-defined]
860-
if nargs_range is not None:
861-
raise ArgumentError(action, generate_range_error(nargs_range[0], nargs_range[1]))
862-
863-
return orig_argument_parser_match_argument(self, action, arg_strings_pattern)
864-
865-
866-
# Overwrite ArgumentParser._match_argument with our wrapper
867-
setattr(argparse.ArgumentParser, '_match_argument', _match_argument_wrapper)
868-
869812

870813
############################################################################################################
871814
# Patch argparse.ArgumentParser with accessors for ap_completer_type attribute
@@ -1325,6 +1268,34 @@ def create_text_group(self, title: str, text: RenderableType) -> TextGroup:
13251268
"""Create a TextGroup using this parser's formatter creator."""
13261269
return TextGroup(title, text, self._get_formatter)
13271270

1271+
def _get_nargs_pattern(self, action: argparse.Action) -> str:
1272+
"""Override to support nargs ranges."""
1273+
nargs_range = action.get_nargs_range() # type: ignore[attr-defined]
1274+
if nargs_range:
1275+
range_max = '' if nargs_range[1] == constants.INFINITY else nargs_range[1]
1276+
nargs_pattern = f'(-*A{{{nargs_range[0]},{range_max}}}-*)'
1277+
1278+
# if this is an optional action, -- is not allowed
1279+
if action.option_strings:
1280+
nargs_pattern = nargs_pattern.replace('-*', '')
1281+
nargs_pattern = nargs_pattern.replace('-', '')
1282+
return nargs_pattern
1283+
1284+
return super()._get_nargs_pattern(action)
1285+
1286+
def _match_argument(self, action: argparse.Action, arg_strings_pattern: str) -> int:
1287+
"""Override to support nargs ranges."""
1288+
nargs_pattern = self._get_nargs_pattern(action)
1289+
match = re.match(nargs_pattern, arg_strings_pattern)
1290+
1291+
# raise an exception if we weren't able to find a match
1292+
if match is None:
1293+
nargs_range = action.get_nargs_range() # type: ignore[attr-defined]
1294+
if nargs_range is not None:
1295+
raise ArgumentError(action, generate_range_error(nargs_range[0], nargs_range[1]))
1296+
1297+
return super()._match_argument(action, arg_strings_pattern)
1298+
13281299

13291300
class Cmd2AttributeWrapper:
13301301
"""Wraps a cmd2-specific attribute added to an argparse Namespace.

0 commit comments

Comments
 (0)