diff --git a/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP029_2.py b/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP029_2.py new file mode 100644 index 0000000000..34ff94fa90 --- /dev/null +++ b/crates/ruff_linter/resources/test/fixtures/pyupgrade/UP029_2.py @@ -0,0 +1,5 @@ +from .builtins import next +from ..builtins import str +from ...builtins import int +from .builtins import next as _next + diff --git a/crates/ruff_linter/src/checkers/ast/analyze/statement.rs b/crates/ruff_linter/src/checkers/ast/analyze/statement.rs index 2e7523891b..1232dc52a9 100644 --- a/crates/ruff_linter/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff_linter/src/checkers/ast/analyze/statement.rs @@ -717,7 +717,9 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) { } if checker.is_rule_enabled(Rule::UnnecessaryBuiltinImport) { if let Some(module) = module { - pyupgrade::rules::unnecessary_builtin_import(checker, stmt, module, names); + pyupgrade::rules::unnecessary_builtin_import( + checker, stmt, module, names, level, + ); } } if checker.any_rule_enabled(&[ diff --git a/crates/ruff_linter/src/rules/pyupgrade/mod.rs b/crates/ruff_linter/src/rules/pyupgrade/mod.rs index c933de5ee8..a4bd1c5ac6 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/mod.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/mod.rs @@ -99,6 +99,7 @@ mod tests { #[test_case(Rule::UTF8EncodingDeclaration, Path::new("UP009_many_empty_lines.py"))] #[test_case(Rule::UnicodeKindPrefix, Path::new("UP025.py"))] #[test_case(Rule::UnnecessaryBuiltinImport, Path::new("UP029_0.py"))] + #[test_case(Rule::UnnecessaryBuiltinImport, Path::new("UP029_2.py"))] #[test_case(Rule::UnnecessaryClassParentheses, Path::new("UP039.py"))] #[test_case(Rule::UnnecessaryDefaultTypeArgs, Path::new("UP043.py"))] #[test_case(Rule::UnnecessaryEncodeUTF8, Path::new("UP012.py"))] diff --git a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs index 41e73a3096..f15b2dfeb3 100644 --- a/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs +++ b/crates/ruff_linter/src/rules/pyupgrade/rules/unnecessary_builtin_import.rs @@ -75,7 +75,13 @@ pub(crate) fn unnecessary_builtin_import( stmt: &Stmt, module: &str, names: &[Alias], + level: u32, ) { + // Ignore relative imports (they're importing from local modules, not Python's builtins). + if level > 0 { + return; + } + // Ignore irrelevant modules. if !matches!( module, diff --git a/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP029_2.py.snap b/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP029_2.py.snap new file mode 100644 index 0000000000..2bacb5d540 --- /dev/null +++ b/crates/ruff_linter/src/rules/pyupgrade/snapshots/ruff_linter__rules__pyupgrade__tests__UP029_2.py.snap @@ -0,0 +1,4 @@ +--- +source: crates/ruff_linter/src/rules/pyupgrade/mod.rs +--- +