Skip to content

Commit

Permalink
gh-104683: Argument Clinic: Params now render their own docstrings (#…
Browse files Browse the repository at this point in the history
…107790)

Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
  • Loading branch information
erlend-aasland and AlexWaygood committed Aug 9, 2023
1 parent 65ce365 commit 1b3f5f2
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 18 deletions.
12 changes: 10 additions & 2 deletions Lib/test/test_clinic.py
Expand Up @@ -833,8 +833,8 @@ def expect_failure(self, block, err, *, filename=None, lineno=None):

def checkDocstring(self, fn, expected):
self.assertTrue(hasattr(fn, "docstring"))
self.assertEqual(fn.docstring.strip(),
dedent(expected).strip())
self.assertEqual(dedent(expected).strip(),
fn.docstring.strip())

def test_trivial(self):
parser = DSLParser(_make_clinic())
Expand Down Expand Up @@ -997,8 +997,12 @@ def test_function_docstring(self):
path: str
Path to be examined
Ensure that multiple lines are indented correctly.
Perform a stat system call on the given path.
Ensure that multiple lines are indented correctly.
Ensure that multiple lines are indented correctly.
""")
self.checkDocstring(function, """
stat($module, /, path)
Expand All @@ -1008,6 +1012,10 @@ def test_function_docstring(self):
path
Path to be examined
Ensure that multiple lines are indented correctly.
Ensure that multiple lines are indented correctly.
Ensure that multiple lines are indented correctly.
""")

def test_docstring_trailing_whitespace(self):
Expand Down
27 changes: 11 additions & 16 deletions Tools/clinic/clinic.py
Expand Up @@ -2775,6 +2775,13 @@ def get_displayname(self, i: int) -> str:
else:
return f'"argument {i}"'

def render_docstring(self) -> str:
add, out = text_accumulator()
add(f" {self.name}\n")
for line in self.docstring.split("\n"):
add(f" {line}\n")
return out().rstrip()


CConverterClassT = TypeVar("CConverterClassT", bound=type["CConverter"])

Expand Down Expand Up @@ -5686,23 +5693,11 @@ def add_parameter(text: str) -> None:
@staticmethod
def format_docstring_parameters(params: list[Parameter]) -> str:
"""Create substitution text for {parameters}"""
text, add, output = _text_accumulator()
spacer_line = False
for param in params:
docstring = param.docstring.strip()
if not docstring:
continue
if spacer_line:
add, output = text_accumulator()
for p in params:
if p.docstring:
add(p.render_docstring())
add('\n')
else:
spacer_line = True
add(" ")
add(param.name)
add('\n')
stripped = rstrip_lines(docstring)
add(textwrap.indent(stripped, " "))
if text:
add('\n')
return output()

def format_docstring(self) -> str:
Expand Down

0 comments on commit 1b3f5f2

Please sign in to comment.