mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-01 06:11:21 +00:00
[pyupgrade
] Extend version detection to include sys.version_info.major
(UP036
) (#18633)
Some checks are pending
CI / cargo build (msrv) (push) Blocked by required conditions
CI / Determine changes (push) Waiting to run
CI / cargo fmt (push) Waiting to run
CI / cargo clippy (push) Blocked by required conditions
CI / cargo test (linux) (push) Blocked by required conditions
CI / cargo test (linux, release) (push) Blocked by required conditions
CI / cargo test (windows) (push) Blocked by required conditions
CI / cargo test (wasm) (push) Blocked by required conditions
CI / cargo build (release) (push) Waiting to run
CI / cargo fuzz build (push) Blocked by required conditions
CI / fuzz parser (push) Blocked by required conditions
CI / test scripts (push) Blocked by required conditions
CI / ecosystem (push) Blocked by required conditions
CI / Fuzz for new ty panics (push) Blocked by required conditions
CI / cargo shear (push) Blocked by required conditions
CI / python package (push) Waiting to run
CI / pre-commit (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / formatter instabilities and black similarity (push) Blocked by required conditions
CI / test ruff-lsp (push) Blocked by required conditions
CI / check playground (push) Blocked by required conditions
CI / benchmarks-instrumented (push) Blocked by required conditions
CI / benchmarks-walltime (push) Blocked by required conditions
[ty Playground] Release / publish (push) Waiting to run
Some checks are pending
CI / cargo build (msrv) (push) Blocked by required conditions
CI / Determine changes (push) Waiting to run
CI / cargo fmt (push) Waiting to run
CI / cargo clippy (push) Blocked by required conditions
CI / cargo test (linux) (push) Blocked by required conditions
CI / cargo test (linux, release) (push) Blocked by required conditions
CI / cargo test (windows) (push) Blocked by required conditions
CI / cargo test (wasm) (push) Blocked by required conditions
CI / cargo build (release) (push) Waiting to run
CI / cargo fuzz build (push) Blocked by required conditions
CI / fuzz parser (push) Blocked by required conditions
CI / test scripts (push) Blocked by required conditions
CI / ecosystem (push) Blocked by required conditions
CI / Fuzz for new ty panics (push) Blocked by required conditions
CI / cargo shear (push) Blocked by required conditions
CI / python package (push) Waiting to run
CI / pre-commit (push) Waiting to run
CI / mkdocs (push) Waiting to run
CI / formatter instabilities and black similarity (push) Blocked by required conditions
CI / test ruff-lsp (push) Blocked by required conditions
CI / check playground (push) Blocked by required conditions
CI / benchmarks-instrumented (push) Blocked by required conditions
CI / benchmarks-walltime (push) Blocked by required conditions
[ty Playground] Release / publish (push) Waiting to run
## Summary Resolves #18165 Added pattern `["sys", "version_info", "major"]` to the existing matches for `sys.version_info` to ensure consistent handling of both the base object and its major version attribute. ## Test Plan `cargo nextest run` and `cargo insta test` --------- Co-authored-by: Brent Westbrook <brentrwestbrook@gmail.com>
This commit is contained in:
parent
885dc9091f
commit
da16e00751
3 changed files with 181 additions and 8 deletions
|
@ -71,3 +71,47 @@ if sys.version_info <= (3, 14, 0):
|
|||
|
||||
if sys.version_info <= (3, 14, 15):
|
||||
print()
|
||||
|
||||
# https://github.com/astral-sh/ruff/issues/18165
|
||||
|
||||
if sys.version_info.major >= 3:
|
||||
print("3")
|
||||
else:
|
||||
print("2")
|
||||
|
||||
if sys.version_info.major > 3:
|
||||
print("3")
|
||||
else:
|
||||
print("2")
|
||||
|
||||
if sys.version_info.major <= 3:
|
||||
print("3")
|
||||
else:
|
||||
print("2")
|
||||
|
||||
if sys.version_info.major < 3:
|
||||
print("3")
|
||||
else:
|
||||
print("2")
|
||||
|
||||
if sys.version_info.major == 3:
|
||||
print("3")
|
||||
else:
|
||||
print("2")
|
||||
|
||||
# Semantically incorrect, skip fixing
|
||||
|
||||
if sys.version_info.major[1] > 3:
|
||||
print(3)
|
||||
else:
|
||||
print(2)
|
||||
|
||||
if sys.version_info.major > (3, 13):
|
||||
print(3)
|
||||
else:
|
||||
print(2)
|
||||
|
||||
if sys.version_info.major[:2] > (3, 13):
|
||||
print(3)
|
||||
else:
|
||||
print(2)
|
||||
|
|
|
@ -14,6 +14,7 @@ use crate::checkers::ast::Checker;
|
|||
use crate::fix::edits::{adjust_indentation, delete_stmt};
|
||||
use crate::{Edit, Fix, FixAvailability, Violation};
|
||||
use ruff_python_ast::PythonVersion;
|
||||
use ruff_python_semantic::SemanticModel;
|
||||
|
||||
/// ## What it does
|
||||
/// Checks for conditional blocks gated on `sys.version_info` comparisons
|
||||
|
@ -103,14 +104,7 @@ pub(crate) fn outdated_version_block(checker: &Checker, stmt_if: &StmtIf) {
|
|||
continue;
|
||||
};
|
||||
|
||||
// Detect `sys.version_info`, along with slices (like `sys.version_info[:2]`).
|
||||
if !checker
|
||||
.semantic()
|
||||
.resolve_qualified_name(map_subscript(left))
|
||||
.is_some_and(|qualified_name| {
|
||||
matches!(qualified_name.segments(), ["sys", "version_info"])
|
||||
})
|
||||
{
|
||||
if !is_valid_version_info(checker.semantic(), left) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -456,6 +450,21 @@ fn extract_version(elts: &[Expr]) -> Option<Vec<Int>> {
|
|||
Some(version)
|
||||
}
|
||||
|
||||
/// Returns `true` if the expression is related to `sys.version_info`.
|
||||
///
|
||||
/// This includes:
|
||||
/// - Direct access: `sys.version_info`
|
||||
/// - Subscript access: `sys.version_info[:2]`, `sys.version_info[0]`
|
||||
/// - Major version attribute: `sys.version_info.major`
|
||||
fn is_valid_version_info(semantic: &SemanticModel, left: &Expr) -> bool {
|
||||
semantic
|
||||
.resolve_qualified_name(map_subscript(left))
|
||||
.is_some_and(|name| matches!(name.segments(), ["sys", "version_info"]))
|
||||
|| semantic
|
||||
.resolve_qualified_name(left)
|
||||
.is_some_and(|name| matches!(name.segments(), ["sys", "version_info", "major"]))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use test_case::test_case;
|
||||
|
|
|
@ -157,3 +157,123 @@ UP036_5.py:48:24: UP036 Version specifier is invalid
|
|||
| ^^^^^^^^^^^^^^^ UP036
|
||||
49 | print()
|
||||
|
|
||||
|
||||
UP036_5.py:77:4: UP036 [*] Version block is outdated for minimum Python version
|
||||
|
|
||||
75 | # https://github.com/astral-sh/ruff/issues/18165
|
||||
76 |
|
||||
77 | if sys.version_info.major >= 3:
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP036
|
||||
78 | print("3")
|
||||
79 | else:
|
||||
|
|
||||
= help: Remove outdated version block
|
||||
|
||||
ℹ Unsafe fix
|
||||
74 74 |
|
||||
75 75 | # https://github.com/astral-sh/ruff/issues/18165
|
||||
76 76 |
|
||||
77 |-if sys.version_info.major >= 3:
|
||||
78 |- print("3")
|
||||
79 |-else:
|
||||
80 |- print("2")
|
||||
77 |+print("3")
|
||||
81 78 |
|
||||
82 79 | if sys.version_info.major > 3:
|
||||
83 80 | print("3")
|
||||
|
||||
UP036_5.py:82:4: UP036 [*] Version block is outdated for minimum Python version
|
||||
|
|
||||
80 | print("2")
|
||||
81 |
|
||||
82 | if sys.version_info.major > 3:
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ UP036
|
||||
83 | print("3")
|
||||
84 | else:
|
||||
|
|
||||
= help: Remove outdated version block
|
||||
|
||||
ℹ Unsafe fix
|
||||
79 79 | else:
|
||||
80 80 | print("2")
|
||||
81 81 |
|
||||
82 |-if sys.version_info.major > 3:
|
||||
83 |- print("3")
|
||||
84 |-else:
|
||||
85 |- print("2")
|
||||
82 |+print("2")
|
||||
86 83 |
|
||||
87 84 | if sys.version_info.major <= 3:
|
||||
88 85 | print("3")
|
||||
|
||||
UP036_5.py:87:4: UP036 [*] Version block is outdated for minimum Python version
|
||||
|
|
||||
85 | print("2")
|
||||
86 |
|
||||
87 | if sys.version_info.major <= 3:
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP036
|
||||
88 | print("3")
|
||||
89 | else:
|
||||
|
|
||||
= help: Remove outdated version block
|
||||
|
||||
ℹ Unsafe fix
|
||||
84 84 | else:
|
||||
85 85 | print("2")
|
||||
86 86 |
|
||||
87 |-if sys.version_info.major <= 3:
|
||||
88 |- print("3")
|
||||
89 |-else:
|
||||
90 |- print("2")
|
||||
87 |+print("3")
|
||||
91 88 |
|
||||
92 89 | if sys.version_info.major < 3:
|
||||
93 90 | print("3")
|
||||
|
||||
UP036_5.py:92:4: UP036 [*] Version block is outdated for minimum Python version
|
||||
|
|
||||
90 | print("2")
|
||||
91 |
|
||||
92 | if sys.version_info.major < 3:
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ UP036
|
||||
93 | print("3")
|
||||
94 | else:
|
||||
|
|
||||
= help: Remove outdated version block
|
||||
|
||||
ℹ Unsafe fix
|
||||
89 89 | else:
|
||||
90 90 | print("2")
|
||||
91 91 |
|
||||
92 |-if sys.version_info.major < 3:
|
||||
93 |- print("3")
|
||||
94 |-else:
|
||||
95 |- print("2")
|
||||
92 |+print("2")
|
||||
96 93 |
|
||||
97 94 | if sys.version_info.major == 3:
|
||||
98 95 | print("3")
|
||||
|
||||
UP036_5.py:97:4: UP036 [*] Version block is outdated for minimum Python version
|
||||
|
|
||||
95 | print("2")
|
||||
96 |
|
||||
97 | if sys.version_info.major == 3:
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ UP036
|
||||
98 | print("3")
|
||||
99 | else:
|
||||
|
|
||||
= help: Remove outdated version block
|
||||
|
||||
ℹ Unsafe fix
|
||||
94 94 | else:
|
||||
95 95 | print("2")
|
||||
96 96 |
|
||||
97 |-if sys.version_info.major == 3:
|
||||
98 |- print("3")
|
||||
99 |-else:
|
||||
100 |- print("2")
|
||||
97 |+print("3")
|
||||
101 98 |
|
||||
102 99 | # Semantically incorrect, skip fixing
|
||||
103 100 |
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue