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
12 changes: 9 additions & 3 deletions crates/ruff_linter/resources/test/fixtures/flake8_pyi/PYI006.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,14 @@

if sys.version_info == (3, 9): ... # OK

if sys.version_info <= (3, 10): ... # OK
if sys.version_info == (3, 9): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons

if sys.version_info > (3, 10): ... # OK
if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons

if python_version > (3, 10): ... # OK
if sys.version_info <= (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons

if sys.version_info > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
elif sys.version_info > (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons

if python_version > (3, 10): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
elif python_version == (3, 11): ... # Error: PYI006 Use only `<` and `>=` for version info comparisons
23 changes: 12 additions & 11 deletions crates/ruff_linter/src/checkers/ast/analyze/statement.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1213,8 +1213,18 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
flake8_pyi::rules::unrecognized_platform(checker, test);
}
}
if checker.any_enabled(&[Rule::BadVersionInfoComparison, Rule::BadVersionInfoOrder])
{
if checker.enabled(Rule::ComplexIfStatementInStub) {
if let Expr::BoolOp(ast::ExprBoolOp { values, .. }) = test.as_ref() {
for value in values {
flake8_pyi::rules::complex_if_statement_in_stub(checker, value);
}
} else {
flake8_pyi::rules::complex_if_statement_in_stub(checker, test);
}
}
}
if checker.any_enabled(&[Rule::BadVersionInfoComparison, Rule::BadVersionInfoOrder]) {
if checker.source_type.is_stub() || checker.settings.preview.is_enabled() {
fn bad_version_info_comparison(
checker: &mut Checker,
test: &Expr,
Expand Down Expand Up @@ -1247,15 +1257,6 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
}
}
}
if checker.enabled(Rule::ComplexIfStatementInStub) {
if let Expr::BoolOp(ast::ExprBoolOp { values, .. }) = test.as_ref() {
for value in values {
flake8_pyi::rules::complex_if_statement_in_stub(checker, value);
}
} else {
flake8_pyi::rules::complex_if_statement_in_stub(checker, test);
}
}
}
}
Stmt::Assert(
Expand Down
2 changes: 2 additions & 0 deletions crates/ruff_linter/src/rules/flake8_pyi/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,8 @@ mod tests {
}

#[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<()> {
let snapshot = format!(
"preview__{}_{}",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ use crate::registry::Rule;
/// False
/// ```
///
/// In [preview], this rule will also flag non-stub files.
///
/// ## Example
/// ```pyi
/// import sys
Expand All @@ -46,6 +48,8 @@ use crate::registry::Rule;
///
/// if sys.version_info >= (3, 9): ...
/// ```
///
/// [preview]: https://docs.astral.sh/ruff/preview/
#[violation]
pub struct BadVersionInfoComparison;

Expand All @@ -66,6 +70,8 @@ impl Violation for BadVersionInfoComparison {
/// to understand the desired behavior, which typically corresponds to the
/// latest Python versions.
///
/// In [preview], this rule will also flag non-stub files.
///
/// ## Example
///
/// ```pyi
Expand All @@ -87,6 +93,8 @@ impl Violation for BadVersionInfoComparison {
/// else:
/// def read_data(x, *, preserve_order=True): ...
/// ```
///
/// [preview]: https://docs.astral.sh/ruff/preview/
#[violation]
pub struct BadVersionInfoOrder;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
---
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
|
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
---
source: crates/ruff_linter/src/rules/flake8_pyi/mod.rs
---
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
|