mirror of https://github.com/python/cpython
Merged upstream changes.
This commit is contained in:
commit
bf353aadf2
|
@ -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):
|
||||||
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
|
||||||
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.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue