[pylint] Detect invalid default value type for os.environ.get (PLW1508) (#16674)

## Summary
This PR stabilizes the new behavior introduced in
https://github.com/astral-sh/ruff/pull/14512 to also detect defalut
value arguemnts to `os.environ.get` that have an invalid type (not
`str`).
There's an upstream issue for this behavior change
https://github.com/pylint-dev/pylint/issues/10092 that was accepted and
a PR, but it hasn't been merged yet.

This behavior change was first shipped with Ruff 0.8.1 (Nov 22). 

There has only be one PR since the new behavior was introduced but it
was unrelated to the scope increase
(https://github.com/astral-sh/ruff/pull/14841).
This commit is contained in:
Micha Reiser 2025-03-13 08:43:08 +01:00
parent b9ed3e3876
commit 7af5b98606
4 changed files with 14 additions and 71 deletions

View file

@ -445,7 +445,6 @@ mod tests {
Rule::RepeatedEqualityComparison, Rule::RepeatedEqualityComparison,
Path::new("repeated_equality_comparison.py") Path::new("repeated_equality_comparison.py")
)] )]
#[test_case(Rule::InvalidEnvvarDefault, Path::new("invalid_envvar_default.py"))]
#[test_case(Rule::BadStrStripCall, Path::new("bad_str_strip_call.py"))] #[test_case(Rule::BadStrStripCall, Path::new("bad_str_strip_call.py"))]
#[test_case( #[test_case(
Rule::BadStaticmethodArgument, Rule::BadStaticmethodArgument,

View file

@ -52,14 +52,10 @@ pub(crate) fn invalid_envvar_default(checker: &Checker, call: &ast::ExprCall) {
.semantic() .semantic()
.resolve_qualified_name(&call.func) .resolve_qualified_name(&call.func)
.is_some_and(|qualified_name| { .is_some_and(|qualified_name| {
if checker.settings.preview.is_enabled() { matches!(
matches!( qualified_name.segments(),
qualified_name.segments(), ["os", "getenv"] | ["os", "environ", "get"]
["os", "getenv"] | ["os", "environ", "get"] )
)
} else {
matches!(qualified_name.segments(), ["os", "getenv"])
}
}) })
{ {
// Find the `default` argument, if it exists. // Find the `default` argument, if it exists.

View file

@ -50,3 +50,13 @@ invalid_envvar_default.py:14:17: PLW1508 Invalid type for environment variable d
15 | os.environ.get("TEST", 12) # [invalid-envvar-default] 15 | os.environ.get("TEST", 12) # [invalid-envvar-default]
16 | os.environ.get("TEST", "AA" * 12) 16 | os.environ.get("TEST", "AA" * 12)
| |
invalid_envvar_default.py:15:24: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
13 | os.getenv("AA", "GOOD" if Z else "BAR")
14 | os.getenv("AA", 1 if Z else "BAR") # [invalid-envvar-default]
15 | os.environ.get("TEST", 12) # [invalid-envvar-default]
| ^^ PLW1508
16 | os.environ.get("TEST", "AA" * 12)
17 | os.environ.get("TEST", 13 * "AA")
|

View file

@ -1,62 +0,0 @@
---
source: crates/ruff_linter/src/rules/pylint/mod.rs
---
invalid_envvar_default.py:3:29: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
1 | import os
2 |
3 | tempVar = os.getenv("TEST", 12) # [invalid-envvar-default]
| ^^ PLW1508
4 | goodVar = os.getenv("TESTING", None)
5 | dictVarBad = os.getenv("AAA", {"a", 7}) # [invalid-envvar-default]
|
invalid_envvar_default.py:5:31: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
3 | tempVar = os.getenv("TEST", 12) # [invalid-envvar-default]
4 | goodVar = os.getenv("TESTING", None)
5 | dictVarBad = os.getenv("AAA", {"a", 7}) # [invalid-envvar-default]
| ^^^^^^^^ PLW1508
6 | print(os.getenv("TEST", False)) # [invalid-envvar-default]
7 | os.getenv("AA", "GOOD")
|
invalid_envvar_default.py:6:25: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
4 | goodVar = os.getenv("TESTING", None)
5 | dictVarBad = os.getenv("AAA", {"a", 7}) # [invalid-envvar-default]
6 | print(os.getenv("TEST", False)) # [invalid-envvar-default]
| ^^^^^ PLW1508
7 | os.getenv("AA", "GOOD")
8 | os.getenv("AA", f"GOOD")
|
invalid_envvar_default.py:10:17: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
8 | os.getenv("AA", f"GOOD")
9 | os.getenv("AA", "GOOD" + "BAR")
10 | os.getenv("AA", "GOOD" + 1)
| ^^^^^^^^^^ PLW1508
11 | os.getenv("AA", "GOOD %s" % "BAR")
12 | os.getenv("B", Z)
|
invalid_envvar_default.py:14:17: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
12 | os.getenv("B", Z)
13 | os.getenv("AA", "GOOD" if Z else "BAR")
14 | os.getenv("AA", 1 if Z else "BAR") # [invalid-envvar-default]
| ^^^^^^^^^^^^^^^^^ PLW1508
15 | os.environ.get("TEST", 12) # [invalid-envvar-default]
16 | os.environ.get("TEST", "AA" * 12)
|
invalid_envvar_default.py:15:24: PLW1508 Invalid type for environment variable default; expected `str` or `None`
|
13 | os.getenv("AA", "GOOD" if Z else "BAR")
14 | os.getenv("AA", 1 if Z else "BAR") # [invalid-envvar-default]
15 | os.environ.get("TEST", 12) # [invalid-envvar-default]
| ^^ PLW1508
16 | os.environ.get("TEST", "AA" * 12)
17 | os.environ.get("TEST", 13 * "AA")
|