Skip to content

Commit

Permalink
pythongh-121151: argparse: Fix wrapping of long usage text of argumen…
Browse files Browse the repository at this point in the history
…ts inside a mutually exclusive groups (pythonGH-121159)
  • Loading branch information
hamdanal committed Aug 7, 2024
1 parent 9e551f9 commit 013a092
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 7 deletions.
15 changes: 12 additions & 3 deletions Lib/argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -447,15 +447,24 @@ def _get_actions_usage_parts(self, actions, groups):
parts.append(part)

# group mutually exclusive actions
inserted_separators_indices = set()
for start, end in sorted(inserts, reverse=True):
group = inserts[start, end]
group_parts = [item for item in parts[start:end] if item is not None]
group_size = len(group_parts)
if group.required:
open, close = "()" if len(group_parts) > 1 else ("", "")
open, close = "()" if group_size > 1 else ("", "")
else:
open, close = "[]"
parts[start] = open + " | ".join(group_parts) + close
for i in range(start + 1, end):
group_parts[0] = open + group_parts[0]
group_parts[-1] = group_parts[-1] + close
for i, part in enumerate(group_parts[:-1], start=start):
# insert a separator if not already done in a nested group
if i not in inserted_separators_indices:
parts[i] = part + ' |'
inserted_separators_indices.add(i)
parts[start + group_size - 1] = group_parts[-1]
for i in range(start + group_size, end):
parts[i] = None

# return the usage parts
Expand Down
26 changes: 22 additions & 4 deletions Lib/test/test_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -2959,12 +2959,12 @@ def get_parser(self, required=None):
]

usage_when_not_required = '''\
usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
[--klmno KLMNO | --pqrst PQRST]
usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ] [--klmno KLMNO |
--pqrst PQRST]
'''
usage_when_required = '''\
usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ]
(--klmno KLMNO | --pqrst PQRST)
usage: PROG [-h] [--abcde ABCDE] [--fghij FGHIJ] (--klmno KLMNO |
--pqrst PQRST)
'''
help = '''\
Expand Down Expand Up @@ -4347,6 +4347,24 @@ def test_nested_mutex_groups(self):
''')
self.assertEqual(parser.format_usage(), usage)

def test_long_mutex_groups_wrap(self):
parser = argparse.ArgumentParser(prog='PROG')
g = parser.add_mutually_exclusive_group()
g.add_argument('--op1', metavar='MET', nargs='?')
g.add_argument('--op2', metavar=('MET1', 'MET2'), nargs='*')
g.add_argument('--op3', nargs='*')
g.add_argument('--op4', metavar=('MET1', 'MET2'), nargs='+')
g.add_argument('--op5', nargs='+')
g.add_argument('--op6', nargs=3)
g.add_argument('--op7', metavar=('MET1', 'MET2', 'MET3'), nargs=3)

usage = textwrap.dedent('''\
usage: PROG [-h] [--op1 [MET] | --op2 [MET1 [MET2 ...]] | --op3 [OP3 ...] |
--op4 MET1 [MET2 ...] | --op5 OP5 [OP5 ...] | --op6 OP6 OP6 OP6 |
--op7 MET1 MET2 MET3]
''')
self.assertEqual(parser.format_usage(), usage)


class TestHelpVariableExpansion(HelpTestCase):
"""Test that variables are expanded properly in help messages"""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix wrapping of long usage text of arguments inside a mutually exclusive
group in :mod:`argparse`.

0 comments on commit 013a092

Please sign in to comment.