Skip to content

Commit

Permalink
pythonGH-87041: Fix incorrect indentation in argparse help (pythonGH-…
Browse files Browse the repository at this point in the history
…124230)

In case of usage a long command along with max_help_position more than
the length of the command, the command's help was incorrectly started
on the new line.

Co-authored-by: Pavel Ditenbir <pavel.ditenbir@gmail.com>
  • Loading branch information
savannahostrowski and DiPaolo authored Sep 23, 2024
1 parent 9e55a02 commit 7ee9921
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 4 deletions.
7 changes: 3 additions & 4 deletions Lib/argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -261,13 +261,12 @@ def add_argument(self, action):

# find all invocations
get_invocation = self._format_action_invocation
invocations = [get_invocation(action)]
invocation_lengths = [len(get_invocation(action)) + self._current_indent]
for subaction in self._iter_indented_subactions(action):
invocations.append(get_invocation(subaction))
invocation_lengths.append(len(get_invocation(subaction)) + self._current_indent)

# update the maximum item length
invocation_length = max(map(len, invocations))
action_length = invocation_length + self._current_indent
action_length = max(invocation_lengths)
self._action_max_length = max(self._action_max_length,
action_length)

Expand Down
40 changes: 40 additions & 0 deletions Lib/test/test_argparse.py
Original file line number Diff line number Diff line change
Expand Up @@ -4960,6 +4960,46 @@ def custom_type(string):
version = ''


class TestHelpUsageLongSubparserCommand(TestCase):
"""Test that subparser commands are formatted correctly in help"""
maxDiff = None

def test_parent_help(self):
def custom_formatter(prog):
return argparse.RawTextHelpFormatter(prog, max_help_position=50)

parent_parser = argparse.ArgumentParser(
prog='PROG',
formatter_class=custom_formatter
)

cmd_subparsers = parent_parser.add_subparsers(title="commands",
metavar='CMD',
help='command to use')
cmd_subparsers.add_parser("add",
help="add something")

cmd_subparsers.add_parser("remove",
help="remove something")

cmd_subparsers.add_parser("a-very-long-command",
help="command that does something")

parser_help = parent_parser.format_help()
self.assertEqual(parser_help, textwrap.dedent('''\
usage: PROG [-h] CMD ...
options:
-h, --help show this help message and exit
commands:
CMD command to use
add add something
remove remove something
a-very-long-command command that does something
'''))


# =====================================
# Optional/Positional constructor tests
# =====================================
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a bug in :mod:`argparse` where lengthy subparser argument help is incorrectly indented.

0 comments on commit 7ee9921

Please sign in to comment.