@@ -42,13 +42,13 @@ optional-dependencies.dev = [
4242 " deptry==0.24.0" ,
4343 " doc8==2.0.0" ,
4444 " doccmd==2026.1.22.1" ,
45- " docformatter==1.7.7" ,
4645 " freezegun==1.5.5" ,
4746 " furo==2025.12.19" ,
4847 " interrogate==1.7.0" ,
4948 " mypy[faster-cache]==1.19.1" ,
5049 " mypy-strict-kwargs==2026.1.12" ,
5150 " prek==0.3.0" ,
51+ " pydocstringformatter==0.7.3" ,
5252 " pydocstyle==6.3" ,
5353 " pygments==2.19.2" ,
5454 " pylint[spelling]==4.0.4" ,
@@ -119,8 +119,8 @@ lint.select = [
119119lint.ignore = [
120120 # Ruff warns that this conflicts with the formatter.
121121 " COM812" ,
122- # Allow our chosen docstring line-style - no one-line summary.
123- " D200 " ,
122+ # Allow our chosen docstring line-style - pydocstringformatter handles formatting
123+ # but doesn't enforce D205 (blank line after summary) or D212 (summary on first line).
124124 " D205" ,
125125 " D212" ,
126126 # Ruff warns that this conflicts with the formatter.
@@ -274,9 +274,6 @@ spelling-private-dict-file = 'spelling_private_dict.txt'
274274# --spelling-private-dict-file option instead of raising a message.
275275spelling-store-unknown-words = ' no'
276276
277- [tool .docformatter ]
278- make-summary-multi-line = true
279-
280277[tool .check-manifest ]
281278
282279ignore = [
@@ -346,6 +343,15 @@ enableTypeIgnoreComments = false
346343reportUnnecessaryTypeIgnoreComment = true
347344typeCheckingMode = " strict"
348345
346+ [tool .pydocstringformatter ]
347+ write = true
348+ split-summary-body = false
349+ # Use a lower line length than ruff (79) to avoid conflicts with D200 -
350+ # pydocstringformatter would otherwise split docstrings at exactly 79 chars
351+ # which ruff considers should stay on one line.
352+ max-line-length = 75
353+ linewrap-full-docstring = true
354+
349355[tool .interrogate ]
350356fail-under = 100
351357omit-covered-files = true
0 commit comments