Don't trim last empty line in docstrings (#9813)

This commit is contained in:
Micha Reiser 2024-02-05 14:29:24 +01:00 committed by GitHub
parent 55d0e1148c
commit 80fc02e7d5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 186 additions and 2 deletions

View file

@ -0,0 +1,55 @@
# Tests that Ruff correctly preserves newlines before the closing quote
def test():
"""a, b
c"""
def test2():
"""a, b
c
"""
def test3():
"""a, b
"""
def test4():
"""
a, b
"""
def test5():
"""
a, b
a"""
def test6():
"""
a, b
c
"""
def test7():
"""
a, b
"""
def test7():
"""
a, b
"""

View file

@ -6,6 +6,7 @@ use std::{borrow::Cow, collections::VecDeque};
use ruff_formatter::printer::SourceMapGeneration;
use ruff_python_parser::ParseError;
use {once_cell::sync::Lazy, regex::Regex};
use {
ruff_formatter::{write, FormatOptions, IndentStyle, LineWidth, Printed},
@ -114,7 +115,10 @@ pub(crate) fn format(normalized: &NormalizedString, f: &mut PyFormatter) -> Form
// is_borrowed is unstable :/
let already_normalized = matches!(docstring, Cow::Borrowed(_));
let mut lines = docstring.lines().peekable();
// Use `split` instead of `lines` to preserve the closing quotes on their own line
// if they have no indentation (in which case the last line is `\n` which
// `lines` omit for the last element).
let mut lines = docstring.split('\n').peekable();
// Start the string
write!(f, [normalized.prefix, normalized.quotes])?;
@ -259,7 +263,7 @@ impl<'ast, 'buf, 'fmt, 'src> DocstringLinePrinter<'ast, 'buf, 'fmt, 'src> {
/// iterator given contains all lines except for the first.
fn add_iter(
&mut self,
mut lines: std::iter::Peekable<std::str::Lines<'src>>,
mut lines: std::iter::Peekable<std::str::Split<'src, char>>,
) -> FormatResult<()> {
while let Some(line) = lines.next() {
let line = InputDocstringLine {

View file

@ -0,0 +1,125 @@
---
source: crates/ruff_python_formatter/tests/fixtures.rs
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring_newlines.py
---
## Input
```python
# Tests that Ruff correctly preserves newlines before the closing quote
def test():
"""a, b
c"""
def test2():
"""a, b
c
"""
def test3():
"""a, b
"""
def test4():
"""
a, b
"""
def test5():
"""
a, b
a"""
def test6():
"""
a, b
c
"""
def test7():
"""
a, b
"""
def test7():
"""
a, b
"""
```
## Output
```python
# Tests that Ruff correctly preserves newlines before the closing quote
def test():
"""a, b
c"""
def test2():
"""a, b
c
"""
def test3():
"""a, b"""
def test4():
"""
a, b
"""
def test5():
"""
a, b
a"""
def test6():
"""
a, b
c
"""
def test7():
"""
a, b
"""
def test7():
"""
a, b
"""
```