[flake8-pyi] Stabilize: include all python file types for PYI006 (#15340)

This commit is contained in:
Micha Reiser 2025-01-08 14:08:33 +01:00
parent 8e8a07144d
commit 3ea4c63d2c
7 changed files with 101 additions and 185 deletions

View file

@ -1199,40 +1199,38 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
} }
} }
if checker.any_enabled(&[Rule::BadVersionInfoComparison, Rule::BadVersionInfoOrder]) { if checker.any_enabled(&[Rule::BadVersionInfoComparison, Rule::BadVersionInfoOrder]) {
if checker.source_type.is_stub() || checker.settings.preview.is_enabled() { fn bad_version_info_comparison(
fn bad_version_info_comparison( checker: &mut Checker,
checker: &mut Checker, test: &Expr,
test: &Expr, has_else_clause: bool,
has_else_clause: bool, ) {
) { if let Expr::BoolOp(ast::ExprBoolOp { values, .. }) = test {
if let Expr::BoolOp(ast::ExprBoolOp { values, .. }) = test { for value in values {
for value in values {
flake8_pyi::rules::bad_version_info_comparison(
checker,
value,
has_else_clause,
);
}
} else {
flake8_pyi::rules::bad_version_info_comparison( flake8_pyi::rules::bad_version_info_comparison(
checker, checker,
test, value,
has_else_clause, has_else_clause,
); );
} }
} else {
flake8_pyi::rules::bad_version_info_comparison(
checker,
test,
has_else_clause,
);
} }
}
let has_else_clause = let has_else_clause = elif_else_clauses.iter().any(|clause| clause.test.is_none());
elif_else_clauses.iter().any(|clause| clause.test.is_none());
bad_version_info_comparison(checker, test.as_ref(), has_else_clause); bad_version_info_comparison(checker, test.as_ref(), has_else_clause);
for clause in elif_else_clauses { for clause in elif_else_clauses {
if let Some(test) = clause.test.as_ref() { if let Some(test) = clause.test.as_ref() {
bad_version_info_comparison(checker, test, has_else_clause); bad_version_info_comparison(checker, test, has_else_clause);
}
} }
} }
} }
if checker.enabled(Rule::IfKeyInDictDel) { if checker.enabled(Rule::IfKeyInDictDel) {
ruff::rules::if_key_in_dict_del(checker, if_); ruff::rules::if_key_in_dict_del(checker, if_);
} }

View file

@ -187,8 +187,6 @@ mod tests {
} }
#[test_case(Rule::FutureAnnotationsInStub, Path::new("PYI044.pyi"))] #[test_case(Rule::FutureAnnotationsInStub, Path::new("PYI044.pyi"))]
#[test_case(Rule::BadVersionInfoComparison, Path::new("PYI006.py"))]
#[test_case(Rule::BadVersionInfoComparison, Path::new("PYI006.pyi"))]
fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> { fn preview_rules(rule_code: Rule, path: &Path) -> Result<()> {
let snapshot = format!( let snapshot = format!(
"preview__{}_{}", "preview__{}_{}",

View file

@ -9,7 +9,7 @@ use crate::registry::Rule;
/// ## What it does /// ## What it does
/// Checks for uses of comparators other than `<` and `>=` for /// Checks for uses of comparators other than `<` and `>=` for
/// `sys.version_info` checks in `.pyi` files. All other comparators, such /// `sys.version_info` checks. All other comparators, such
/// as `>`, `<=`, and `==`, are banned. /// as `>`, `<=`, and `==`, are banned.
/// ///
/// ## Why is this bad? /// ## Why is this bad?
@ -34,17 +34,15 @@ use crate::registry::Rule;
/// False /// False
/// ``` /// ```
/// ///
/// In [preview], this rule will also flag non-stub files.
///
/// ## Example /// ## Example
/// ```pyi /// ```py
/// import sys /// import sys
/// ///
/// if sys.version_info > (3, 8): ... /// if sys.version_info > (3, 8): ...
/// ``` /// ```
/// ///
/// Use instead: /// Use instead:
/// ```pyi /// ```py
/// import sys /// import sys
/// ///
/// if sys.version_info >= (3, 9): ... /// if sys.version_info >= (3, 9): ...
@ -144,7 +142,10 @@ pub(crate) fn bad_version_info_comparison(
} }
if matches!(op, CmpOp::Lt) { if matches!(op, CmpOp::Lt) {
if checker.enabled(Rule::BadVersionInfoOrder) { if checker.enabled(Rule::BadVersionInfoOrder)
// See https://github.com/astral-sh/ruff/issues/15347
&& (checker.source_type.is_stub() || checker.settings.preview.is_enabled())
{
if has_else_clause { if has_else_clause {
checker checker
.diagnostics .diagnostics

View file

@ -2,4 +2,76 @@
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
snapshot_kind: text snapshot_kind: text
--- ---
PYI006.py:8:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
6 | if sys.version_info >= (3, 9): ... # OK
7 |
8 | if sys.version_info == (3, 9): ... # OK
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
9 |
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:10:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
8 | if sys.version_info == (3, 9): ... # OK
9 |
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
11 |
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:12:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
11 |
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
13 |
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:14:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
13 |
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
15 |
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:16:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
15 |
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:17:6: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
18 |
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:19:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
18 |
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
20 | elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:20:6: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
20 | elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
|

View file

@ -1,5 +1,6 @@
--- ---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
snapshot_kind: text
--- ---
PYI066.pyi:3:4: PYI066 Put branches for newer Python versions first when branching on `sys.version_info` comparisons PYI066.pyi:3:4: PYI066 Put branches for newer Python versions first when branching on `sys.version_info` comparisons
| |

View file

@ -1,77 +0,0 @@
---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
snapshot_kind: text
---
PYI006.py:8:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
6 | if sys.version_info >= (3, 9): ... # OK
7 |
8 | if sys.version_info == (3, 9): ... # OK
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
9 |
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:10:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
8 | if sys.version_info == (3, 9): ... # OK
9 |
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
11 |
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:12:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
11 |
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
13 |
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:14:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
13 |
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
15 |
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:16:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
15 |
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:17:6: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
18 |
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:19:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
18 |
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
20 | elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.py:20:6: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
20 | elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
|

View file

@ -1,77 +0,0 @@
---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
snapshot_kind: text
---
PYI006.pyi:8:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
6 | if sys.version_info >= (3, 9): ... # OK
7 |
8 | if sys.version_info == (3, 9): ... # OK
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
9 |
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:10:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
8 | if sys.version_info == (3, 9): ... # OK
9 |
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
11 |
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:12:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
10 | if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
11 |
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
13 |
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:14:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
12 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
13 |
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
15 |
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:16:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
14 | if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
15 |
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:17:6: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
16 | if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
18 |
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:19:4: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
17 | elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
18 |
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
20 | elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
|
PYI006.pyi:20:6: PYI006 Use `<` or `>=` for `sys.version_info` comparisons
|
19 | if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
20 | elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
| ^^^^^^^^^^^^^^^^^^^^^^^^^ PYI006
|