gh-150285: Wrap long single-line summary in text output in pydoc (GH-151081)

This commit is contained in:
Serhiy Storchaka
2026-06-10 13:44:35 +03:00
committed by GitHub
parent ca32ebf793
commit 16f71bda3f
4 changed files with 111 additions and 1 deletions
+16 -1
View File
@@ -1240,6 +1240,17 @@ class TextDoc(Doc):
lines = [(prefix + line).rstrip() for line in text.split('\n')]
return '\n'.join(lines)
def _format_doc(self, text, width=68):
"""Wraps the single-line summary if it is too long."""
if not text: return ''
lines = text.split('\n', 2)
if len(lines) > 1 and lines[1]:
return text
lines[:1] = textwrap.wrap(lines[0], width,
break_long_words=False,
break_on_hyphens=False)
return '\n'.join(lines)
def section(self, title, contents):
"""Format a section with a given heading."""
clean_contents = self.indent(contents).rstrip()
@@ -1390,6 +1401,7 @@ location listed above.
doc = getdoc(object)
if doc:
doc = self._format_doc(doc)
push(doc + '\n')
# List the mro, if non-trivial.
@@ -1590,6 +1602,7 @@ location listed above.
return decl + '\n'
else:
doc = getdoc(object) or ''
doc = self._format_doc(doc)
return decl + '\n' + (doc and self.indent(doc).rstrip() + '\n')
def docdata(self, object, name=None, mod=None, cl=None, *ignored):
@@ -1602,6 +1615,7 @@ location listed above.
push('\n')
doc = getdoc(object) or ''
if doc:
doc = self._format_doc(doc)
push(self.indent(doc))
push('\n')
return ''.join(results)
@@ -1620,7 +1634,8 @@ location listed above.
if not doc:
doc = getdoc(object)
if doc:
line += '\n' + self.indent(str(doc)) + '\n'
doc = self._format_doc(str(doc))
line += '\n' + self.indent(doc) + '\n'
return line
class _PlainTextDoc(TextDoc):
+29
View File
@@ -0,0 +1,29 @@
class C:
"""This is a class summary that consists of a very long single line, exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
"""
def meth(self):
"""This is a method summary that consists of a very long single line, exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
"""
@property
def prop(self):
"""This is a property summary that consists of a very long single line, exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
"""
def func(self):
"""This is a function summary that consists of a very long single line, exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
"""
data = C()
data.__doc__ = """This is a data summary that consists of a very long single line, exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
"""
+65
View File
@@ -1245,6 +1245,71 @@ function_with_really_long_name_so_annotations_can_be_rather_small(
<lambda> lambda very_long_parameter_name_that_should_not_fit_into_a_single_line, second_very_long_parameter_name
''' % __name__)
@requires_docstrings
def test_long_summaries(self):
from . import longsummary
doc = pydoc.render_doc(longsummary)
doc = clean_text(doc)
self.assertEqual(doc, '''Python Library Documentation: module test.test_pydoc.longsummary in test.test_pydoc
NAME
test.test_pydoc.longsummary
CLASSES
builtins.object
C
class C(builtins.object)
| This is a class summary that consists of a very long single line,
| exceeding the recommended PEP 8 limit.
|
| The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
|
| Methods defined here:
|
| meth(self)
| This is a method summary that consists of a very long single line,
| exceeding the recommended PEP 8 limit.
|
| The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
|
| ----------------------------------------------------------------------
| Readonly properties defined here:
|
| prop
| This is a property summary that consists of a very long single line,
| exceeding the recommended PEP 8 limit.
|
| The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables
|
| __weakref__
| list of weak references to the object
FUNCTIONS
func(self)
This is a function summary that consists of a very long single line,
exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
DATA
data = <test.test_pydoc.longsummary.C object>
This is a data summary that consists of a very long single line,
exceeding the recommended PEP 8 limit.
The rest of the docstring body, separated from the summary by a blank line, can also contain very long lines.
FILE
%s
''' % inspect.getabsfile(longsummary))
def test__future__imports(self):
# __future__ features are excluded from module help,
# except when it's the __future__ module itself
@@ -0,0 +1 @@
:mod:`pydoc` now wraps long single-line summary in text output.