]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-29553: Fix ArgumentParser.format_usage() for mutually exclusive groups (GH-14976)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Sun, 25 Aug 2019 21:30:49 +0000 (14:30 -0700)
committerBerker Peksag <berker.peksag@gmail.com>
Sun, 25 Aug 2019 21:30:49 +0000 (00:30 +0300)
Co-authored-by: Andrew Nester <andrew.nester.dev@gmail.com>
Co-authored-by: Flavian Hautbois <flavianh@sicara.com>
(cherry picked from commit da27d9b9dc44913ffee8f28d9638985eaaa03755)

Lib/argparse.py
Lib/test/test_argparse.py
Misc/NEWS.d/next/Library/2019-07-27-10-14-45.bpo-29553.TVeIDe.rst [new file with mode: 0644]

index a0307492476259c51d603bb6b15653f6d3a99d85..24af355b74413018540ee3093cc02aad484d3999 100644 (file)
@@ -407,13 +407,19 @@ class HelpFormatter(object):
                             inserts[start] += ' ['
                         else:
                             inserts[start] = '['
-                        inserts[end] = ']'
+                        if end in inserts:
+                            inserts[end] += ']'
+                        else:
+                            inserts[end] = ']'
                     else:
                         if start in inserts:
                             inserts[start] += ' ('
                         else:
                             inserts[start] = '('
-                        inserts[end] = ')'
+                        if end in inserts:
+                            inserts[end] += ')'
+                        else:
+                            inserts[end] = ')'
                     for i in range(start + 1, end):
                         inserts[i] = '|'
 
index 51f0effaf2ff65e71694f0db2e38d9aebf80a3dd..3cdaff61c7cc3d69e57448992d161c20d10d9f31 100644 (file)
@@ -2772,6 +2772,46 @@ class TestMutuallyExclusiveOptionalsAndPositionalsMixed(MEMixin, TestCase):
           -c          c help
         '''
 
+class TestMutuallyExclusiveNested(MEMixin, TestCase):
+
+    def get_parser(self, required):
+        parser = ErrorRaisingArgumentParser(prog='PROG')
+        group = parser.add_mutually_exclusive_group(required=required)
+        group.add_argument('-a')
+        group.add_argument('-b')
+        group2 = group.add_mutually_exclusive_group(required=required)
+        group2.add_argument('-c')
+        group2.add_argument('-d')
+        group3 = group2.add_mutually_exclusive_group(required=required)
+        group3.add_argument('-e')
+        group3.add_argument('-f')
+        return parser
+
+    usage_when_not_required = '''\
+        usage: PROG [-h] [-a A | -b B | [-c C | -d D | [-e E | -f F]]]
+        '''
+    usage_when_required = '''\
+        usage: PROG [-h] (-a A | -b B | (-c C | -d D | (-e E | -f F)))
+        '''
+
+    help = '''\
+
+        optional arguments:
+          -h, --help  show this help message and exit
+          -a A
+          -b B
+          -c C
+          -d D
+          -e E
+          -f F
+        '''
+
+    # We are only interested in testing the behavior of format_usage().
+    test_failures_when_not_required = None
+    test_failures_when_required = None
+    test_successes_when_not_required = None
+    test_successes_when_required = None
+
 # =================================================
 # Mutually exclusive group in parent parser tests
 # =================================================
diff --git a/Misc/NEWS.d/next/Library/2019-07-27-10-14-45.bpo-29553.TVeIDe.rst b/Misc/NEWS.d/next/Library/2019-07-27-10-14-45.bpo-29553.TVeIDe.rst
new file mode 100644 (file)
index 0000000..3472db7
--- /dev/null
@@ -0,0 +1,2 @@
+Fixed :meth:`argparse.ArgumentParser.format_usage` for mutually exclusive groups.
+Patch by Andrew Nester.