mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-03 02:13:08 +00:00
Don't trim last empty line in docstrings (#9813)
This commit is contained in:
parent
55d0e1148c
commit
80fc02e7d5
3 changed files with 186 additions and 2 deletions
55
crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring_newlines.py
vendored
Normal file
55
crates/ruff_python_formatter/resources/test/fixtures/ruff/docstring_newlines.py
vendored
Normal 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
|
@ -6,6 +6,7 @@ use std::{borrow::Cow, collections::VecDeque};
|
||||||
|
|
||||||
use ruff_formatter::printer::SourceMapGeneration;
|
use ruff_formatter::printer::SourceMapGeneration;
|
||||||
use ruff_python_parser::ParseError;
|
use ruff_python_parser::ParseError;
|
||||||
|
|
||||||
use {once_cell::sync::Lazy, regex::Regex};
|
use {once_cell::sync::Lazy, regex::Regex};
|
||||||
use {
|
use {
|
||||||
ruff_formatter::{write, FormatOptions, IndentStyle, LineWidth, Printed},
|
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 :/
|
// is_borrowed is unstable :/
|
||||||
let already_normalized = matches!(docstring, Cow::Borrowed(_));
|
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
|
// Start the string
|
||||||
write!(f, [normalized.prefix, normalized.quotes])?;
|
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.
|
/// iterator given contains all lines except for the first.
|
||||||
fn add_iter(
|
fn add_iter(
|
||||||
&mut self,
|
&mut self,
|
||||||
mut lines: std::iter::Peekable<std::str::Lines<'src>>,
|
mut lines: std::iter::Peekable<std::str::Split<'src, char>>,
|
||||||
) -> FormatResult<()> {
|
) -> FormatResult<()> {
|
||||||
while let Some(line) = lines.next() {
|
while let Some(line) = lines.next() {
|
||||||
let line = InputDocstringLine {
|
let line = InputDocstringLine {
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue