mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	#10424: argument names are now included in the missing argument message
Fix and initial test patch by Michele Orrù.
This commit is contained in:
		
							parent
							
								
									8dd8d582e3
								
							
						
					
					
						commit
						f97c59aaba
					
				
					 3 changed files with 69 additions and 10 deletions
				
			
		|  | @ -1969,17 +1969,12 @@ def consume_positionals(start_index): | |||
|         # if we didn't consume all the argument strings, there were extras | ||||
|         extras.extend(arg_strings[stop_index:]) | ||||
| 
 | ||||
|         # if we didn't use all the Positional objects, there were too few | ||||
|         # arg strings supplied. | ||||
|         if positionals: | ||||
|             self.error(_('too few arguments')) | ||||
| 
 | ||||
|         # make sure all required actions were present | ||||
|         for action in self._actions: | ||||
|             if action.required: | ||||
|                 if action not in seen_actions: | ||||
|                     name = _get_action_name(action) | ||||
|                     self.error(_('argument %s is required') % name) | ||||
|         required_actions = [_get_action_name(action) for action in self._actions | ||||
|                             if action.required and action not in seen_actions] | ||||
|         if required_actions: | ||||
|             self.error(_('the following arguments are required: %s') % | ||||
|                        ', '.join(required_actions)) | ||||
| 
 | ||||
|         # make sure all required groups had one option present | ||||
|         for group in self._mutually_exclusive_groups: | ||||
|  |  | |||
|  | @ -4480,6 +4480,67 @@ def spam(string): | |||
|         else: | ||||
|             self.fail() | ||||
| 
 | ||||
| # ========================= | ||||
| # MessageContentError tests | ||||
| # ========================= | ||||
| 
 | ||||
| class TestMessageContentError(TestCase): | ||||
| 
 | ||||
|     def test_missing_argument_name_in_message(self): | ||||
|         parser = ErrorRaisingArgumentParser(prog='PROG', usage='') | ||||
|         parser.add_argument('req_pos', type=str) | ||||
|         parser.add_argument('-req_opt', type=int, required=True) | ||||
|         parser.add_argument('need_one', type=str, nargs='+') | ||||
| 
 | ||||
|         with self.assertRaises(ArgumentParserError) as cm: | ||||
|             parser.parse_args([]) | ||||
|         msg = str(cm.exception) | ||||
|         self.assertRegex(msg, 'req_pos') | ||||
|         self.assertRegex(msg, 'req_opt') | ||||
|         self.assertRegex(msg, 'need_one') | ||||
|         with self.assertRaises(ArgumentParserError) as cm: | ||||
|             parser.parse_args(['myXargument']) | ||||
|         msg = str(cm.exception) | ||||
|         self.assertNotIn(msg, 'req_pos') | ||||
|         self.assertRegex(msg, 'req_opt') | ||||
|         self.assertRegex(msg, 'need_one') | ||||
|         with self.assertRaises(ArgumentParserError) as cm: | ||||
|             parser.parse_args(['myXargument', '-req_opt=1']) | ||||
|         msg = str(cm.exception) | ||||
|         self.assertNotIn(msg, 'req_pos') | ||||
|         self.assertNotIn(msg, 'req_opt') | ||||
|         self.assertRegex(msg, 'need_one') | ||||
| 
 | ||||
|     def test_optional_optional_not_in_message(self): | ||||
|         parser = ErrorRaisingArgumentParser(prog='PROG', usage='') | ||||
|         parser.add_argument('req_pos', type=str) | ||||
|         parser.add_argument('--req_opt', type=int, required=True) | ||||
|         parser.add_argument('--opt_opt', type=bool, nargs='?', | ||||
|                             default=True) | ||||
|         with self.assertRaises(ArgumentParserError) as cm: | ||||
|             parser.parse_args([]) | ||||
|         msg = str(cm.exception) | ||||
|         self.assertRegex(msg, 'req_pos') | ||||
|         self.assertRegex(msg, 'req_opt') | ||||
|         self.assertNotIn(msg, 'opt_opt') | ||||
|         with self.assertRaises(ArgumentParserError) as cm: | ||||
|             parser.parse_args(['--req_opt=1']) | ||||
|         msg = str(cm.exception) | ||||
|         self.assertRegex(msg, 'req_pos') | ||||
|         self.assertNotIn(msg, 'req_opt') | ||||
|         self.assertNotIn(msg, 'opt_opt') | ||||
| 
 | ||||
|     def test_optional_positional_not_in_message(self): | ||||
|         parser = ErrorRaisingArgumentParser(prog='PROG', usage='') | ||||
|         parser.add_argument('req_pos') | ||||
|         parser.add_argument('optional_positional', nargs='?', default='eggs') | ||||
|         with self.assertRaises(ArgumentParserError) as cm: | ||||
|             parser.parse_args([]) | ||||
|         msg = str(cm.exception) | ||||
|         self.assertRegex(msg, 'req_pos') | ||||
|         self.assertNotIn(msg, 'optional_positional') | ||||
| 
 | ||||
| 
 | ||||
| # ====================== | ||||
| # parse_known_args tests | ||||
| # ====================== | ||||
|  |  | |||
|  | @ -187,6 +187,9 @@ Core and Builtins | |||
| Library | ||||
| ------- | ||||
| 
 | ||||
| - Issue #10424: Argparse now includes the names of the missing required | ||||
|   arguments in the missing arguments error message. | ||||
| 
 | ||||
| - Issue #12168: SysLogHandler now allows NUL termination to be controlled using | ||||
|   a new 'append_nul' attribute on the handler. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 R David Murray
						R David Murray