mirror of
https://github.com/astral-sh/ruff.git
synced 2025-07-24 05:26:23 +00:00
Prototype Black's string joining/splitting (#4449)
This commit is contained in:
parent
e5101e8eac
commit
ddf7de7e86
2 changed files with 83 additions and 1 deletions
|
@ -64,9 +64,11 @@ mod tests {
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use similar::TextDiff;
|
use insta::assert_snapshot;
|
||||||
|
|
||||||
use ruff_testing_macros::fixture;
|
use ruff_testing_macros::fixture;
|
||||||
|
use ruff_text_size::TextSize;
|
||||||
|
use similar::TextDiff;
|
||||||
|
|
||||||
use crate::fmt;
|
use crate::fmt;
|
||||||
|
|
||||||
|
@ -176,6 +178,77 @@ mod tests {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn string_processing() {
|
||||||
|
use ruff_formatter::prelude::*;
|
||||||
|
use ruff_formatter::{format, format_args, write};
|
||||||
|
|
||||||
|
struct FormatString<'a>(&'a str);
|
||||||
|
|
||||||
|
impl Format<SimpleFormatContext> for FormatString<'_> {
|
||||||
|
fn fmt(
|
||||||
|
&self,
|
||||||
|
f: &mut ruff_formatter::formatter::Formatter<SimpleFormatContext>,
|
||||||
|
) -> FormatResult<()> {
|
||||||
|
let format_str = format_with(|f| {
|
||||||
|
write!(f, [text("\"")])?;
|
||||||
|
|
||||||
|
let mut words = self.0.split_whitespace().peekable();
|
||||||
|
let mut fill = f.fill();
|
||||||
|
|
||||||
|
let separator = format_with(|f| {
|
||||||
|
group(&format_args![
|
||||||
|
if_group_breaks(&text("\"")),
|
||||||
|
soft_line_break_or_space(),
|
||||||
|
if_group_breaks(&text("\" "))
|
||||||
|
])
|
||||||
|
.fmt(f)
|
||||||
|
});
|
||||||
|
|
||||||
|
while let Some(word) = words.next() {
|
||||||
|
let is_last = words.peek().is_none();
|
||||||
|
let format_word = format_with(|f| {
|
||||||
|
write!(f, [dynamic_text(word, TextSize::default())])?;
|
||||||
|
|
||||||
|
if is_last {
|
||||||
|
write!(f, [text("\"")])?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
});
|
||||||
|
|
||||||
|
fill.entry(&separator, &format_word);
|
||||||
|
}
|
||||||
|
|
||||||
|
fill.finish()
|
||||||
|
});
|
||||||
|
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
[group(&format_args![
|
||||||
|
if_group_breaks(&text("(")),
|
||||||
|
soft_block_indent(&format_str),
|
||||||
|
if_group_breaks(&text(")"))
|
||||||
|
])]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 77 after g group (leading quote)
|
||||||
|
let fits =
|
||||||
|
r#"aaaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd eeeeeeeeee ffffffffff gggggggggg h"#;
|
||||||
|
let breaks =
|
||||||
|
r#"aaaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd eeeeeeeeee ffffffffff gggggggggg hh"#;
|
||||||
|
|
||||||
|
let output = format!(
|
||||||
|
SimpleFormatContext::default(),
|
||||||
|
[FormatString(fits), hard_line_break(), FormatString(breaks)]
|
||||||
|
)
|
||||||
|
.expect("Formatting to succeed");
|
||||||
|
|
||||||
|
assert_snapshot!(output.print().expect("Printing to succeed").as_code());
|
||||||
|
}
|
||||||
|
|
||||||
struct Header<'a> {
|
struct Header<'a> {
|
||||||
title: &'a str,
|
title: &'a str,
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_formatter/src/lib.rs
|
||||||
|
expression: "output.print().expect(\"Printing to succeed\").as_code()"
|
||||||
|
---
|
||||||
|
"aaaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd eeeeeeeeee ffffffffff gggggggggg h"
|
||||||
|
(
|
||||||
|
"aaaaaaaaaa bbbbbbbbbb cccccccccc dddddddddd eeeeeeeeee ffffffffff gggggggggg"
|
||||||
|
" hh"
|
||||||
|
)
|
Loading…
Add table
Add a link
Reference in a new issue