Skip to content

Commit 0b800a9

Browse files
charliermarshzanieb
authored andcommitted
[flake8-pyi] Mark unaliased-collections-abc-set-import fix as safe (#9679)
## Summary Prompted by #8482 (comment). The rename is only unsafe when the symbol is exported, so we can narrow the conditions.
1 parent 5dba038 commit 0b800a9

3 files changed

+22
-8
lines changed

crates/ruff_linter/src/rules/flake8_pyi/rules/unaliased_collections_abc_set_import.rs

+16-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use ruff_diagnostics::{Diagnostic, Fix, FixAvailability, Violation};
1+
use ruff_diagnostics::{Applicability, Diagnostic, Fix, FixAvailability, Violation};
22
use ruff_macros::{derive_message_formats, violation};
33
use ruff_python_semantic::Imported;
44
use ruff_python_semantic::{Binding, BindingKind};
@@ -29,6 +29,12 @@ use crate::renamer::Renamer;
2929
/// ```python
3030
/// from collections.abc import Set as AbstractSet
3131
/// ```
32+
///
33+
/// ## Fix safety
34+
/// This rule's fix is marked as unsafe for `Set` imports defined at the
35+
/// top-level of a module. Top-level symbols are implicitly exported by the
36+
/// module, and so renaming a top-level symbol may break downstream modules
37+
/// that import it.
3238
#[violation]
3339
pub struct UnaliasedCollectionsAbcSetImport;
3440

@@ -69,7 +75,15 @@ pub(crate) fn unaliased_collections_abc_set_import(
6975
diagnostic.try_set_fix(|| {
7076
let scope = &checker.semantic().scopes[binding.scope];
7177
let (edit, rest) = Renamer::rename(name, "AbstractSet", scope, checker.semantic())?;
72-
Ok(Fix::unsafe_edits(edit, rest))
78+
Ok(Fix::applicable_edits(
79+
edit,
80+
rest,
81+
if scope.kind.is_module() {
82+
Applicability::Unsafe
83+
} else {
84+
Applicability::Safe
85+
},
86+
))
7387
});
7488
}
7589
Some(diagnostic)

crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.py.snap

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ PYI025.py:10:33: PYI025 [*] Use `from collections.abc import Set as AbstractSet`
99
|
1010
= help: Alias `Set` to `AbstractSet`
1111

12-
Unsafe fix
12+
Safe fix
1313
7 7 |
1414
8 8 |
1515
9 9 | def f():
@@ -29,7 +29,7 @@ PYI025.py:14:51: PYI025 [*] Use `from collections.abc import Set as AbstractSet`
2929
|
3030
= help: Alias `Set` to `AbstractSet`
3131

32-
Unsafe fix
32+
Safe fix
3333
11 11 |
3434
12 12 |
3535
13 13 | def f():

crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__PYI025_PYI025.pyi.snap

+4-4
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ PYI025.pyi:8:33: PYI025 [*] Use `from collections.abc import Set as AbstractSet`
1111
|
1212
= help: Alias `Set` to `AbstractSet`
1313

14-
Unsafe fix
14+
Safe fix
1515
5 5 | from collections.abc import Container, Sized, Set as AbstractSet, ValuesView # Ok
1616
6 6 |
1717
7 7 | def f():
@@ -31,7 +31,7 @@ PYI025.pyi:11:51: PYI025 [*] Use `from collections.abc import Set as AbstractSet
3131
|
3232
= help: Alias `Set` to `AbstractSet`
3333

34-
Unsafe fix
34+
Safe fix
3535
8 8 | from collections.abc import Set # PYI025
3636
9 9 |
3737
10 10 | def f():
@@ -52,7 +52,7 @@ PYI025.pyi:16:37: PYI025 [*] Use `from collections.abc import Set as AbstractSet
5252
|
5353
= help: Alias `Set` to `AbstractSet`
5454

55-
Unsafe fix
55+
Safe fix
5656
13 13 | def f():
5757
14 14 | """Test: local symbol renaming."""
5858
15 15 | if True:
@@ -130,7 +130,7 @@ PYI025.pyi:44:33: PYI025 [*] Use `from collections.abc import Set as AbstractSet
130130
|
131131
= help: Alias `Set` to `AbstractSet`
132132

133-
Unsafe fix
133+
Safe fix
134134
41 41 |
135135
42 42 | def f():
136136
43 43 | """Test: nonlocal symbol renaming."""

0 commit comments

Comments
 (0)