mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-27 12:29:28 +00:00
[pylint] Implement PLR0916 (too-many-boolean-expressions
) (#7975)
## Summary Add [R0916](https://pylint.readthedocs.io/en/latest/user_guide/messages/refactor/too-many-boolean-expressions.html), no autofix available. See: #970 ## Test Plan `cargo test` and manually.
This commit is contained in:
parent
5da0f9111e
commit
21ea290d6a
11 changed files with 398 additions and 0 deletions
54
crates/ruff_linter/resources/test/fixtures/pylint/too_many_boolean_expressions.py
vendored
Normal file
54
crates/ruff_linter/resources/test/fixtures/pylint/too_many_boolean_expressions.py
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
if a:
|
||||||
|
...
|
||||||
|
elif (a and b):
|
||||||
|
...
|
||||||
|
elif (a and b) and c:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y:
|
||||||
|
...
|
||||||
|
elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y and z:
|
||||||
|
...
|
||||||
|
else:
|
||||||
|
...
|
|
@ -1070,6 +1070,9 @@ pub(crate) fn statement(stmt: &Stmt, checker: &mut Checker) {
|
||||||
if checker.enabled(Rule::CheckAndRemoveFromSet) {
|
if checker.enabled(Rule::CheckAndRemoveFromSet) {
|
||||||
refurb::rules::check_and_remove_from_set(checker, if_);
|
refurb::rules::check_and_remove_from_set(checker, if_);
|
||||||
}
|
}
|
||||||
|
if checker.enabled(Rule::TooManyBooleanExpressions) {
|
||||||
|
pylint::rules::too_many_boolean_expressions(checker, if_);
|
||||||
|
}
|
||||||
if checker.source_type.is_stub() {
|
if checker.source_type.is_stub() {
|
||||||
if checker.any_enabled(&[
|
if checker.any_enabled(&[
|
||||||
Rule::UnrecognizedVersionInfoCheck,
|
Rule::UnrecognizedVersionInfoCheck,
|
||||||
|
|
|
@ -247,6 +247,7 @@ pub fn code_to_rule(linter: Linter, code: &str) -> Option<(RuleGroup, Rule)> {
|
||||||
(Pylint, "R0912") => (RuleGroup::Stable, rules::pylint::rules::TooManyBranches),
|
(Pylint, "R0912") => (RuleGroup::Stable, rules::pylint::rules::TooManyBranches),
|
||||||
(Pylint, "R0913") => (RuleGroup::Stable, rules::pylint::rules::TooManyArguments),
|
(Pylint, "R0913") => (RuleGroup::Stable, rules::pylint::rules::TooManyArguments),
|
||||||
(Pylint, "R0915") => (RuleGroup::Stable, rules::pylint::rules::TooManyStatements),
|
(Pylint, "R0915") => (RuleGroup::Stable, rules::pylint::rules::TooManyStatements),
|
||||||
|
(Pylint, "R0916") => (RuleGroup::Preview, rules::pylint::rules::TooManyBooleanExpressions),
|
||||||
(Pylint, "R1701") => (RuleGroup::Stable, rules::pylint::rules::RepeatedIsinstanceCalls),
|
(Pylint, "R1701") => (RuleGroup::Stable, rules::pylint::rules::RepeatedIsinstanceCalls),
|
||||||
(Pylint, "R1711") => (RuleGroup::Stable, rules::pylint::rules::UselessReturn),
|
(Pylint, "R1711") => (RuleGroup::Stable, rules::pylint::rules::UselessReturn),
|
||||||
(Pylint, "R1714") => (RuleGroup::Stable, rules::pylint::rules::RepeatedEqualityComparison),
|
(Pylint, "R1714") => (RuleGroup::Stable, rules::pylint::rules::RepeatedEqualityComparison),
|
||||||
|
|
|
@ -231,6 +231,22 @@ mod tests {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn max_boolean_expressions() -> Result<()> {
|
||||||
|
let diagnostics = test_path(
|
||||||
|
Path::new("pylint/too_many_boolean_expressions.py"),
|
||||||
|
&LinterSettings {
|
||||||
|
pylint: pylint::settings::Settings {
|
||||||
|
max_bool_expr: 5,
|
||||||
|
..pylint::settings::Settings::default()
|
||||||
|
},
|
||||||
|
..LinterSettings::for_rule(Rule::TooManyBooleanExpressions)
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
assert_messages!(diagnostics);
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn max_statements() -> Result<()> {
|
fn max_statements() -> Result<()> {
|
||||||
let diagnostics = test_path(
|
let diagnostics = test_path(
|
||||||
|
|
|
@ -45,6 +45,7 @@ pub(crate) use subprocess_popen_preexec_fn::*;
|
||||||
pub(crate) use subprocess_run_without_check::*;
|
pub(crate) use subprocess_run_without_check::*;
|
||||||
pub(crate) use sys_exit_alias::*;
|
pub(crate) use sys_exit_alias::*;
|
||||||
pub(crate) use too_many_arguments::*;
|
pub(crate) use too_many_arguments::*;
|
||||||
|
pub(crate) use too_many_boolean_expressions::*;
|
||||||
pub(crate) use too_many_branches::*;
|
pub(crate) use too_many_branches::*;
|
||||||
pub(crate) use too_many_public_methods::*;
|
pub(crate) use too_many_public_methods::*;
|
||||||
pub(crate) use too_many_return_statements::*;
|
pub(crate) use too_many_return_statements::*;
|
||||||
|
@ -108,6 +109,7 @@ mod subprocess_popen_preexec_fn;
|
||||||
mod subprocess_run_without_check;
|
mod subprocess_run_without_check;
|
||||||
mod sys_exit_alias;
|
mod sys_exit_alias;
|
||||||
mod too_many_arguments;
|
mod too_many_arguments;
|
||||||
|
mod too_many_boolean_expressions;
|
||||||
mod too_many_branches;
|
mod too_many_branches;
|
||||||
mod too_many_public_methods;
|
mod too_many_public_methods;
|
||||||
mod too_many_return_statements;
|
mod too_many_return_statements;
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
use ast::{Expr, StmtIf};
|
||||||
|
use ruff_diagnostics::{Diagnostic, Violation};
|
||||||
|
use ruff_macros::{derive_message_formats, violation};
|
||||||
|
use ruff_python_ast as ast;
|
||||||
|
use ruff_text_size::Ranged;
|
||||||
|
|
||||||
|
use crate::checkers::ast::Checker;
|
||||||
|
|
||||||
|
/// ## What it does
|
||||||
|
/// Checks for too many Boolean expressions in an `if` statement.
|
||||||
|
///
|
||||||
|
/// By default, this rule allows up to 5 expressions. This can be configured
|
||||||
|
/// using the [`pylint.max-bool-expr`] option.
|
||||||
|
///
|
||||||
|
/// ## Why is this bad?
|
||||||
|
/// `if` statements with many Boolean expressions are harder to understand
|
||||||
|
/// and maintain. Consider assigning the result of the Boolean expression,
|
||||||
|
/// or any of its sub-expressions, to a variable.
|
||||||
|
///
|
||||||
|
/// ## Example
|
||||||
|
/// ```python
|
||||||
|
/// if a and b and c and d and e and f and g and h:
|
||||||
|
/// ...
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ## Options
|
||||||
|
/// - `pylint.max-bool-expr`
|
||||||
|
#[violation]
|
||||||
|
pub struct TooManyBooleanExpressions {
|
||||||
|
expressions: usize,
|
||||||
|
max_expressions: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Violation for TooManyBooleanExpressions {
|
||||||
|
#[derive_message_formats]
|
||||||
|
fn message(&self) -> String {
|
||||||
|
let TooManyBooleanExpressions {
|
||||||
|
expressions,
|
||||||
|
max_expressions,
|
||||||
|
} = self;
|
||||||
|
format!("Too many Boolean expressions ({expressions} > {max_expressions})")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// PLR0916
|
||||||
|
pub(crate) fn too_many_boolean_expressions(checker: &mut Checker, stmt: &StmtIf) {
|
||||||
|
if let Some(bool_op) = stmt.test.as_bool_op_expr() {
|
||||||
|
let expressions = count_bools(bool_op);
|
||||||
|
if expressions > checker.settings.pylint.max_bool_expr {
|
||||||
|
checker.diagnostics.push(Diagnostic::new(
|
||||||
|
TooManyBooleanExpressions {
|
||||||
|
expressions,
|
||||||
|
max_expressions: checker.settings.pylint.max_bool_expr,
|
||||||
|
},
|
||||||
|
bool_op.range(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for elif in &stmt.elif_else_clauses {
|
||||||
|
if let Some(bool_op) = elif.test.as_ref().and_then(Expr::as_bool_op_expr) {
|
||||||
|
let expressions = count_bools(bool_op);
|
||||||
|
if expressions > checker.settings.pylint.max_bool_expr {
|
||||||
|
checker.diagnostics.push(Diagnostic::new(
|
||||||
|
TooManyBooleanExpressions {
|
||||||
|
expressions,
|
||||||
|
max_expressions: checker.settings.pylint.max_bool_expr,
|
||||||
|
},
|
||||||
|
bool_op.range(),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Count the number of Boolean expressions in a `bool_op` expression.
|
||||||
|
fn count_bools(bool_op: &ast::ExprBoolOp) -> usize {
|
||||||
|
bool_op
|
||||||
|
.values
|
||||||
|
.iter()
|
||||||
|
.map(|expr| {
|
||||||
|
if let Expr::BoolOp(bool_op) = expr {
|
||||||
|
count_bools(bool_op)
|
||||||
|
} else {
|
||||||
|
1
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.sum::<usize>()
|
||||||
|
}
|
|
@ -40,6 +40,7 @@ pub struct Settings {
|
||||||
pub allow_magic_value_types: Vec<ConstantType>,
|
pub allow_magic_value_types: Vec<ConstantType>,
|
||||||
pub max_args: usize,
|
pub max_args: usize,
|
||||||
pub max_returns: usize,
|
pub max_returns: usize,
|
||||||
|
pub max_bool_expr: usize,
|
||||||
pub max_branches: usize,
|
pub max_branches: usize,
|
||||||
pub max_statements: usize,
|
pub max_statements: usize,
|
||||||
pub max_public_methods: usize,
|
pub max_public_methods: usize,
|
||||||
|
@ -51,6 +52,7 @@ impl Default for Settings {
|
||||||
allow_magic_value_types: vec![ConstantType::Str, ConstantType::Bytes],
|
allow_magic_value_types: vec![ConstantType::Str, ConstantType::Bytes],
|
||||||
max_args: 5,
|
max_args: 5,
|
||||||
max_returns: 6,
|
max_returns: 6,
|
||||||
|
max_bool_expr: 5,
|
||||||
max_branches: 12,
|
max_branches: 12,
|
||||||
max_statements: 50,
|
max_statements: 50,
|
||||||
max_public_methods: 20,
|
max_public_methods: 20,
|
||||||
|
|
|
@ -0,0 +1,214 @@
|
||||||
|
---
|
||||||
|
source: crates/ruff_linter/src/rules/pylint/mod.rs
|
||||||
|
---
|
||||||
|
too_many_boolean_expressions.py:11:6: PLR0916 Too many Boolean expressions (6 > 5)
|
||||||
|
|
|
||||||
|
9 | elif (a and b) and c and d and e:
|
||||||
|
10 | ...
|
||||||
|
11 | elif (a and b) and c and d and e and f:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
12 | ...
|
||||||
|
13 | elif (a and b) and c and d and e and f and g:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:13:6: PLR0916 Too many Boolean expressions (7 > 5)
|
||||||
|
|
|
||||||
|
11 | elif (a and b) and c and d and e and f:
|
||||||
|
12 | ...
|
||||||
|
13 | elif (a and b) and c and d and e and f and g:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
14 | ...
|
||||||
|
15 | elif (a and b) and c and d and e and f and g and h:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:15:6: PLR0916 Too many Boolean expressions (8 > 5)
|
||||||
|
|
|
||||||
|
13 | elif (a and b) and c and d and e and f and g:
|
||||||
|
14 | ...
|
||||||
|
15 | elif (a and b) and c and d and e and f and g and h:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
16 | ...
|
||||||
|
17 | elif (a and b) and c and d and e and f and g and h and i:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:17:6: PLR0916 Too many Boolean expressions (9 > 5)
|
||||||
|
|
|
||||||
|
15 | elif (a and b) and c and d and e and f and g and h:
|
||||||
|
16 | ...
|
||||||
|
17 | elif (a and b) and c and d and e and f and g and h and i:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
18 | ...
|
||||||
|
19 | elif (a and b) and c and d and e and f and g and h and i and j:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:19:6: PLR0916 Too many Boolean expressions (10 > 5)
|
||||||
|
|
|
||||||
|
17 | elif (a and b) and c and d and e and f and g and h and i:
|
||||||
|
18 | ...
|
||||||
|
19 | elif (a and b) and c and d and e and f and g and h and i and j:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
20 | ...
|
||||||
|
21 | elif (a and b) and c and d and e and f and g and h and i and j and k:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:21:6: PLR0916 Too many Boolean expressions (11 > 5)
|
||||||
|
|
|
||||||
|
19 | elif (a and b) and c and d and e and f and g and h and i and j:
|
||||||
|
20 | ...
|
||||||
|
21 | elif (a and b) and c and d and e and f and g and h and i and j and k:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
22 | ...
|
||||||
|
23 | elif (a and b) and c and d and e and f and g and h and i and j and k and l:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:23:6: PLR0916 Too many Boolean expressions (12 > 5)
|
||||||
|
|
|
||||||
|
21 | elif (a and b) and c and d and e and f and g and h and i and j and k:
|
||||||
|
22 | ...
|
||||||
|
23 | elif (a and b) and c and d and e and f and g and h and i and j and k and l:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
24 | ...
|
||||||
|
25 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:25:6: PLR0916 Too many Boolean expressions (13 > 5)
|
||||||
|
|
|
||||||
|
23 | elif (a and b) and c and d and e and f and g and h and i and j and k and l:
|
||||||
|
24 | ...
|
||||||
|
25 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
26 | ...
|
||||||
|
27 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:27:6: PLR0916 Too many Boolean expressions (14 > 5)
|
||||||
|
|
|
||||||
|
25 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m:
|
||||||
|
26 | ...
|
||||||
|
27 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
28 | ...
|
||||||
|
29 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:29:6: PLR0916 Too many Boolean expressions (15 > 5)
|
||||||
|
|
|
||||||
|
27 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n:
|
||||||
|
28 | ...
|
||||||
|
29 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
30 | ...
|
||||||
|
31 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:31:6: PLR0916 Too many Boolean expressions (16 > 5)
|
||||||
|
|
|
||||||
|
29 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o:
|
||||||
|
30 | ...
|
||||||
|
31 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
32 | ...
|
||||||
|
33 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:33:6: PLR0916 Too many Boolean expressions (17 > 5)
|
||||||
|
|
|
||||||
|
31 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p:
|
||||||
|
32 | ...
|
||||||
|
33 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
34 | ...
|
||||||
|
35 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:35:6: PLR0916 Too many Boolean expressions (18 > 5)
|
||||||
|
|
|
||||||
|
33 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q:
|
||||||
|
34 | ...
|
||||||
|
35 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
36 | ...
|
||||||
|
37 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:37:6: PLR0916 Too many Boolean expressions (19 > 5)
|
||||||
|
|
|
||||||
|
35 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r:
|
||||||
|
36 | ...
|
||||||
|
37 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
38 | ...
|
||||||
|
39 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:39:6: PLR0916 Too many Boolean expressions (20 > 5)
|
||||||
|
|
|
||||||
|
37 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s:
|
||||||
|
38 | ...
|
||||||
|
39 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
40 | ...
|
||||||
|
41 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:41:6: PLR0916 Too many Boolean expressions (21 > 5)
|
||||||
|
|
|
||||||
|
39 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t:
|
||||||
|
40 | ...
|
||||||
|
41 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
42 | ...
|
||||||
|
43 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:43:6: PLR0916 Too many Boolean expressions (22 > 5)
|
||||||
|
|
|
||||||
|
41 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u:
|
||||||
|
42 | ...
|
||||||
|
43 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
44 | ...
|
||||||
|
45 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:45:6: PLR0916 Too many Boolean expressions (23 > 5)
|
||||||
|
|
|
||||||
|
43 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v:
|
||||||
|
44 | ...
|
||||||
|
45 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
46 | ...
|
||||||
|
47 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:47:6: PLR0916 Too many Boolean expressions (24 > 5)
|
||||||
|
|
|
||||||
|
45 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w:
|
||||||
|
46 | ...
|
||||||
|
47 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
48 | ...
|
||||||
|
49 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:49:6: PLR0916 Too many Boolean expressions (25 > 5)
|
||||||
|
|
|
||||||
|
47 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x:
|
||||||
|
48 | ...
|
||||||
|
49 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
50 | ...
|
||||||
|
51 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y and z:
|
||||||
|
|
|
||||||
|
|
||||||
|
too_many_boolean_expressions.py:51:6: PLR0916 Too many Boolean expressions (26 > 5)
|
||||||
|
|
|
||||||
|
49 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y:
|
||||||
|
50 | ...
|
||||||
|
51 | elif (a and b) and c and d and e and f and g and h and i and j and k and l and m and n and o and p and q and r and s and t and u and v and w and x and y and z:
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLR0916
|
||||||
|
52 | ...
|
||||||
|
53 | else:
|
||||||
|
|
|
||||||
|
|
||||||
|
|
|
@ -2379,6 +2379,11 @@ pub struct PylintOptions {
|
||||||
example = r"max-public-methods = 20"
|
example = r"max-public-methods = 20"
|
||||||
)]
|
)]
|
||||||
pub max_public_methods: Option<usize>,
|
pub max_public_methods: Option<usize>,
|
||||||
|
|
||||||
|
/// Maximum number of Boolean expressions allowed within a single `if` statement
|
||||||
|
/// (see: `PLR0916`).
|
||||||
|
#[option(default = r"5", value_type = "int", example = r"max-bool-expr = 5")]
|
||||||
|
pub max_bool_expr: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl PylintOptions {
|
impl PylintOptions {
|
||||||
|
@ -2389,6 +2394,7 @@ impl PylintOptions {
|
||||||
.allow_magic_value_types
|
.allow_magic_value_types
|
||||||
.unwrap_or(defaults.allow_magic_value_types),
|
.unwrap_or(defaults.allow_magic_value_types),
|
||||||
max_args: self.max_args.unwrap_or(defaults.max_args),
|
max_args: self.max_args.unwrap_or(defaults.max_args),
|
||||||
|
max_bool_expr: self.max_bool_expr.unwrap_or(defaults.max_bool_expr),
|
||||||
max_returns: self.max_returns.unwrap_or(defaults.max_returns),
|
max_returns: self.max_returns.unwrap_or(defaults.max_returns),
|
||||||
max_branches: self.max_branches.unwrap_or(defaults.max_branches),
|
max_branches: self.max_branches.unwrap_or(defaults.max_branches),
|
||||||
max_statements: self.max_statements.unwrap_or(defaults.max_statements),
|
max_statements: self.max_statements.unwrap_or(defaults.max_statements),
|
||||||
|
|
10
ruff.schema.json
generated
10
ruff.schema.json
generated
|
@ -2214,6 +2214,15 @@
|
||||||
"format": "uint",
|
"format": "uint",
|
||||||
"minimum": 0.0
|
"minimum": 0.0
|
||||||
},
|
},
|
||||||
|
"max-bool-expr": {
|
||||||
|
"description": "Maximum number of Boolean expressions allowed within a single `if` statement (see: `PLR0916`).",
|
||||||
|
"type": [
|
||||||
|
"integer",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"format": "uint",
|
||||||
|
"minimum": 0.0
|
||||||
|
},
|
||||||
"max-branches": {
|
"max-branches": {
|
||||||
"description": "Maximum number of branches allowed for a function or method body (see: `PLR0912`).",
|
"description": "Maximum number of branches allowed for a function or method body (see: `PLR0912`).",
|
||||||
"type": [
|
"type": [
|
||||||
|
@ -2949,6 +2958,7 @@
|
||||||
"PLR0912",
|
"PLR0912",
|
||||||
"PLR0913",
|
"PLR0913",
|
||||||
"PLR0915",
|
"PLR0915",
|
||||||
|
"PLR0916",
|
||||||
"PLR1",
|
"PLR1",
|
||||||
"PLR17",
|
"PLR17",
|
||||||
"PLR170",
|
"PLR170",
|
||||||
|
|
|
@ -68,6 +68,7 @@ KNOWN_FORMATTING_VIOLATIONS = [
|
||||||
"surrounding-whitespace",
|
"surrounding-whitespace",
|
||||||
"tab-indentation",
|
"tab-indentation",
|
||||||
"too-few-spaces-before-inline-comment",
|
"too-few-spaces-before-inline-comment",
|
||||||
|
"too-many-boolean-expressions",
|
||||||
"trailing-comma-on-bare-tuple",
|
"trailing-comma-on-bare-tuple",
|
||||||
"triple-single-quotes",
|
"triple-single-quotes",
|
||||||
"under-indentation",
|
"under-indentation",
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue