From 907a493cfdf6a388fba4ad03f333666f855233a6 Mon Sep 17 00:00:00 2001 From: "utkarsh.arya@zomato.com" Date: Sat, 15 Nov 2025 22:58:00 +0000 Subject: [PATCH] Fix docstring trimming for non-empty first lines Allow trim_docstring to handle docstrings where the text starts on the first line, preventing rendering errors in admindoc. Adds tests for single-line and non-empty first-line docstrings. --- django/contrib/admindocs/utils.py | 4 +++- tests/admin_docs/test_utils.py | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/django/contrib/admindocs/utils.py b/django/contrib/admindocs/utils.py index 4c0e7e2a56..ad190b60ca 100644 --- a/django/contrib/admindocs/utils.py +++ b/django/contrib/admindocs/utils.py @@ -34,7 +34,9 @@ def trim_docstring(docstring): return '' # Convert tabs to spaces and split into lines lines = docstring.expandtabs().splitlines() - indent = min(len(line) - len(line.lstrip()) for line in lines if line.lstrip()) + # Determine indentation from all lines except the first (PEP 257) + indent_lines = [line for line in lines[1:] if line.lstrip()] + indent = min(len(line) - len(line.lstrip()) for line in indent_lines) if indent_lines else 0 trimmed = [lines[0].lstrip()] + [line[indent:].rstrip() for line in lines[1:]] return "\n".join(trimmed).strip() diff --git a/tests/admin_docs/test_utils.py b/tests/admin_docs/test_utils.py index 17ea912015..29d932cc3d 100644 --- a/tests/admin_docs/test_utils.py +++ b/tests/admin_docs/test_utils.py @@ -44,6 +44,23 @@ class TestUtils(AdminDocsSimpleTestCase): ) self.assertEqual(trim_docstring_output, trimmed_docstring) + def test_trim_docstring_first_line_not_empty(self): + """ + Test trim_docstring with docstrings where text starts on the first line. + This is a common docstring style and should not cause errors. + """ + docstring = """test tests something. + This is the second line. + """ + expected = "test tests something.\nThis is the second line." + self.assertEqual(trim_docstring(docstring), expected) + + def test_trim_docstring_single_line(self): + """Test trim_docstring with a single-line docstring.""" + docstring = """Single line docstring.""" + expected = "Single line docstring." + self.assertEqual(trim_docstring(docstring), expected) + def test_parse_docstring(self): title, description, metadata = parse_docstring(self.docstring) docstring_title = (