diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_pyi/PYI006.py b/crates/ruff_linter/resources/test/fixtures/flake8_pyi/PYI006.py index 89420bc50f..72a06595dd 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_pyi/PYI006.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_pyi/PYI006.py @@ -7,8 +7,14 @@ if sys.version_info >= (3, 9): ... # OK 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 diff --git a/crates/ruff_linter/src/checkers/ast/analyze/statement.rs b/crates/ruff_linter/src/checkers/ast/analyze/statement.rs index 6e6e572993..d2ee3cd6b6 100644 --- a/crates/ruff_linter/src/checkers/ast/analyze/statement.rs +++ b/crates/ruff_linter/src/checkers/ast/analyze/statement.rs @@ -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, @@ -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( diff --git a/crates/ruff_linter/src/rules/flake8_pyi/mod.rs b/crates/ruff_linter/src/rules/flake8_pyi/mod.rs index 72b4f19af8..61e396aa21 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/mod.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/mod.rs @@ -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__{}_{}", diff --git a/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs b/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs index 2c189c963c..c905fab9ee 100644 --- a/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs +++ b/crates/ruff_linter/src/rules/flake8_pyi/rules/bad_version_info_comparison.rs @@ -33,6 +33,8 @@ use crate::registry::Rule; /// False /// ``` /// +/// In [preview], this rule will also flag non-stub files. +/// /// ## Example /// ```pyi /// import sys @@ -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; @@ -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 @@ -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; diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__preview__PYI006_PYI006.py.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__preview__PYI006_PYI006.py.snap new file mode 100644 index 0000000000..00c743d9c3 --- /dev/null +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__preview__PYI006_PYI006.py.snap @@ -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 + | diff --git a/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__preview__PYI006_PYI006.pyi.snap b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__preview__PYI006_PYI006.pyi.snap new file mode 100644 index 0000000000..55abdd253b --- /dev/null +++ b/crates/ruff_linter/src/rules/flake8_pyi/snapshots/ruff_linter__rules__flake8_pyi__tests__preview__PYI006_PYI006.pyi.snap @@ -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 + |