Skip to content

Commit c359cf4

Browse files
committed
add invalid-envvar-default check for os.environ.get; add its functional test
1 parent a49e11a commit c359cf4

File tree

3 files changed

+146
-33
lines changed

3 files changed

+146
-33
lines changed

pylint/checkers/stdlib.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,14 @@ def visit_call(self, node: nodes.Call) -> None:
692692
self._check_for_check_kw_in_run(node)
693693
elif name in DEBUG_BREAKPOINTS:
694694
self.add_message("forgotten-debug-statement", node=node)
695+
elif (
696+
isinstance(inferred, astroid.BoundMethod)
697+
and self.is_os_environ_get(node)
698+
and utils.is_builtin_object(inferred)
699+
):
700+
# when os.environ.get() is inferred it creates a "builtins.dict" and "_collections_abc.Mapping"
701+
self._check_env_function(node, inferred)
702+
695703
self.check_deprecated_method(node, inferred)
696704

697705
@utils.only_required_for_messages("boolean-datetime")
@@ -892,7 +900,9 @@ def _check_open_call(
892900
"unspecified-encoding", node=node, confidence=confidence
893901
)
894902

895-
def _check_env_function(self, node: nodes.Call, infer: nodes.FunctionDef) -> None:
903+
def _check_env_function(
904+
self, node: nodes.Call, infer: nodes.FunctionDef | astroid.BoundMethod
905+
) -> None:
896906
env_name_kwarg = "key"
897907
env_value_kwarg = "default"
898908
if node.keywords:
@@ -934,7 +944,7 @@ def _check_env_function(self, node: nodes.Call, infer: nodes.FunctionDef) -> Non
934944
def _check_invalid_envvar_value(
935945
self,
936946
node: nodes.Call,
937-
infer: nodes.FunctionDef,
947+
infer: nodes.FunctionDef | astroid.BoundMethod,
938948
message: str,
939949
call_arg: InferenceResult | None,
940950
allow_none: bool,
@@ -954,6 +964,17 @@ def _check_invalid_envvar_value(
954964
else:
955965
self.add_message(message, node=node, args=(name, call_arg.pytype()))
956966

967+
def is_os_environ_get(self, node: nodes.Call) -> bool:
968+
try:
969+
return (
970+
isinstance(node.func, nodes.Attribute)
971+
and node.func.attrname == "get"
972+
and node.func.expr.attrname == "environ"
973+
and node.func.expr.expr.name == "os"
974+
)
975+
except AttributeError:
976+
return False
977+
957978
def deprecated_methods(self) -> set[str]:
958979
return self._deprecated_methods
959980

tests/functional/i/invalid/invalid_envvar_value.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# pylint: disable=useless-return,missing-docstring
2+
import os
23
from os import getenv
34

45

@@ -82,3 +83,62 @@ def deep_function_returning_bytes():
8283
getenv(key='TEST', default=function_returning_none())
8384
getenv(key='TEST', default=function_returning_string())
8485
getenv(key='TEST', default=function_returning_bytes()) # [invalid-envvar-default]
86+
87+
os.environ.get() # pylint: disable=no-value-for-parameter
88+
89+
os.environ.get(b"TEST") # [invalid-envvar-value]
90+
os.environ.get("TEST")
91+
os.environ.get(None) # [invalid-envvar-value]
92+
os.environ.get(["Crap"]) # [invalid-envvar-value]
93+
os.environ.get(function_returning_bytes()) # [invalid-envvar-value]
94+
os.environ.get(deep_function_returning_bytes()) # [invalid-envvar-value]
95+
os.environ.get(function_returning_list()) # [invalid-envvar-value]
96+
os.environ.get(function_returning_none()) # [invalid-envvar-value]
97+
os.environ.get(function_returning_string())
98+
os.environ.get(deep_function_returning_string())
99+
100+
os.environ.get(b"TEST", "default") # [invalid-envvar-value]
101+
os.environ.get("TEST", "default")
102+
os.environ.get(None, "default") # [invalid-envvar-value]
103+
os.environ.get(["Crap"], "default") # [invalid-envvar-value]
104+
os.environ.get(function_returning_bytes(), "default") # [invalid-envvar-value]
105+
os.environ.get(function_returning_list(), "default") # [invalid-envvar-value]
106+
os.environ.get(function_returning_none(), "default") # [invalid-envvar-value]
107+
os.environ.get(function_returning_string(), "default")
108+
109+
os.environ.get(key=b"TEST") # [invalid-envvar-value]
110+
os.environ.get(key="TEST")
111+
os.environ.get(key=None) # [invalid-envvar-value]
112+
os.environ.get(key=["Crap"]) # [invalid-envvar-value]
113+
os.environ.get(key=function_returning_bytes()) # [invalid-envvar-value]
114+
os.environ.get(key=function_returning_list()) # [invalid-envvar-value]
115+
os.environ.get(key=function_returning_none()) # [invalid-envvar-value]
116+
os.environ.get(key=function_returning_string())
117+
118+
os.environ.get('TEST', "value")
119+
os.environ.get('TEST', []) # [invalid-envvar-default]
120+
os.environ.get('TEST', None)
121+
os.environ.get('TEST', b"123") # [invalid-envvar-default]
122+
os.environ.get('TEST', function_returning_list()) # [invalid-envvar-default]
123+
os.environ.get('TEST', function_returning_none())
124+
os.environ.get('TEST', function_returning_string())
125+
os.environ.get('TEST', function_returning_bytes()) # [invalid-envvar-default]
126+
127+
os.environ.get('TEST', default="value")
128+
os.environ.get('TEST', default=[]) # [invalid-envvar-default]
129+
os.environ.get('TEST', default=None)
130+
os.environ.get('TEST', default=b"123") # [invalid-envvar-default]
131+
os.environ.get('TEST', default=function_returning_list()) # [invalid-envvar-default]
132+
os.environ.get('TEST', default=function_returning_none())
133+
os.environ.get('TEST', default=function_returning_string())
134+
os.environ.get('TEST', default=function_returning_bytes()) # [invalid-envvar-default]
135+
136+
os.environ.get(key='TEST')
137+
os.environ.get(key='TEST', default="value")
138+
os.environ.get(key='TEST', default=b"value") # [invalid-envvar-default]
139+
os.environ.get(key='TEST', default=["Crap"]) # [invalid-envvar-default]
140+
os.environ.get(key='TEST', default=function_returning_list()) # [invalid-envvar-default]
141+
os.environ.get(key='TEST', default=function_returning_none())
142+
os.environ.get(key='TEST', default=function_returning_string())
143+
os.environ.get(key='TEST', default=function_returning_bytes()) # [invalid-envvar-default]
144+
os.environ.get(key='TEST', default=function_returning_bytes()) # [invalid-envvar-default]
Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,63 @@
1-
invalid-envvar-value:30:0:30:15::os.getenv does not support builtins.bytes type argument:UNDEFINED
2-
invalid-envvar-value:32:0:32:12::os.getenv does not support builtins.NoneType type argument:UNDEFINED
3-
invalid-envvar-value:33:0:33:16::os.getenv does not support builtins.list type argument:UNDEFINED
4-
invalid-envvar-value:34:0:34:34::os.getenv does not support builtins.bytes type argument:UNDEFINED
5-
invalid-envvar-value:35:0:35:39::os.getenv does not support builtins.bytes type argument:UNDEFINED
6-
invalid-envvar-value:36:0:36:33::os.getenv does not support builtins.list type argument:UNDEFINED
7-
invalid-envvar-value:37:0:37:33::os.getenv does not support builtins.NoneType type argument:UNDEFINED
8-
invalid-envvar-value:41:0:41:26::os.getenv does not support builtins.bytes type argument:UNDEFINED
9-
invalid-envvar-value:43:0:43:23::os.getenv does not support builtins.NoneType type argument:UNDEFINED
10-
invalid-envvar-value:44:0:44:27::os.getenv does not support builtins.list type argument:UNDEFINED
11-
invalid-envvar-value:45:0:45:45::os.getenv does not support builtins.bytes type argument:UNDEFINED
12-
invalid-envvar-value:46:0:46:44::os.getenv does not support builtins.list type argument:UNDEFINED
13-
invalid-envvar-value:47:0:47:44::os.getenv does not support builtins.NoneType type argument:UNDEFINED
14-
invalid-envvar-value:50:0:50:19::os.getenv does not support builtins.bytes type argument:UNDEFINED
15-
invalid-envvar-value:52:0:52:16::os.getenv does not support builtins.NoneType type argument:UNDEFINED
16-
invalid-envvar-value:53:0:53:20::os.getenv does not support builtins.list type argument:UNDEFINED
17-
invalid-envvar-value:54:0:54:38::os.getenv does not support builtins.bytes type argument:UNDEFINED
18-
invalid-envvar-value:55:0:55:37::os.getenv does not support builtins.list type argument:UNDEFINED
19-
invalid-envvar-value:56:0:56:37::os.getenv does not support builtins.NoneType type argument:UNDEFINED
20-
invalid-envvar-default:60:0:60:18::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
21-
invalid-envvar-default:62:0:62:22::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
22-
invalid-envvar-default:63:0:63:41::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
23-
invalid-envvar-default:66:0:66:42::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
24-
invalid-envvar-default:69:0:69:26::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
25-
invalid-envvar-default:71:0:71:30::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
26-
invalid-envvar-default:72:0:72:49::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
27-
invalid-envvar-default:75:0:75:50::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
28-
invalid-envvar-default:79:0:79:36::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
29-
invalid-envvar-default:80:0:80:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
30-
invalid-envvar-default:81:0:81:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
31-
invalid-envvar-default:84:0:84:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
1+
invalid-envvar-value:31:0:31:15::os.getenv does not support builtins.bytes type argument:UNDEFINED
2+
invalid-envvar-value:33:0:33:12::os.getenv does not support builtins.NoneType type argument:UNDEFINED
3+
invalid-envvar-value:34:0:34:16::os.getenv does not support builtins.list type argument:UNDEFINED
4+
invalid-envvar-value:35:0:35:34::os.getenv does not support builtins.bytes type argument:UNDEFINED
5+
invalid-envvar-value:36:0:36:39::os.getenv does not support builtins.bytes type argument:UNDEFINED
6+
invalid-envvar-value:37:0:37:33::os.getenv does not support builtins.list type argument:UNDEFINED
7+
invalid-envvar-value:38:0:38:33::os.getenv does not support builtins.NoneType type argument:UNDEFINED
8+
invalid-envvar-value:42:0:42:26::os.getenv does not support builtins.bytes type argument:UNDEFINED
9+
invalid-envvar-value:44:0:44:23::os.getenv does not support builtins.NoneType type argument:UNDEFINED
10+
invalid-envvar-value:45:0:45:27::os.getenv does not support builtins.list type argument:UNDEFINED
11+
invalid-envvar-value:46:0:46:45::os.getenv does not support builtins.bytes type argument:UNDEFINED
12+
invalid-envvar-value:47:0:47:44::os.getenv does not support builtins.list type argument:UNDEFINED
13+
invalid-envvar-value:48:0:48:44::os.getenv does not support builtins.NoneType type argument:UNDEFINED
14+
invalid-envvar-value:51:0:51:19::os.getenv does not support builtins.bytes type argument:UNDEFINED
15+
invalid-envvar-value:53:0:53:16::os.getenv does not support builtins.NoneType type argument:UNDEFINED
16+
invalid-envvar-value:54:0:54:20::os.getenv does not support builtins.list type argument:UNDEFINED
17+
invalid-envvar-value:55:0:55:38::os.getenv does not support builtins.bytes type argument:UNDEFINED
18+
invalid-envvar-value:56:0:56:37::os.getenv does not support builtins.list type argument:UNDEFINED
19+
invalid-envvar-value:57:0:57:37::os.getenv does not support builtins.NoneType type argument:UNDEFINED
20+
invalid-envvar-default:61:0:61:18::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
21+
invalid-envvar-default:63:0:63:22::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
22+
invalid-envvar-default:64:0:64:41::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
23+
invalid-envvar-default:67:0:67:42::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
24+
invalid-envvar-default:70:0:70:26::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
25+
invalid-envvar-default:72:0:72:30::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
26+
invalid-envvar-default:73:0:73:49::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
27+
invalid-envvar-default:76:0:76:50::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
28+
invalid-envvar-default:80:0:80:36::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
29+
invalid-envvar-default:81:0:81:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
30+
invalid-envvar-default:82:0:82:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED
31+
invalid-envvar-default:85:0:85:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED
32+
invalid-envvar-value:89:0:89:23::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
33+
invalid-envvar-value:91:0:91:20::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED
34+
invalid-envvar-value:92:0:92:24::builtins.dict.get does not support builtins.list type argument:UNDEFINED
35+
invalid-envvar-value:93:0:93:42::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
36+
invalid-envvar-value:94:0:94:47::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
37+
invalid-envvar-value:95:0:95:41::builtins.dict.get does not support builtins.list type argument:UNDEFINED
38+
invalid-envvar-value:96:0:96:41::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED
39+
invalid-envvar-value:100:0:100:34::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
40+
invalid-envvar-value:102:0:102:31::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED
41+
invalid-envvar-value:103:0:103:35::builtins.dict.get does not support builtins.list type argument:UNDEFINED
42+
invalid-envvar-value:104:0:104:53::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
43+
invalid-envvar-value:105:0:105:52::builtins.dict.get does not support builtins.list type argument:UNDEFINED
44+
invalid-envvar-value:106:0:106:52::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED
45+
invalid-envvar-value:109:0:109:27::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
46+
invalid-envvar-value:111:0:111:24::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED
47+
invalid-envvar-value:112:0:112:28::builtins.dict.get does not support builtins.list type argument:UNDEFINED
48+
invalid-envvar-value:113:0:113:46::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED
49+
invalid-envvar-value:114:0:114:45::builtins.dict.get does not support builtins.list type argument:UNDEFINED
50+
invalid-envvar-value:115:0:115:45::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED
51+
invalid-envvar-default:119:0:119:26::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED
52+
invalid-envvar-default:121:0:121:30::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED
53+
invalid-envvar-default:122:0:122:49::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED
54+
invalid-envvar-default:125:0:125:50::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED
55+
invalid-envvar-default:128:0:128:34::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED
56+
invalid-envvar-default:130:0:130:38::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED
57+
invalid-envvar-default:131:0:131:57::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED
58+
invalid-envvar-default:134:0:134:58::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED
59+
invalid-envvar-default:138:0:138:44::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED
60+
invalid-envvar-default:139:0:139:44::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED
61+
invalid-envvar-default:140:0:140:61::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED
62+
invalid-envvar-default:143:0:143:62::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED
63+
invalid-envvar-default:144:0:144:62::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED

0 commit comments

Comments
 (0)