@@ -214,12 +214,6 @@ def get_choices(self) -> Choices:
214214completion and enables nargs range parsing. See _add_argument_wrapper for
215215more 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
225219cmd2 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
816810setattr (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
13291300class Cmd2AttributeWrapper :
13301301 """Wraps a cmd2-specific attribute added to an argparse Namespace.
0 commit comments