Commit f97c59aa authored by R David Murray's avatar R David Murray

#10424: argument names are now included in the missing argument message

Fix and initial test patch by Michele Orrù.
parent 8dd8d582
...@@ -1969,17 +1969,12 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer): ...@@ -1969,17 +1969,12 @@ class ArgumentParser(_AttributeHolder, _ActionsContainer):
# if we didn't consume all the argument strings, there were extras # if we didn't consume all the argument strings, there were extras
extras.extend(arg_strings[stop_index:]) 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 # make sure all required actions were present
for action in self._actions: required_actions = [_get_action_name(action) for action in self._actions
if action.required: if action.required and action not in seen_actions]
if action not in seen_actions: if required_actions:
name = _get_action_name(action) self.error(_('the following arguments are required: %s') %
self.error(_('argument %s is required') % name) ', '.join(required_actions))
# make sure all required groups had one option present # make sure all required groups had one option present
for group in self._mutually_exclusive_groups: for group in self._mutually_exclusive_groups:
......
...@@ -4480,6 +4480,67 @@ class TestArgumentTypeError(TestCase): ...@@ -4480,6 +4480,67 @@ class TestArgumentTypeError(TestCase):
else: else:
self.fail() 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 # parse_known_args tests
# ====================== # ======================
......
...@@ -187,6 +187,9 @@ Core and Builtins ...@@ -187,6 +187,9 @@ Core and Builtins
Library 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 - Issue #12168: SysLogHandler now allows NUL termination to be controlled using
a new 'append_nul' attribute on the handler. a new 'append_nul' attribute on the handler.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment