mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-27 12:29:28 +00:00

## Summary
This PR adds a new `lint` section to the configuration that groups all linter-specific settings. The existing top-level configurations continue to work without any warning because the `lint.*` settings are experimental.
The configuration merges the top level and `lint.*` settings where the settings in `lint` have higher precedence (override the top-level settings). The reasoning behind this is that the settings in `lint.` are more specific and more specific settings should override less specific settings.
I decided against showing the new `lint.*` options on our website because it would make the page extremely long (it's technically easy to do, just attribute `lint` with `[option_group`]). We may want to explore adding an `alias` field to the `option` attribute and show the alias on the website along with its regular name.
## Test Plan
* I added new integration tests
* I verified that the generated `options.md` is identical
* Verified the default settings in the playground

157 lines
4.1 KiB
Rust
157 lines
4.1 KiB
Rust
//! Tests the interaction of the `lint` configuration section
|
|
|
|
#![cfg(not(target_family = "wasm"))]
|
|
|
|
use std::fs;
|
|
use std::process::Command;
|
|
use std::str;
|
|
|
|
use anyhow::Result;
|
|
use insta_cmd::{assert_cmd_snapshot, get_cargo_bin};
|
|
use tempfile::TempDir;
|
|
|
|
const BIN_NAME: &str = "ruff";
|
|
const STDIN_BASE_OPTIONS: &[&str] = &["--no-cache", "--output-format", "text"];
|
|
|
|
#[test]
|
|
fn top_level_options() -> Result<()> {
|
|
let tempdir = TempDir::new()?;
|
|
let ruff_toml = tempdir.path().join("ruff.toml");
|
|
fs::write(
|
|
&ruff_toml,
|
|
r#"
|
|
extend-select = ["B", "Q"]
|
|
|
|
[flake8-quotes]
|
|
inline-quotes = "single"
|
|
"#,
|
|
)?;
|
|
|
|
assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME))
|
|
.args(STDIN_BASE_OPTIONS)
|
|
.arg("--config")
|
|
.arg(&ruff_toml)
|
|
.arg("-")
|
|
.pass_stdin(r#"a = "abcba".strip("aba")"#), @r###"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
-:1:5: Q000 [*] Double quotes found but single quotes preferred
|
|
-:1:5: B005 Using `.strip()` with multi-character strings is misleading
|
|
-:1:19: Q000 [*] Double quotes found but single quotes preferred
|
|
Found 3 errors.
|
|
[*] 2 potentially fixable with the --fix option.
|
|
|
|
----- stderr -----
|
|
"###);
|
|
Ok(())
|
|
}
|
|
|
|
#[test]
|
|
fn lint_options() -> Result<()> {
|
|
let tempdir = TempDir::new()?;
|
|
let ruff_toml = tempdir.path().join("ruff.toml");
|
|
fs::write(
|
|
&ruff_toml,
|
|
r#"
|
|
[lint]
|
|
extend-select = ["B", "Q"]
|
|
|
|
[lint.flake8-quotes]
|
|
inline-quotes = "single"
|
|
"#,
|
|
)?;
|
|
|
|
assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME))
|
|
.args(STDIN_BASE_OPTIONS)
|
|
.arg("--config")
|
|
.arg(&ruff_toml)
|
|
.arg("-")
|
|
.pass_stdin(r#"a = "abcba".strip("aba")"#), @r###"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
-:1:5: Q000 [*] Double quotes found but single quotes preferred
|
|
-:1:5: B005 Using `.strip()` with multi-character strings is misleading
|
|
-:1:19: Q000 [*] Double quotes found but single quotes preferred
|
|
Found 3 errors.
|
|
[*] 2 potentially fixable with the --fix option.
|
|
|
|
----- stderr -----
|
|
"###);
|
|
Ok(())
|
|
}
|
|
|
|
/// Tests that configurations from the top-level and `lint` section are merged together.
|
|
#[test]
|
|
fn mixed_levels() -> Result<()> {
|
|
let tempdir = TempDir::new()?;
|
|
let ruff_toml = tempdir.path().join("ruff.toml");
|
|
fs::write(
|
|
&ruff_toml,
|
|
r#"
|
|
extend-select = ["B", "Q"]
|
|
|
|
[lint.flake8-quotes]
|
|
inline-quotes = "single"
|
|
"#,
|
|
)?;
|
|
|
|
assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME))
|
|
.args(STDIN_BASE_OPTIONS)
|
|
.arg("--config")
|
|
.arg(&ruff_toml)
|
|
.arg("-")
|
|
.pass_stdin(r#"a = "abcba".strip("aba")"#), @r###"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
-:1:5: Q000 [*] Double quotes found but single quotes preferred
|
|
-:1:5: B005 Using `.strip()` with multi-character strings is misleading
|
|
-:1:19: Q000 [*] Double quotes found but single quotes preferred
|
|
Found 3 errors.
|
|
[*] 2 potentially fixable with the --fix option.
|
|
|
|
----- stderr -----
|
|
"###);
|
|
Ok(())
|
|
}
|
|
|
|
/// Tests that options in the `lint` section have higher precedence than top-level options (because they are more specific).
|
|
#[test]
|
|
fn precedence() -> Result<()> {
|
|
let tempdir = TempDir::new()?;
|
|
let ruff_toml = tempdir.path().join("ruff.toml");
|
|
fs::write(
|
|
&ruff_toml,
|
|
r#"
|
|
[lint]
|
|
extend-select = ["B", "Q"]
|
|
|
|
[flake8-quotes]
|
|
inline-quotes = "double"
|
|
|
|
[lint.flake8-quotes]
|
|
inline-quotes = "single"
|
|
"#,
|
|
)?;
|
|
|
|
assert_cmd_snapshot!(Command::new(get_cargo_bin(BIN_NAME))
|
|
.args(STDIN_BASE_OPTIONS)
|
|
.arg("--config")
|
|
.arg(&ruff_toml)
|
|
.arg("-")
|
|
.pass_stdin(r#"a = "abcba".strip("aba")"#), @r###"
|
|
success: false
|
|
exit_code: 1
|
|
----- stdout -----
|
|
-:1:5: Q000 [*] Double quotes found but single quotes preferred
|
|
-:1:5: B005 Using `.strip()` with multi-character strings is misleading
|
|
-:1:19: Q000 [*] Double quotes found but single quotes preferred
|
|
Found 3 errors.
|
|
[*] 2 potentially fixable with the --fix option.
|
|
|
|
----- stderr -----
|
|
"###);
|
|
Ok(())
|
|
}
|