Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions crates/ruff/tests/cli/lint.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2871,6 +2871,48 @@ fn flake8_import_convention_unused_aliased_import_no_conflict() {
);
}

// https://github.com/astral-sh/ruff/issues/20891
#[test]
fn required_import_set_conflicts_with_pyi025() {
assert_cmd_snapshot!(
Command::new(get_cargo_bin(BIN_NAME))
.args(STDIN_BASE_OPTIONS)
.arg("--config")
.arg(r#"lint.isort.required-imports = ["from collections.abc import Set"]"#)
.args(["--select", "I002,PYI025"])
.arg("-")
.pass_stdin("1")
);
}

// https://github.com/astral-sh/ruff/issues/20891
#[test]
fn required_import_set_aliased_as_abstract_set_no_conflict() {
assert_cmd_snapshot!(
Command::new(get_cargo_bin(BIN_NAME))
.args(STDIN_BASE_OPTIONS)
.arg("--config")
.arg(r#"lint.isort.required-imports = ["from collections.abc import Set as AbstractSet"]"#)
.args(["--select", "I002,PYI025"])
.arg("-")
.pass_stdin("1")
);
}

// https://github.com/astral-sh/ruff/issues/20891
#[test]
fn required_import_set_without_pyi025_no_conflict() {
assert_cmd_snapshot!(
Command::new(get_cargo_bin(BIN_NAME))
.args(STDIN_BASE_OPTIONS)
.arg("--config")
.arg(r#"lint.isort.required-imports = ["from collections.abc import Set"]"#)
.args(["--select", "I002"])
.arg("-")
.pass_stdin("1")
);
}

// https://github.com/astral-sh/ruff/issues/19842
#[test]
fn pyupgrade_up026_respects_isort_required_import_fix() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
source: crates/ruff/tests/cli/lint.rs
info:
program: ruff
args:
- check
- "--no-cache"
- "--output-format"
- concise
- "--config"
- "lint.isort.required-imports = [\"from collections.abc import Set as AbstractSet\"]"
- "--select"
- "I002,PYI025"
- "-"
stdin: "1"
---
success: false
exit_code: 1
----- stdout -----
-:1:1: I002 [*] Missing required import: `from collections.abc import Set as AbstractSet`
Found 1 error.
[*] 1 fixable with the `--fix` option.

----- stderr -----
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
source: crates/ruff/tests/cli/lint.rs
info:
program: ruff
args:
- check
- "--no-cache"
- "--output-format"
- concise
- "--config"
- "lint.isort.required-imports = [\"from collections.abc import Set\"]"
- "--select"
- "I002,PYI025"
- "-"
stdin: "1"
---
success: false
exit_code: 2
----- stdout -----

----- stderr -----
ruff failed
Cause: Required import `from collections.abc import Set` specified in `lint.isort.required-imports` (I002) conflicts with `unaliased-collections-abc-set-import` (PYI025), which requires this import to be aliased as `AbstractSet`.

Help: Either alias the required import (`from collections.abc import Set as AbstractSet`), or disable PYI025.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
source: crates/ruff/tests/cli/lint.rs
info:
program: ruff
args:
- check
- "--no-cache"
- "--output-format"
- concise
- "--config"
- "lint.isort.required-imports = [\"from collections.abc import Set\"]"
- "--select"
- I002
- "-"
stdin: "1"
---
success: false
exit_code: 1
----- stdout -----
-:1:1: I002 [*] Missing required import: `from collections.abc import Set`
Found 1 error.
[*] 1 fixable with the `--fix` option.

----- stderr -----
35 changes: 35 additions & 0 deletions crates/ruff_workspace/src/configuration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -253,6 +253,7 @@ impl Configuration {
.unwrap_or_default();

conflicting_import_settings(&isort, &flake8_import_conventions)?;
conflicting_required_import_pyi025(&isort, &rules)?;

let future_annotations = lint.future_annotations.unwrap_or_default();

Expand Down Expand Up @@ -1679,6 +1680,40 @@ fn conflicting_import_settings(
Ok(())
}

/// Detect conflicts between I002 (missing-required-import) and PYI025
/// (unaliased-collections-abc-set-import).
///
/// If `required-imports` includes `from collections.abc import Set` (without
/// aliasing it as `AbstractSet`) and PYI025 is enabled, the configuration is
/// contradictory: I002 requires the unaliased import, while PYI025 forbids it.
fn conflicting_required_import_pyi025(
isort: &isort::settings::Settings,
rules: &RuleTable,
) -> Result<()> {
if !rules.enabled(Rule::UnaliasedCollectionsAbcSetImport) {
return Ok(());
}

for required_import in &isort.required_imports {
let qualified_name = required_import.qualified_name();
if qualified_name.segments() == ["collections", "abc", "Set"]
&& required_import.bound_name() != "AbstractSet"
{
return Err(anyhow!(
"Required import `from collections.abc import Set` specified in \
`lint.isort.required-imports` (I002) conflicts with \
`unaliased-collections-abc-set-import` (PYI025), which requires \
this import to be aliased as `AbstractSet`.\n\n\
Help: Either alias the required import \
(`from collections.abc import Set as AbstractSet`), \
or disable PYI025."
));
}
}

Ok(())
}

#[cfg(test)]
mod tests {
use std::str::FromStr;
Expand Down
Loading