]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-61011: Fix inheritance of nested mutually exclusive groups in argparse...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Fri, 11 Oct 2024 09:07:03 +0000 (11:07 +0200)
committerGitHub <noreply@github.com>
Fri, 11 Oct 2024 09:07:03 +0000 (09:07 +0000)
Previously, all nested mutually exclusive groups lost their connection
to the group containing them and were displayed as belonging directly
to the parser.

(cherry picked from commit 18c74497681e0107d7cde53e63ea42feb38f2176)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Co-authored-by: Danica J. Sutherland <djsutherland@users.noreply.github.com>
Lib/argparse.py
Lib/test/test_argparse.py
Misc/ACKS
Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst [new file with mode: 0644]

index bd5c757197fcf8c316fc443747ce547b92d378e5..2a3253453dff84955c7e64751b7462cda7c87ffa 100644 (file)
@@ -1564,7 +1564,11 @@ class _ActionsContainer(object):
         # NOTE: if add_mutually_exclusive_group ever gains title= and
         # description= then this code will need to be expanded as above
         for group in container._mutually_exclusive_groups:
-            mutex_group = self.add_mutually_exclusive_group(
+            if group._container is container:
+                cont = self
+            else:
+                cont = title_group_map[group._container.title]
+            mutex_group = cont.add_mutually_exclusive_group(
                 required=group.required)
 
             # map the actions to their new mutex group
index 13d15fbf075861f4849cafa6376f79dfa2f244ac..84f8b09fb1d2a4d76fdbddd5385e7b3782064fa4 100644 (file)
@@ -2880,6 +2880,35 @@ class TestParentParsers(TestCase):
               -x X
         '''.format(progname, ' ' if progname else '' )))
 
+    def test_mutex_groups_parents(self):
+        parent = ErrorRaisingArgumentParser(add_help=False)
+        g = parent.add_argument_group(title='g', description='gd')
+        g.add_argument('-w')
+        g.add_argument('-x')
+        m = g.add_mutually_exclusive_group()
+        m.add_argument('-y')
+        m.add_argument('-z')
+        parser = ErrorRaisingArgumentParser(prog='PROG', parents=[parent])
+
+        self.assertRaises(ArgumentParserError, parser.parse_args,
+            ['-y', 'Y', '-z', 'Z'])
+
+        parser_help = parser.format_help()
+        self.assertEqual(parser_help, textwrap.dedent('''\
+            usage: PROG [-h] [-w W] [-x X] [-y Y | -z Z]
+
+            options:
+              -h, --help  show this help message and exit
+
+            g:
+              gd
+
+              -w W
+              -x X
+              -y Y
+              -z Z
+        '''))
+
 # ==============================
 # Mutually exclusive group tests
 # ==============================
index b5dc32ee507689f72d4d3a2f32b609b2bbc33bbc..837ffbda18aea1012e855286bf7f695a6804ece4 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -1792,6 +1792,7 @@ Reuben Sumner
 Eryk Sun
 Sanjay Sundaresan
 Marek Ć uppa
+Danica J. Sutherland
 Hisao Suzuki
 Kalle Svensson
 Andrew Svetlov
diff --git a/Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst b/Misc/NEWS.d/next/Library/2024-10-09-21-42-43.gh-issue-61011.pQXZb1.rst
new file mode 100644 (file)
index 0000000..20f9c0b
--- /dev/null
@@ -0,0 +1,4 @@
+Fix inheritance of nested mutually exclusive groups from parent parser in
+:class:`argparse.ArgumentParser`. Previously, all nested mutually exclusive
+groups lost their connection to the group containing them and were displayed
+as belonging directly to the parser.