3030completions_from_function = ['completions' , 'function' , 'fairly' , 'complete' ]
3131completions_from_method = ['completions' , 'method' , 'missed' , 'spot' ]
3232
33+ AP_COMP_ERROR_TEXT = "SHOULD ONLY BE THIS TEXT"
34+
3335
3436def choices_function () -> List [str ]:
3537 """Function that provides choices"""
@@ -53,7 +55,7 @@ def completer_takes_arg_tokens(text: str, line: str, begidx: int, endidx: int,
5355 return basic_complete (text , line , begidx , endidx , match_against )
5456
5557
56- # noinspection PyMethodMayBeStatic,PyUnusedLocal
58+ # noinspection PyMethodMayBeStatic,PyUnusedLocal,PyProtectedMember
5759class AutoCompleteTester (cmd2 .Cmd ):
5860 """Cmd2 app that exercises ArgparseCompleter class"""
5961 def __init__ (self , * args , ** kwargs ):
@@ -181,6 +183,7 @@ def do_completer(self, args: argparse.Namespace) -> None:
181183 choices = one_or_more_choices )
182184 nargs_parser .add_argument ("--optional" , help = "a flag with an optional value" , nargs = argparse .OPTIONAL ,
183185 choices = optional_choices )
186+ # noinspection PyTypeChecker
184187 nargs_parser .add_argument ("--range" , help = "a flag with nargs range" , nargs = (1 , 2 ),
185188 choices = range_choices )
186189 nargs_parser .add_argument ("--remainder" , help = "a flag wanting remaining" , nargs = argparse .REMAINDER ,
@@ -231,6 +234,24 @@ def choice_raise_error(self) -> List[str]:
231234 def do_raise_completion_error (self , args : argparse .Namespace ) -> None :
232235 pass
233236
237+ ############################################################################################################
238+ # Begin code related to _ArgparseCompletionError
239+ ############################################################################################################
240+ def raise_argparse_completion_error (self ):
241+ """Raises ArgparseCompletionError to make sure it gets raised as is"""
242+ from cmd2 .argparse_completer import _ArgparseCompletionError
243+ raise _ArgparseCompletionError (AP_COMP_ERROR_TEXT )
244+
245+ ap_comp_error_parser = Cmd2ArgumentParser ()
246+ ap_comp_error_parser .add_argument ('pos_ap_comp_err' , help = 'pos ap completion error' ,
247+ choices_method = raise_argparse_completion_error )
248+ ap_comp_error_parser .add_argument ('--flag_ap_comp_err' , help = 'flag ap completion error' ,
249+ choices_method = raise_argparse_completion_error )
250+
251+ @with_argparser (ap_comp_error_parser )
252+ def do_raise_ap_completion_error (self , args : argparse .Namespace ) -> None :
253+ pass
254+
234255 ############################################################################################################
235256 # Begin code related to receiving arg_tokens
236257 ############################################################################################################
@@ -772,6 +793,25 @@ def test_completion_error(ac_app, capsys, args, text):
772793 assert "{} broke something" .format (text ) in out
773794
774795
796+ @pytest .mark .parametrize ('arg' , [
797+ # Exercise positional arg that raises _ArgparseCompletionError
798+ '' ,
799+
800+ # Exercise flag arg that raises _ArgparseCompletionError
801+ '--flag_ap_comp_err'
802+ ])
803+ def test_argparse_completion_error (ac_app , capsys , arg ):
804+ text = ''
805+ line = 'raise_ap_completion_error {} {}' .format (arg , text )
806+ endidx = len (line )
807+ begidx = endidx - len (text )
808+
809+ first_match = complete_tester (text , line , begidx , endidx , ac_app )
810+ assert first_match is None
811+ out , err = capsys .readouterr ()
812+ assert out .strip () == AP_COMP_ERROR_TEXT
813+
814+
775815@pytest .mark .parametrize ('command_and_args, completions' , [
776816 # Exercise a choices function that receives arg_tokens dictionary
777817 ('arg_tokens choice subcmd' , ['choice' , 'subcmd' ]),
0 commit comments