mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-17 15:55:23 +00:00
Add tests for skip magic trailing comma
<!-- Thank you for contributing to Ruff! To help us out with reviewing, please consider the following: - Does this pull request include a summary of the change? (See below.) - Does this pull request include a descriptive title? - Does this pull request include references to any relevant issues? --> ## Summary This PR adds tests that verify that the magic trailing comma is not respected if disabled in the formatter options. Our test setup now allows to create a `<fixture-name>.options.json` file that contains an array of configurations that should be tested. <!-- What's the purpose of the change? What does it do, and why? --> ## Test Plan It's all about tests :) <!-- How was it tested? -->
This commit is contained in:
parent
dd0d1afb66
commit
f18a1f70de
27 changed files with 268 additions and 79 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -2065,8 +2065,9 @@ dependencies = [
|
||||||
"ruff_text_size",
|
"ruff_text_size",
|
||||||
"rustc-hash",
|
"rustc-hash",
|
||||||
"rustpython-parser",
|
"rustpython-parser",
|
||||||
|
"serde",
|
||||||
|
"serde_json",
|
||||||
"similar",
|
"similar",
|
||||||
"test-case",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -59,10 +59,8 @@ use std::num::ParseIntError;
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Clone, Copy, Hash)]
|
#[derive(Debug, Eq, PartialEq, Clone, Copy, Hash)]
|
||||||
#[cfg_attr(
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
feature = "serde",
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
derive(serde::Serialize, serde::Deserialize, schemars::JsonSchema)
|
|
||||||
)]
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub enum IndentStyle {
|
pub enum IndentStyle {
|
||||||
/// Tab
|
/// Tab
|
||||||
|
@ -112,10 +110,8 @@ impl std::fmt::Display for IndentStyle {
|
||||||
///
|
///
|
||||||
/// The allowed range of values is 1..=320
|
/// The allowed range of values is 1..=320
|
||||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
#[cfg_attr(
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
feature = "serde",
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
derive(serde::Serialize, serde::Deserialize, schemars::JsonSchema)
|
|
||||||
)]
|
|
||||||
pub struct LineWidth(u16);
|
pub struct LineWidth(u16);
|
||||||
|
|
||||||
impl LineWidth {
|
impl LineWidth {
|
||||||
|
@ -278,10 +274,8 @@ impl FormatOptions for SimpleFormatOptions {
|
||||||
|
|
||||||
/// Lightweight sourcemap marker between source and output tokens
|
/// Lightweight sourcemap marker between source and output tokens
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
#[cfg_attr(
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
feature = "serde",
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
derive(serde::Serialize, serde::Deserialize, schemars::JsonSchema)
|
|
||||||
)]
|
|
||||||
pub struct SourceMarker {
|
pub struct SourceMarker {
|
||||||
/// Position of the marker in the original source
|
/// Position of the marker in the original source
|
||||||
pub source: TextSize,
|
pub source: TextSize,
|
||||||
|
@ -340,10 +334,8 @@ where
|
||||||
pub type PrintResult<T> = Result<T, PrintError>;
|
pub type PrintResult<T> = Result<T, PrintError>;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Eq, PartialEq)]
|
#[derive(Debug, Clone, Eq, PartialEq)]
|
||||||
#[cfg_attr(
|
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
|
||||||
feature = "serde",
|
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
|
||||||
derive(serde::Serialize, serde::Deserialize, schemars::JsonSchema)
|
|
||||||
)]
|
|
||||||
pub struct Printed {
|
pub struct Printed {
|
||||||
code: String,
|
code: String,
|
||||||
range: Option<TextRange>,
|
range: Option<TextRange>,
|
||||||
|
|
|
@ -25,8 +25,23 @@ itertools = { workspace = true }
|
||||||
once_cell = { workspace = true }
|
once_cell = { workspace = true }
|
||||||
rustc-hash = { workspace = true }
|
rustc-hash = { workspace = true }
|
||||||
rustpython-parser = { workspace = true }
|
rustpython-parser = { workspace = true }
|
||||||
|
serde = { workspace = true, optional = true }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
ruff_formatter = { path = "../ruff_formatter", features = ["serde"]}
|
||||||
|
|
||||||
insta = { workspace = true, features = ["glob"] }
|
insta = { workspace = true, features = ["glob"] }
|
||||||
test-case = { workspace = true }
|
serde = { workspace = true }
|
||||||
|
serde_json = { workspace = true }
|
||||||
similar = { workspace = true }
|
similar = { workspace = true }
|
||||||
|
|
||||||
|
[[test]]
|
||||||
|
name = "ruff_python_formatter_fixtures"
|
||||||
|
path = "tests/fixtures.rs"
|
||||||
|
test = true
|
||||||
|
required-features = [ "serde" ]
|
||||||
|
|
||||||
|
|
||||||
|
[features]
|
||||||
|
serde = ["dep:serde", "ruff_formatter/serde"]
|
||||||
|
default = ["serde"]
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"magic_trailing_comma": "respect"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"magic_trailing_comma": "ignore"
|
||||||
|
}
|
||||||
|
]
|
22
crates/ruff_python_formatter/resources/test/fixtures/ruff/skip_magic_trailing_comma.py
vendored
Normal file
22
crates/ruff_python_formatter/resources/test/fixtures/ruff/skip_magic_trailing_comma.py
vendored
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"last with trailing comma",
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"last without trailing comma"
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"third entry",
|
||||||
|
"fourth entry",
|
||||||
|
"fifth entry",
|
||||||
|
"sixt entry",
|
||||||
|
"seventh entry",
|
||||||
|
"eigth entry",
|
||||||
|
)
|
|
@ -220,7 +220,7 @@ impl<'fmt, 'ast, 'buf> JoinCommaSeparatedBuilder<'fmt, 'ast, 'buf> {
|
||||||
if let Some(last_end) = self.last_end.take() {
|
if let Some(last_end) = self.last_end.take() {
|
||||||
if_group_breaks(&text(",")).fmt(self.fmt)?;
|
if_group_breaks(&text(",")).fmt(self.fmt)?;
|
||||||
|
|
||||||
if self.fmt.options().magic_trailing_comma().is_preserve()
|
if self.fmt.options().magic_trailing_comma().is_respect()
|
||||||
&& matches!(
|
&& matches!(
|
||||||
first_non_trivia_token(last_end, self.fmt.context().contents()),
|
first_non_trivia_token(last_end, self.fmt.context().contents()),
|
||||||
Some(Token {
|
Some(Token {
|
||||||
|
|
|
@ -2,6 +2,11 @@ use ruff_formatter::printer::{LineEnding, PrinterOptions};
|
||||||
use ruff_formatter::{FormatOptions, IndentStyle, LineWidth};
|
use ruff_formatter::{FormatOptions, IndentStyle, LineWidth};
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde::Serialize, serde::Deserialize),
|
||||||
|
serde(default)
|
||||||
|
)]
|
||||||
pub struct PyFormatOptions {
|
pub struct PyFormatOptions {
|
||||||
/// Specifies the indent style:
|
/// Specifies the indent style:
|
||||||
/// * Either a tab
|
/// * Either a tab
|
||||||
|
@ -9,6 +14,7 @@ pub struct PyFormatOptions {
|
||||||
indent_style: IndentStyle,
|
indent_style: IndentStyle,
|
||||||
|
|
||||||
/// The preferred line width at which the formatter should wrap lines.
|
/// The preferred line width at which the formatter should wrap lines.
|
||||||
|
#[cfg_attr(feature = "serde", serde(default = "default_line_width"))]
|
||||||
line_width: LineWidth,
|
line_width: LineWidth,
|
||||||
|
|
||||||
/// The preferred quote style to use (single vs double quotes).
|
/// The preferred quote style to use (single vs double quotes).
|
||||||
|
@ -18,6 +24,10 @@ pub struct PyFormatOptions {
|
||||||
magic_trailing_comma: MagicTrailingComma,
|
magic_trailing_comma: MagicTrailingComma,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn default_line_width() -> LineWidth {
|
||||||
|
LineWidth::try_from(88).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
impl PyFormatOptions {
|
impl PyFormatOptions {
|
||||||
pub fn magic_trailing_comma(&self) -> MagicTrailingComma {
|
pub fn magic_trailing_comma(&self) -> MagicTrailingComma {
|
||||||
self.magic_trailing_comma
|
self.magic_trailing_comma
|
||||||
|
@ -36,6 +46,16 @@ impl PyFormatOptions {
|
||||||
self.magic_trailing_comma = trailing_comma;
|
self.magic_trailing_comma = trailing_comma;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn with_indent_style(&mut self, indent_style: IndentStyle) -> &mut Self {
|
||||||
|
self.indent_style = indent_style;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn with_line_width(&mut self, line_width: LineWidth) -> &mut Self {
|
||||||
|
self.line_width = line_width;
|
||||||
|
self
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl FormatOptions for PyFormatOptions {
|
impl FormatOptions for PyFormatOptions {
|
||||||
|
@ -69,6 +89,11 @@ impl Default for PyFormatOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
|
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde::Serialize, serde::Deserialize),
|
||||||
|
serde(rename_all = "kebab-case")
|
||||||
|
)]
|
||||||
pub enum QuoteStyle {
|
pub enum QuoteStyle {
|
||||||
Single,
|
Single,
|
||||||
#[default]
|
#[default]
|
||||||
|
@ -105,14 +130,19 @@ impl TryFrom<char> for QuoteStyle {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Default)]
|
#[derive(Copy, Clone, Debug, Default)]
|
||||||
|
#[cfg_attr(
|
||||||
|
feature = "serde",
|
||||||
|
derive(serde::Serialize, serde::Deserialize),
|
||||||
|
serde(rename_all = "kebab-case")
|
||||||
|
)]
|
||||||
pub enum MagicTrailingComma {
|
pub enum MagicTrailingComma {
|
||||||
#[default]
|
#[default]
|
||||||
Preserve,
|
Respect,
|
||||||
Skip,
|
Ignore,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl MagicTrailingComma {
|
impl MagicTrailingComma {
|
||||||
pub const fn is_preserve(self) -> bool {
|
pub const fn is_respect(self) -> bool {
|
||||||
matches!(self, Self::Preserve)
|
matches!(self, Self::Respect)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,18 @@
|
||||||
|
use ruff_formatter::FormatOptions;
|
||||||
use ruff_python_formatter::{format_module, PyFormatOptions};
|
use ruff_python_formatter::{format_module, PyFormatOptions};
|
||||||
use similar::TextDiff;
|
use similar::TextDiff;
|
||||||
use std::fmt::{Formatter, Write};
|
use std::fmt::{Formatter, Write};
|
||||||
use std::fs;
|
use std::io::BufReader;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::{fmt, fs};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn black_compatibility() {
|
fn black_compatibility() {
|
||||||
let test_file = |input_path: &Path| {
|
let test_file = |input_path: &Path| {
|
||||||
let content = fs::read_to_string(input_path).unwrap();
|
let content = fs::read_to_string(input_path).unwrap();
|
||||||
|
|
||||||
let printed =
|
let options = PyFormatOptions::default();
|
||||||
format_module(&content, PyFormatOptions::default()).expect("Formatting to succeed");
|
let printed = format_module(&content, options.clone()).expect("Formatting to succeed");
|
||||||
|
|
||||||
let expected_path = input_path.with_extension("py.expect");
|
let expected_path = input_path.with_extension("py.expect");
|
||||||
let expected_output = fs::read_to_string(&expected_path)
|
let expected_output = fs::read_to_string(&expected_path)
|
||||||
|
@ -18,7 +20,7 @@ fn black_compatibility() {
|
||||||
|
|
||||||
let formatted_code = printed.as_code();
|
let formatted_code = printed.as_code();
|
||||||
|
|
||||||
ensure_stability_when_formatting_twice(formatted_code);
|
ensure_stability_when_formatting_twice(formatted_code, options);
|
||||||
|
|
||||||
if formatted_code == expected_output {
|
if formatted_code == expected_output {
|
||||||
// Black and Ruff formatting matches. Delete any existing snapshot files because the Black output
|
// Black and Ruff formatting matches. Delete any existing snapshot files because the Black output
|
||||||
|
@ -66,7 +68,7 @@ fn black_compatibility() {
|
||||||
write!(snapshot, "{}", CodeFrame::new("diff", &diff)).unwrap();
|
write!(snapshot, "{}", CodeFrame::new("diff", &diff)).unwrap();
|
||||||
|
|
||||||
write!(snapshot, "{}", Header::new("Ruff Output")).unwrap();
|
write!(snapshot, "{}", Header::new("Ruff Output")).unwrap();
|
||||||
write!(snapshot, "{}", CodeFrame::new("py", formatted_code)).unwrap();
|
write!(snapshot, "{}", CodeFrame::new("py", &formatted_code)).unwrap();
|
||||||
|
|
||||||
write!(snapshot, "{}", Header::new("Black Output")).unwrap();
|
write!(snapshot, "{}", Header::new("Black Output")).unwrap();
|
||||||
write!(snapshot, "{}", CodeFrame::new("py", &expected_output)).unwrap();
|
write!(snapshot, "{}", CodeFrame::new("py", &expected_output)).unwrap();
|
||||||
|
@ -89,21 +91,52 @@ fn format() {
|
||||||
let test_file = |input_path: &Path| {
|
let test_file = |input_path: &Path| {
|
||||||
let content = fs::read_to_string(input_path).unwrap();
|
let content = fs::read_to_string(input_path).unwrap();
|
||||||
|
|
||||||
let printed =
|
let options = PyFormatOptions::default();
|
||||||
format_module(&content, PyFormatOptions::default()).expect("Formatting to succeed");
|
let printed = format_module(&content, options.clone()).expect("Formatting to succeed");
|
||||||
let formatted_code = printed.as_code();
|
let formatted_code = printed.as_code();
|
||||||
|
|
||||||
ensure_stability_when_formatting_twice(formatted_code);
|
ensure_stability_when_formatting_twice(formatted_code, options);
|
||||||
|
|
||||||
let snapshot = format!(
|
let mut snapshot = format!("## Input\n{}", CodeFrame::new("py", &content));
|
||||||
r#"## Input
|
|
||||||
{}
|
|
||||||
|
|
||||||
## Output
|
let options_path = input_path.with_extension("options.json");
|
||||||
{}"#,
|
if let Ok(options_file) = fs::File::open(options_path) {
|
||||||
CodeFrame::new("py", &content),
|
let reader = BufReader::new(options_file);
|
||||||
CodeFrame::new("py", formatted_code)
|
let options: Vec<PyFormatOptions> =
|
||||||
);
|
serde_json::from_reader(reader).expect("Options to be a valid Json file");
|
||||||
|
|
||||||
|
writeln!(snapshot, "## Outputs").unwrap();
|
||||||
|
|
||||||
|
for (i, options) in options.into_iter().enumerate() {
|
||||||
|
let printed =
|
||||||
|
format_module(&content, options.clone()).expect("Formatting to succeed");
|
||||||
|
let formatted_code = printed.as_code();
|
||||||
|
|
||||||
|
ensure_stability_when_formatting_twice(formatted_code, options.clone());
|
||||||
|
|
||||||
|
writeln!(
|
||||||
|
snapshot,
|
||||||
|
"### Output {}\n{}{}",
|
||||||
|
i + 1,
|
||||||
|
CodeFrame::new("", &DisplayPyOptions(&options)),
|
||||||
|
CodeFrame::new("py", &formatted_code)
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let options = PyFormatOptions::default();
|
||||||
|
let printed = format_module(&content, options.clone()).expect("Formatting to succeed");
|
||||||
|
let formatted_code = printed.as_code();
|
||||||
|
|
||||||
|
ensure_stability_when_formatting_twice(formatted_code, options);
|
||||||
|
|
||||||
|
writeln!(
|
||||||
|
snapshot,
|
||||||
|
"## Output\n{}",
|
||||||
|
CodeFrame::new("py", &formatted_code)
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
insta::with_settings!({
|
insta::with_settings!({
|
||||||
omit_expression => true,
|
omit_expression => true,
|
||||||
|
@ -118,8 +151,8 @@ fn format() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Format another time and make sure that there are no changes anymore
|
/// Format another time and make sure that there are no changes anymore
|
||||||
fn ensure_stability_when_formatting_twice(formatted_code: &str) {
|
fn ensure_stability_when_formatting_twice(formatted_code: &str, options: PyFormatOptions) {
|
||||||
let reformatted = match format_module(formatted_code, PyFormatOptions::default()) {
|
let reformatted = match format_module(formatted_code, options) {
|
||||||
Ok(reformatted) => reformatted,
|
Ok(reformatted) => reformatted,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
panic!(
|
panic!(
|
||||||
|
@ -170,11 +203,11 @@ impl std::fmt::Display for Header<'_> {
|
||||||
|
|
||||||
struct CodeFrame<'a> {
|
struct CodeFrame<'a> {
|
||||||
language: &'a str,
|
language: &'a str,
|
||||||
code: &'a str,
|
code: &'a dyn std::fmt::Display,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> CodeFrame<'a> {
|
impl<'a> CodeFrame<'a> {
|
||||||
fn new(language: &'a str, code: &'a str) -> Self {
|
fn new(language: &'a str, code: &'a dyn std::fmt::Display) -> Self {
|
||||||
Self { language, code }
|
Self { language, code }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,3 +220,21 @@ impl std::fmt::Display for CodeFrame<'_> {
|
||||||
writeln!(f)
|
writeln!(f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct DisplayPyOptions<'a>(&'a PyFormatOptions);
|
||||||
|
|
||||||
|
impl fmt::Display for DisplayPyOptions<'_> {
|
||||||
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
||||||
|
writeln!(
|
||||||
|
f,
|
||||||
|
r#"indent-style = {indent_style}
|
||||||
|
line-width = {line_width}
|
||||||
|
quote-style = {quote_style:?}
|
||||||
|
magic-trailing-comma = {magic_trailing_comma:?}"#,
|
||||||
|
indent_style = self.0.indent_style(),
|
||||||
|
line_width = self.0.line_width().value(),
|
||||||
|
quote_style = self.0.quote_style(),
|
||||||
|
magic_trailing_comma = self.0.magic_trailing_comma()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -109,8 +109,6 @@ x53 = (
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
NOT_YET_IMPLEMENTED_StmtImportFrom
|
NOT_YET_IMPLEMENTED_StmtImportFrom
|
||||||
|
@ -196,3 +194,4 @@ x53 = a.askjdfahdlskjflsajfadhsaf.akjdsf.aksjdlfadhaljsashdfljaf.askjdflhasfdlas
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -200,8 +200,6 @@ for user_id in set(target_user_ids) - {u.user_id for u in updates}:
|
||||||
updates.append(UserPresenceState.default(user_id))
|
updates.append(UserPresenceState.default(user_id))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
(
|
(
|
||||||
|
@ -447,3 +445,4 @@ for (
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -70,8 +70,6 @@ if (
|
||||||
pass
|
pass
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
if (
|
if (
|
||||||
|
@ -141,3 +139,4 @@ if (
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -67,8 +67,6 @@ return 1 == 2 and (
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
a == b
|
a == b
|
||||||
|
@ -187,3 +185,4 @@ return (
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -64,8 +64,6 @@ a = {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# before
|
# before
|
||||||
|
@ -131,3 +129,4 @@ a = {
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,6 @@ a3 = [
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# Dangling comment placement in empty lists
|
# Dangling comment placement in empty lists
|
||||||
|
@ -33,3 +31,4 @@ a3 = [
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -88,8 +88,6 @@ e202 = "e"[a() :: a()]
|
||||||
e210 = "e"[a() : 1 :]
|
e210 = "e"[a() : 1 :]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# Handle comments both when lower and upper exist and when they don't
|
# Handle comments both when lower and upper exist and when they don't
|
||||||
|
@ -175,3 +173,4 @@ e210 = "e"[NOT_IMPLEMENTED_call() : 1 :]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -58,8 +58,6 @@ String \"\"\"
|
||||||
'''
|
'''
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
"' test"
|
"' test"
|
||||||
|
@ -117,3 +115,4 @@ String \"\"\"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,6 @@ h2 = ((((1, "qweiurpoiqwurepqiurpqirpuqoiwrupqoirupqoirupqoiurpqiorupwqiourpqurp
|
||||||
h3 = 1, "qweiurpoiqwurepqiurpqirpuqoiwrupqoirupqoirupqoiurpqiorupwqiourpqurpqurpqurpqurpqurpqurüqurqpuriq"
|
h3 = 1, "qweiurpoiqwurepqiurpqirpuqoiwrupqoirupqoirupqoiurpqiorupwqiourpqurpqurpqurpqurpqurpqurüqurqpuriq"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# Non-wrapping parentheses checks
|
# Non-wrapping parentheses checks
|
||||||
|
@ -264,3 +262,4 @@ h3 = (
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -144,8 +144,6 @@ if not \
|
||||||
pass
|
pass
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
if (
|
if (
|
||||||
|
@ -300,3 +298,4 @@ if not a:
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_python_formatter/tests/fixtures.rs
|
||||||
|
input_file: crates/ruff_python_formatter/resources/test/fixtures/ruff/skip_magic_trailing_comma.py
|
||||||
|
---
|
||||||
|
## Input
|
||||||
|
```py
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"last with trailing comma",
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"last without trailing comma"
|
||||||
|
)
|
||||||
|
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"third entry",
|
||||||
|
"fourth entry",
|
||||||
|
"fifth entry",
|
||||||
|
"sixt entry",
|
||||||
|
"seventh entry",
|
||||||
|
"eigth entry",
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Outputs
|
||||||
|
### Output 1
|
||||||
|
```
|
||||||
|
indent-style = Spaces, size: 4
|
||||||
|
line-width = 88
|
||||||
|
quote-style = Double
|
||||||
|
magic-trailing-comma = Respect
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"last with trailing comma",
|
||||||
|
)
|
||||||
|
|
||||||
|
("First entry", "Second entry", "last without trailing comma")
|
||||||
|
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"third entry",
|
||||||
|
"fourth entry",
|
||||||
|
"fifth entry",
|
||||||
|
"sixt entry",
|
||||||
|
"seventh entry",
|
||||||
|
"eigth entry",
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Output 2
|
||||||
|
```
|
||||||
|
indent-style = Spaces, size: 4
|
||||||
|
line-width = 88
|
||||||
|
quote-style = Double
|
||||||
|
magic-trailing-comma = Ignore
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
("First entry", "Second entry", "last with trailing comma")
|
||||||
|
|
||||||
|
("First entry", "Second entry", "last without trailing comma")
|
||||||
|
|
||||||
|
(
|
||||||
|
"First entry",
|
||||||
|
"Second entry",
|
||||||
|
"third entry",
|
||||||
|
"fourth entry",
|
||||||
|
"fifth entry",
|
||||||
|
"sixt entry",
|
||||||
|
"seventh entry",
|
||||||
|
"eigth entry",
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,6 @@ a2 = (
|
||||||
a = asdf = fjhalsdljfalflaflapamsakjsdhflakjdslfjhalsdljfalflaflapamsakjsdhflakjdslfjhalsdljfal = 1
|
a = asdf = fjhalsdljfalflaflapamsakjsdhflakjdslfjhalsdljfalflaflapamsakjsdhflakjdslfjhalsdljfal = 1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# break left hand side
|
# break left hand side
|
||||||
|
@ -31,3 +29,4 @@ a = asdf = fjhalsdljfalflaflapamsakjsdhflakjdslfjhalsdljfalflaflapamsakjsdhflakj
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,6 @@ while True: # block comment
|
||||||
# post comment
|
# post comment
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# leading comment
|
# leading comment
|
||||||
|
@ -23,3 +21,4 @@ while True: # block comment
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,6 @@ class Test(Aaaa): # trailing comment
|
||||||
pass
|
pass
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
class Test(
|
class Test(
|
||||||
|
@ -95,3 +93,4 @@ class Test(Aaaa): # trailing comment
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -40,8 +40,6 @@ for x in (): # type: int
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
for x in y: # trailing test comment
|
for x in y: # trailing test comment
|
||||||
|
@ -85,3 +83,4 @@ for x in (): # type: int
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -239,8 +239,6 @@ def f42(
|
||||||
pass
|
pass
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# Dangling comments
|
# Dangling comments
|
||||||
|
@ -516,3 +514,4 @@ def f42(
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,6 @@ else: # Comment
|
||||||
pass
|
pass
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
if x == y: # trailing if condition
|
if x == y: # trailing if condition
|
||||||
|
@ -158,3 +156,4 @@ else: # Comment
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,6 @@ while (
|
||||||
print("Do something")
|
print("Do something")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
while 34: # trailing test comment
|
while 34: # trailing test comment
|
||||||
|
@ -74,3 +72,4 @@ while (
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -38,8 +38,6 @@ while b == 20:
|
||||||
e = 50 # one empty line before
|
e = 50 # one empty line before
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Output
|
## Output
|
||||||
```py
|
```py
|
||||||
# Removes the line above
|
# Removes the line above
|
||||||
|
@ -79,3 +77,4 @@ e = 50 # one empty line before
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue