]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-29298: Fix crash with required subparsers without dest (GH-3680) (GH-27303)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 23 Jul 2021 13:27:05 +0000 (06:27 -0700)
committerGitHub <noreply@github.com>
Fri, 23 Jul 2021 13:27:05 +0000 (15:27 +0200)
(cherry picked from commit 17575f73ce2cb9f3a4eb4cc416c690f9a4e7205c)

Co-authored-by: Anthony Sottile <asottile@umich.edu>
Lib/argparse.py
Lib/test/test_argparse.py
Misc/NEWS.d/next/Library/2017-09-20-14-43-03.bpo-29298._78CSN.rst [new file with mode: 0644]

index 8a12dea766879944d4a6d869125400e3b5a924e4..e3a49e74fa8d17cd3939533dc6a11ed3ef213963 100644 (file)
@@ -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
 
index 4d0316f73edcd29cf8b16e0e5f8f69f4b92b5af5..0994e70e65e1c490d95b741e6273804b4f4d57aa 100644 (file)
@@ -2060,6 +2060,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 (file)
index 0000000..e84c6de
--- /dev/null
@@ -0,0 +1,2 @@
+Fix ``TypeError`` when required subparsers without ``dest`` do not receive
+arguments. Patch by Anthony Sottile.