Skip to content

Commit

Permalink
Don't trim last empty line in docstrings (#9813)
Browse files Browse the repository at this point in the history
  • Loading branch information
MichaReiser authored Feb 5, 2024
1 parent 55d0e11 commit 80fc02e
Show file tree
Hide file tree
Showing 3 changed files with 186 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -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
"""
8 changes: 6 additions & 2 deletions crates/ruff_python_formatter/src/string/docstring.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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},
Expand Down Expand Up @@ -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])?;
Expand Down Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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
"""
```



0 comments on commit 80fc02e

Please sign in to comment.