From 097801844c99ea3916bebe1cc761257ea7083d34 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Fri, 23 Jul 2021 06:27:17 -0700 Subject: bpo-29298: Fix crash with required subparsers without dest (GH-3680) (GH-27304) (cherry picked from commit 17575f73ce2cb9f3a4eb4cc416c690f9a4e7205c) Co-authored-by: Anthony Sottile --- Lib/argparse.py | 2 ++ Lib/test/test_argparse.py | 24 ++++++++++++++++++++++ .../2017-09-20-14-43-03.bpo-29298._78CSN.rst | 2 ++ 3 files changed, 28 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index 2fb1da5..ccb010d 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -727,6 +727,8 @@ def _get_action_name(argument): return argument.metavar elif argument.dest not in (None, SUPPRESS): return argument.dest + elif argument.choices: + return '{' + ','.join(argument.choices) + '}' else: return None diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index 22cae62..e168544 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -2057,6 +2057,30 @@ class TestAddSubparsers(TestCase): ret = parser.parse_args(()) self.assertIsNone(ret.command) + def test_required_subparsers_no_destination_error(self): + parser = ErrorRaisingArgumentParser() + subparsers = parser.add_subparsers(required=True) + subparsers.add_parser('foo') + subparsers.add_parser('bar') + with self.assertRaises(ArgumentParserError) as excinfo: + parser.parse_args(()) + self.assertRegex( + excinfo.exception.stderr, + 'error: the following arguments are required: {foo,bar}\n$' + ) + + def test_wrong_argument_subparsers_no_destination_error(self): + parser = ErrorRaisingArgumentParser() + subparsers = parser.add_subparsers(required=True) + subparsers.add_parser('foo') + subparsers.add_parser('bar') + with self.assertRaises(ArgumentParserError) as excinfo: + parser.parse_args(('baz',)) + self.assertRegex( + excinfo.exception.stderr, + r"error: argument {foo,bar}: invalid choice: 'baz' \(choose from 'foo', 'bar'\)\n$" + ) + def test_optional_subparsers(self): parser = ErrorRaisingArgumentParser() subparsers = parser.add_subparsers(dest='command', required=False) diff --git a/Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst b/Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst new file mode 100644 index 0000000..e84c6de --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst @@ -0,0 +1,2 @@ +Fix ``TypeError`` when required subparsers without ``dest`` do not receive +arguments. Patch by Anthony Sottile. -- cgit v0.12