bpo-29553: Fix ArgumentParser.format_usage() for mutually exclusive g… · python/cpython@da27d9b

3 files changed

lines changed

Original file line numberDiff line numberDiff line change

@@ -404,13 +404,19 @@ def _format_actions_usage(self, actions, groups):

404404

inserts[start] += ' ['

405405

else:

406406

inserts[start] = '['

407-

inserts[end] = ']'

407+

if end in inserts:

408+

inserts[end] += ']'

409+

else:

410+

inserts[end] = ']'

408411

else:

409412

if start in inserts:

410413

inserts[start] += ' ('

411414

else:

412415

inserts[start] = '('

413-

inserts[end] = ')'

416+

if end in inserts:

417+

inserts[end] += ')'

418+

else:

419+

inserts[end] = ')'

414420

for i in range(start + 1, end):

415421

inserts[i] = '|'

416422
Original file line numberDiff line numberDiff line change

@@ -2813,6 +2813,46 @@ def get_parser(self, required):

28132813

-c c help

28142814

'''

28152815
2816+

class TestMutuallyExclusiveNested(MEMixin, TestCase):

2817+
2818+

def get_parser(self, required):

2819+

parser = ErrorRaisingArgumentParser(prog='PROG')

2820+

group = parser.add_mutually_exclusive_group(required=required)

2821+

group.add_argument('-a')

2822+

group.add_argument('-b')

2823+

group2 = group.add_mutually_exclusive_group(required=required)

2824+

group2.add_argument('-c')

2825+

group2.add_argument('-d')

2826+

group3 = group2.add_mutually_exclusive_group(required=required)

2827+

group3.add_argument('-e')

2828+

group3.add_argument('-f')

2829+

return parser

2830+
2831+

usage_when_not_required = '''\

2832+

usage: PROG [-h] [-a A | -b B | [-c C | -d D | [-e E | -f F]]]

2833+

'''

2834+

usage_when_required = '''\

2835+

usage: PROG [-h] (-a A | -b B | (-c C | -d D | (-e E | -f F)))

2836+

'''

2837+
2838+

help = '''\

2839+
2840+

optional arguments:

2841+

-h, --help show this help message and exit

2842+

-a A

2843+

-b B

2844+

-c C

2845+

-d D

2846+

-e E

2847+

-f F

2848+

'''

2849+
2850+

# We are only interested in testing the behavior of format_usage().

2851+

test_failures_when_not_required = None

2852+

test_failures_when_required = None

2853+

test_successes_when_not_required = None

2854+

test_successes_when_required = None

2855+
28162856

# =================================================

28172857

# Mutually exclusive group in parent parser tests

28182858

# =================================================

Original file line numberDiff line numberDiff line change

@@ -0,0 +1,2 @@

1+

Fixed :meth:`argparse.ArgumentParser.format_usage` for mutually exclusive groups.

2+

Patch by Andrew Nester.