diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_bugbear/B028.py b/crates/ruff_linter/resources/test/fixtures/flake8_bugbear/B028.py index d8f79372e2253..943f5c4d93090 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_bugbear/B028.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_bugbear/B028.py @@ -11,6 +11,13 @@ warnings.warn("test", DeprecationWarning, stacklevel=1) warnings.warn("test", DeprecationWarning, 1) warnings.warn("test", category=DeprecationWarning, stacklevel=1) +args = ("test", DeprecationWarning, 1) +warnings.warn(*args) +kwargs = {"message": "test", "category": DeprecationWarning, "stacklevel": 1} +warnings.warn(**kwargs) +args = ("test", DeprecationWarning) +kwargs = {"stacklevel": 1} +warnings.warn(*args, **kwargs) warnings.warn( "test", diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs b/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs index 50fdbf1f62d03..fb3077283f5a7 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs +++ b/crates/ruff_linter/src/rules/flake8_bugbear/rules/no_explicit_stacklevel.rs @@ -60,7 +60,18 @@ pub(crate) fn no_explicit_stacklevel(checker: &mut Checker, call: &ast::ExprCall return; } - if call.arguments.find_argument("stacklevel", 2).is_some() { + if call.arguments.find_argument("stacklevel", 2).is_some() + || call + .arguments + .args + .iter() + .any(ruff_python_ast::Expr::is_starred_expr) + || call + .arguments + .keywords + .iter() + .any(|keyword| keyword.arg.is_none()) + { return; } let mut diagnostic = Diagnostic::new(NoExplicitStacklevel, call.func.range()); diff --git a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B028_B028.py.snap b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B028_B028.py.snap index 2330dbf281e39..f8d765b4e08c6 100644 --- a/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B028_B028.py.snap +++ b/crates/ruff_linter/src/rules/flake8_bugbear/snapshots/ruff_linter__rules__flake8_bugbear__tests__B028_B028.py.snap @@ -44,21 +44,21 @@ B028.py:9:1: B028 [*] No explicit `stacklevel` keyword argument found 12 12 | warnings.warn("test", DeprecationWarning, 1) 13 13 | warnings.warn("test", category=DeprecationWarning, stacklevel=1) -B028.py:15:1: B028 [*] No explicit `stacklevel` keyword argument found +B028.py:22:1: B028 [*] No explicit `stacklevel` keyword argument found | -13 | warnings.warn("test", category=DeprecationWarning, stacklevel=1) -14 | -15 | warnings.warn( +20 | warnings.warn(*args, **kwargs) +21 | +22 | warnings.warn( | ^^^^^^^^^^^^^ B028 -16 | "test", -17 | DeprecationWarning, +23 | "test", +24 | DeprecationWarning, | = help: Set `stacklevel=2` ℹ Unsafe fix -16 16 | "test", -17 17 | DeprecationWarning, -18 18 | # some comments here -19 |- source = None # no trailing comma - 19 |+ source = None, stacklevel=2 # no trailing comma -20 20 | ) +23 23 | "test", +24 24 | DeprecationWarning, +25 25 | # some comments here +26 |- source = None # no trailing comma + 26 |+ source = None, stacklevel=2 # no trailing comma +27 27 | )