From b24f3492444856e83891c87d135057dbdff06284 Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Sun, 17 Aug 2025 18:46:16 -0400 Subject: [PATCH 1/8] add invalid-envvar-default check for os.environ.get; add its functional test --- pylint/checkers/stdlib.py | 25 ++++- .../i/invalid/invalid_envvar_value.py | 60 ++++++++++++ .../i/invalid/invalid_envvar_value.txt | 94 +++++++++++++------ 3 files changed, 146 insertions(+), 33 deletions(-) diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index a4b89b6fd0..bf414ae569 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -692,6 +692,14 @@ def visit_call(self, node: nodes.Call) -> None: self._check_for_check_kw_in_run(node) elif name in DEBUG_BREAKPOINTS: self.add_message("forgotten-debug-statement", node=node) + elif ( + isinstance(inferred, astroid.BoundMethod) + and self.is_os_environ_get(node) + and utils.is_builtin_object(inferred) + ): + # when os.environ.get() is inferred it creates a "builtins.dict" and "_collections_abc.Mapping" + self._check_env_function(node, inferred) + self.check_deprecated_method(node, inferred) @utils.only_required_for_messages("boolean-datetime") @@ -892,7 +900,9 @@ def _check_open_call( "unspecified-encoding", node=node, confidence=confidence ) - def _check_env_function(self, node: nodes.Call, infer: nodes.FunctionDef) -> None: + def _check_env_function( + self, node: nodes.Call, infer: nodes.FunctionDef | astroid.BoundMethod + ) -> None: env_name_kwarg = "key" env_value_kwarg = "default" if node.keywords: @@ -934,7 +944,7 @@ def _check_env_function(self, node: nodes.Call, infer: nodes.FunctionDef) -> Non def _check_invalid_envvar_value( self, node: nodes.Call, - infer: nodes.FunctionDef, + infer: nodes.FunctionDef | astroid.BoundMethod, message: str, call_arg: InferenceResult | None, allow_none: bool, @@ -954,6 +964,17 @@ def _check_invalid_envvar_value( else: self.add_message(message, node=node, args=(name, call_arg.pytype())) + def is_os_environ_get(self, node: nodes.Call) -> bool: + try: + return ( + isinstance(node.func, nodes.Attribute) + and node.func.attrname == "get" + and node.func.expr.attrname == "environ" + and node.func.expr.expr.name == "os" + ) + except AttributeError: + return False + def deprecated_methods(self) -> set[str]: return self._deprecated_methods diff --git a/tests/functional/i/invalid/invalid_envvar_value.py b/tests/functional/i/invalid/invalid_envvar_value.py index 3c1a8882bf..14ca3aca91 100644 --- a/tests/functional/i/invalid/invalid_envvar_value.py +++ b/tests/functional/i/invalid/invalid_envvar_value.py @@ -1,4 +1,5 @@ # pylint: disable=useless-return,missing-docstring +import os from os import getenv @@ -82,3 +83,62 @@ def deep_function_returning_bytes(): getenv(key='TEST', default=function_returning_none()) getenv(key='TEST', default=function_returning_string()) getenv(key='TEST', default=function_returning_bytes()) # [invalid-envvar-default] + +os.environ.get() # pylint: disable=no-value-for-parameter + +os.environ.get(b"TEST") # [invalid-envvar-value] +os.environ.get("TEST") +os.environ.get(None) # [invalid-envvar-value] +os.environ.get(["Crap"]) # [invalid-envvar-value] +os.environ.get(function_returning_bytes()) # [invalid-envvar-value] +os.environ.get(deep_function_returning_bytes()) # [invalid-envvar-value] +os.environ.get(function_returning_list()) # [invalid-envvar-value] +os.environ.get(function_returning_none()) # [invalid-envvar-value] +os.environ.get(function_returning_string()) +os.environ.get(deep_function_returning_string()) + +os.environ.get(b"TEST", "default") # [invalid-envvar-value] +os.environ.get("TEST", "default") +os.environ.get(None, "default") # [invalid-envvar-value] +os.environ.get(["Crap"], "default") # [invalid-envvar-value] +os.environ.get(function_returning_bytes(), "default") # [invalid-envvar-value] +os.environ.get(function_returning_list(), "default") # [invalid-envvar-value] +os.environ.get(function_returning_none(), "default") # [invalid-envvar-value] +os.environ.get(function_returning_string(), "default") + +os.environ.get(key=b"TEST") # [invalid-envvar-value] +os.environ.get(key="TEST") +os.environ.get(key=None) # [invalid-envvar-value] +os.environ.get(key=["Crap"]) # [invalid-envvar-value] +os.environ.get(key=function_returning_bytes()) # [invalid-envvar-value] +os.environ.get(key=function_returning_list()) # [invalid-envvar-value] +os.environ.get(key=function_returning_none()) # [invalid-envvar-value] +os.environ.get(key=function_returning_string()) + +os.environ.get('TEST', "value") +os.environ.get('TEST', []) # [invalid-envvar-default] +os.environ.get('TEST', None) +os.environ.get('TEST', b"123") # [invalid-envvar-default] +os.environ.get('TEST', function_returning_list()) # [invalid-envvar-default] +os.environ.get('TEST', function_returning_none()) +os.environ.get('TEST', function_returning_string()) +os.environ.get('TEST', function_returning_bytes()) # [invalid-envvar-default] + +os.environ.get('TEST', default="value") +os.environ.get('TEST', default=[]) # [invalid-envvar-default] +os.environ.get('TEST', default=None) +os.environ.get('TEST', default=b"123") # [invalid-envvar-default] +os.environ.get('TEST', default=function_returning_list()) # [invalid-envvar-default] +os.environ.get('TEST', default=function_returning_none()) +os.environ.get('TEST', default=function_returning_string()) +os.environ.get('TEST', default=function_returning_bytes()) # [invalid-envvar-default] + +os.environ.get(key='TEST') +os.environ.get(key='TEST', default="value") +os.environ.get(key='TEST', default=b"value") # [invalid-envvar-default] +os.environ.get(key='TEST', default=["Crap"]) # [invalid-envvar-default] +os.environ.get(key='TEST', default=function_returning_list()) # [invalid-envvar-default] +os.environ.get(key='TEST', default=function_returning_none()) +os.environ.get(key='TEST', default=function_returning_string()) +os.environ.get(key='TEST', default=function_returning_bytes()) # [invalid-envvar-default] +os.environ.get(key='TEST', default=function_returning_bytes()) # [invalid-envvar-default] diff --git a/tests/functional/i/invalid/invalid_envvar_value.txt b/tests/functional/i/invalid/invalid_envvar_value.txt index 21a20826e7..7b0c61d6c6 100644 --- a/tests/functional/i/invalid/invalid_envvar_value.txt +++ b/tests/functional/i/invalid/invalid_envvar_value.txt @@ -1,31 +1,63 @@ -invalid-envvar-value:30:0:30:15::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:32:0:32:12::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:33:0:33:16::os.getenv does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:34:0:34:34::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:35:0:35:39::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:36:0:36:33::os.getenv does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:37:0:37:33::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:41:0:41:26::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:43:0:43:23::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:44:0:44:27::os.getenv does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:45:0:45:45::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:46:0:46:44::os.getenv does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:47:0:47:44::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:50:0:50:19::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:52:0:52:16::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:53:0:53:20::os.getenv does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:54:0:54:38::os.getenv does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:55:0:55:37::os.getenv does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:56:0:56:37::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-default:60:0:60:18::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:62:0:62:22::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:63:0:63:41::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:66:0:66:42::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:69:0:69:26::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:71:0:71:30::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:72:0:72:49::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:75:0:75:50::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:79:0:79:36::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:80:0:80:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:81:0:81:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:84:0:84:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-value:31:0:31:15::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:33:0:33:12::os.getenv does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:34:0:34:16::os.getenv does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:35:0:35:34::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:36:0:36:39::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:37:0:37:33::os.getenv does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:38:0:38:33::os.getenv does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:42:0:42:26::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:44:0:44:23::os.getenv does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:45:0:45:27::os.getenv does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:46:0:46:45::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:47:0:47:44::os.getenv does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:48:0:48:44::os.getenv does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:51:0:51:19::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:53:0:53:16::os.getenv does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:54:0:54:20::os.getenv does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:55:0:55:38::os.getenv does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:56:0:56:37::os.getenv does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:57:0:57:37::os.getenv does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-default:61:0:61:18::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:63:0:63:22::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:64:0:64:41::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:67:0:67:42::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:70:0:70:26::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:72:0:72:30::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:73:0:73:49::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:76:0:76:50::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:80:0:80:36::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:81:0:81:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:82:0:82:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:85:0:85:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-value:89:0:89:23::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:91:0:91:20::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:92:0:92:24::builtins.dict.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:93:0:93:42::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:94:0:94:47::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:95:0:95:41::builtins.dict.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:96:0:96:41::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:100:0:100:34::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:102:0:102:31::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:103:0:103:35::builtins.dict.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:104:0:104:53::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:105:0:105:52::builtins.dict.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:106:0:106:52::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:109:0:109:27::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:111:0:111:24::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:112:0:112:28::builtins.dict.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:113:0:113:46::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:114:0:114:45::builtins.dict.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:115:0:115:45::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-default:119:0:119:26::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:121:0:121:30::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:122:0:122:49::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:125:0:125:50::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:128:0:128:34::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:130:0:130:38::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:131:0:131:57::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:134:0:134:58::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:138:0:138:44::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:139:0:139:44::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:140:0:140:61::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:143:0:143:62::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:144:0:144:62::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED From 5915efcf94cebe091e591118a6b04123ae96308f Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Tue, 19 Aug 2025 17:38:32 -0400 Subject: [PATCH 2/8] update documentation examples of invalid-envvar-default --- doc/data/messages/i/invalid-envvar-default/bad.py | 1 + doc/data/messages/i/invalid-envvar-default/good.py | 1 + doc/data/messages/i/invalid-envvar-value/bad.py | 1 + doc/data/messages/i/invalid-envvar-value/good.py | 1 + 4 files changed, 4 insertions(+) diff --git a/doc/data/messages/i/invalid-envvar-default/bad.py b/doc/data/messages/i/invalid-envvar-default/bad.py index 9b564b9c8c..f87b0de304 100644 --- a/doc/data/messages/i/invalid-envvar-default/bad.py +++ b/doc/data/messages/i/invalid-envvar-default/bad.py @@ -1,3 +1,4 @@ import os env = os.getenv("SECRET_KEY", 1) # [invalid-envvar-default] +env = os.environ.get("SECRET_KEY", 1) # [invalid-envvar-default] diff --git a/doc/data/messages/i/invalid-envvar-default/good.py b/doc/data/messages/i/invalid-envvar-default/good.py index 103925941e..bcc41cb13c 100644 --- a/doc/data/messages/i/invalid-envvar-default/good.py +++ b/doc/data/messages/i/invalid-envvar-default/good.py @@ -1,3 +1,4 @@ import os env = os.getenv("SECRET_KEY", "1") +env = os.environ.get("SECRET_KEY", "1") diff --git a/doc/data/messages/i/invalid-envvar-value/bad.py b/doc/data/messages/i/invalid-envvar-value/bad.py index 56e60fe700..38bd20aded 100644 --- a/doc/data/messages/i/invalid-envvar-value/bad.py +++ b/doc/data/messages/i/invalid-envvar-value/bad.py @@ -1,3 +1,4 @@ import os os.getenv(1) # [invalid-envvar-value] +os.environ.get(1) # [invalid-envvar-value] diff --git a/doc/data/messages/i/invalid-envvar-value/good.py b/doc/data/messages/i/invalid-envvar-value/good.py index fd082ecfd8..dbc6fedb0c 100644 --- a/doc/data/messages/i/invalid-envvar-value/good.py +++ b/doc/data/messages/i/invalid-envvar-value/good.py @@ -1,3 +1,4 @@ import os os.getenv("1") +os.environ.get("1") From c4e283fc8cf9be475bbb5edbd44bc6baf7722b03 Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Tue, 19 Aug 2025 18:00:56 -0400 Subject: [PATCH 3/8] update error message to be os.environ.get and not builtins.dict --- pylint/checkers/stdlib.py | 4 +- .../i/invalid/invalid_envvar_value.txt | 64 +++++++++---------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index bf414ae569..611a259bb2 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -960,9 +960,9 @@ def _check_invalid_envvar_value( elif not isinstance(call_arg.value, str): emit = True if emit: - self.add_message(message, node=node, args=(name, call_arg.pytype())) + self.add_message(message, node=node, args=("os.environ.get" if self.is_os_environ_get(node) else name, call_arg.pytype())) else: - self.add_message(message, node=node, args=(name, call_arg.pytype())) + self.add_message(message, node=node, args=("os.environ.get" if self.is_os_environ_get(node) else name, call_arg.pytype())) def is_os_environ_get(self, node: nodes.Call) -> bool: try: diff --git a/tests/functional/i/invalid/invalid_envvar_value.txt b/tests/functional/i/invalid/invalid_envvar_value.txt index 7b0c61d6c6..3a85e7ab80 100644 --- a/tests/functional/i/invalid/invalid_envvar_value.txt +++ b/tests/functional/i/invalid/invalid_envvar_value.txt @@ -29,35 +29,35 @@ invalid-envvar-default:80:0:80:36::os.getenv default type is builtins.bytes. Exp invalid-envvar-default:81:0:81:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED invalid-envvar-default:82:0:82:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED invalid-envvar-default:85:0:85:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-value:89:0:89:23::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:91:0:91:20::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:92:0:92:24::builtins.dict.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:93:0:93:42::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:94:0:94:47::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:95:0:95:41::builtins.dict.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:96:0:96:41::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:100:0:100:34::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:102:0:102:31::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:103:0:103:35::builtins.dict.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:104:0:104:53::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:105:0:105:52::builtins.dict.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:106:0:106:52::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:109:0:109:27::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:111:0:111:24::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:112:0:112:28::builtins.dict.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:113:0:113:46::builtins.dict.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:114:0:114:45::builtins.dict.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:115:0:115:45::builtins.dict.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-default:119:0:119:26::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:121:0:121:30::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:122:0:122:49::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:125:0:125:50::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:128:0:128:34::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:130:0:130:38::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:131:0:131:57::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:134:0:134:58::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:138:0:138:44::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:139:0:139:44::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:140:0:140:61::builtins.dict.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:143:0:143:62::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:144:0:144:62::builtins.dict.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-value:89:0:89:23::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:91:0:91:20::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:92:0:92:24::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:93:0:93:42::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:94:0:94:47::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:95:0:95:41::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:96:0:96:41::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:100:0:100:34::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:102:0:102:31::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:103:0:103:35::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:104:0:104:53::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:105:0:105:52::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:106:0:106:52::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:109:0:109:27::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:111:0:111:24::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:112:0:112:28::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:113:0:113:46::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:114:0:114:45::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:115:0:115:45::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-default:119:0:119:26::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:121:0:121:30::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:122:0:122:49::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:125:0:125:50::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:128:0:128:34::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:130:0:130:38::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:131:0:131:57::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:134:0:134:58::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:138:0:138:44::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:139:0:139:44::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:140:0:140:61::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:143:0:143:62::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:144:0:144:62::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED From 1b655609f2676eea2144c6d3b0a1af9700c35a65 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 22:09:21 +0000 Subject: [PATCH 4/8] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pylint/checkers/stdlib.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index 611a259bb2..20ef7f1361 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -960,9 +960,23 @@ def _check_invalid_envvar_value( elif not isinstance(call_arg.value, str): emit = True if emit: - self.add_message(message, node=node, args=("os.environ.get" if self.is_os_environ_get(node) else name, call_arg.pytype())) + self.add_message( + message, + node=node, + args=( + "os.environ.get" if self.is_os_environ_get(node) else name, + call_arg.pytype(), + ), + ) else: - self.add_message(message, node=node, args=("os.environ.get" if self.is_os_environ_get(node) else name, call_arg.pytype())) + self.add_message( + message, + node=node, + args=( + "os.environ.get" if self.is_os_environ_get(node) else name, + call_arg.pytype(), + ), + ) def is_os_environ_get(self, node: nodes.Call) -> bool: try: From 4bc013152fb5fc96f2c6d65656fba328ef52bcaf Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Sat, 23 Aug 2025 15:49:41 -0400 Subject: [PATCH 5/8] update pyreverse diagram unittests; add news fragment --- doc/whatsnew/fragments/10507.false_negative | 3 +++ .../functional/class_diagrams/colorized_output/colorized.mmd | 1 + .../functional/class_diagrams/colorized_output/colorized.puml | 1 + .../class_diagrams/colorized_output/custom_colors.dot | 2 +- .../class_diagrams/colorized_output/custom_colors.puml | 1 + 5 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 doc/whatsnew/fragments/10507.false_negative diff --git a/doc/whatsnew/fragments/10507.false_negative b/doc/whatsnew/fragments/10507.false_negative new file mode 100644 index 0000000000..764aa756ea --- /dev/null +++ b/doc/whatsnew/fragments/10507.false_negative @@ -0,0 +1,3 @@ +Fix false negative for `invalid-envvar-default` to detect `os.environ.get`. + +Closes #10092 diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd index bf90bd708d..66ba27e600 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd @@ -33,6 +33,7 @@ classDiagram deprecated_classes(module: str) Iterable[str] deprecated_decorators() Iterable[str] deprecated_methods() set[str] + is_os_environ_get(node: nodes.Call) bool visit_boolop(node: nodes.BoolOp) None visit_call(node: nodes.Call) None visit_functiondef(node: nodes.FunctionDef) None diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml index fb60c29e27..4f6c5ddc6a 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml @@ -31,6 +31,7 @@ class "StdlibChecker" as pylint.checkers.stdlib.StdlibChecker #44BB99 { deprecated_classes(module: str) -> Iterable[str] deprecated_decorators() -> Iterable[str] deprecated_methods() -> set[str] + is_os_environ_get(node: nodes.Call) -> bool visit_boolop(node: nodes.BoolOp) -> None visit_call(node: nodes.Call) -> None visit_functiondef(node: nodes.FunctionDef) -> None diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot index bdf7ed2f0f..efd4ba6b7c 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot @@ -4,7 +4,7 @@ charset="utf-8" "custom_colors.CheckerCollector" [color="red", fontcolor="black", label=<{CheckerCollector|checker1
checker2
checker3
|}>, shape="record", style="filled"]; "pylint.extensions.check_elif.ElseifUsedChecker" [color="#44BB88", fontcolor="black", label=<{ElseifUsedChecker|msgs : dict
name : str
|leave_module(_: nodes.Module): None
process_tokens(tokens: list[TokenInfo]): None
visit_if(node: nodes.If): None
}>, shape="record", style="filled"]; "pylint.checkers.exceptions.ExceptionsChecker" [color="yellow", fontcolor="black", label=<{ExceptionsChecker|msgs : dict
name : str
options : tuple
|open(): None
visit_binop(node: nodes.BinOp): None
visit_compare(node: nodes.Compare): None
visit_raise(node: nodes.Raise): None
visit_try(node: nodes.Try): None
visit_trystar(node: nodes.TryStar): None
}>, shape="record", style="filled"]; -"pylint.checkers.stdlib.StdlibChecker" [color="yellow", fontcolor="black", label=<{StdlibChecker|msgs : dict[str, MessageDefinitionTuple]
name : str
|deprecated_arguments(method: str): tuple[tuple[int \| None, str], ...]
deprecated_attributes(): Iterable[str]
deprecated_classes(module: str): Iterable[str]
deprecated_decorators(): Iterable[str]
deprecated_methods(): set[str]
visit_boolop(node: nodes.BoolOp): None
visit_call(node: nodes.Call): None
visit_functiondef(node: nodes.FunctionDef): None
visit_if(node: nodes.If): None
visit_ifexp(node: nodes.IfExp): None
visit_unaryop(node: nodes.UnaryOp): None
}>, shape="record", style="filled"]; +"pylint.checkers.stdlib.StdlibChecker" [color="yellow", fontcolor="black", label=<{StdlibChecker|msgs : dict[str, MessageDefinitionTuple]
name : str
|deprecated_arguments(method: str): tuple[tuple[int \| None, str], ...]
deprecated_attributes(): Iterable[str]
deprecated_classes(module: str): Iterable[str]
deprecated_decorators(): Iterable[str]
deprecated_methods(): set[str]
is_os_environ_get(node: nodes.Call): bool
visit_boolop(node: nodes.BoolOp): None
visit_call(node: nodes.Call): None
visit_functiondef(node: nodes.FunctionDef): None
visit_if(node: nodes.If): None
visit_ifexp(node: nodes.IfExp): None
visit_unaryop(node: nodes.UnaryOp): None
}>, shape="record", style="filled"]; "pylint.checkers.exceptions.ExceptionsChecker" -> "custom_colors.CheckerCollector" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="checker1", style="solid"]; "pylint.checkers.stdlib.StdlibChecker" -> "custom_colors.CheckerCollector" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="checker3", style="solid"]; "pylint.extensions.check_elif.ElseifUsedChecker" -> "custom_colors.CheckerCollector" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="checker2", style="solid"]; diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml index ecfccde3c8..b88f830422 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml @@ -31,6 +31,7 @@ class "StdlibChecker" as pylint.checkers.stdlib.StdlibChecker #yellow { deprecated_classes(module: str) -> Iterable[str] deprecated_decorators() -> Iterable[str] deprecated_methods() -> set[str] + is_os_environ_get(node: nodes.Call) -> bool visit_boolop(node: nodes.BoolOp) -> None visit_call(node: nodes.Call) -> None visit_functiondef(node: nodes.FunctionDef) -> None From ac5a1d478e62f284c4355bc3497b7ca65de547ab Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Sat, 23 Aug 2025 16:07:04 -0400 Subject: [PATCH 6/8] fix new fragment to issue number 10092 --- .../fragments/{10507.false_negative => 10092.false_negative} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc/whatsnew/fragments/{10507.false_negative => 10092.false_negative} (100%) diff --git a/doc/whatsnew/fragments/10507.false_negative b/doc/whatsnew/fragments/10092.false_negative similarity index 100% rename from doc/whatsnew/fragments/10507.false_negative rename to doc/whatsnew/fragments/10092.false_negative From 61ba44c8eec9961bca0d3189cb6bc33087ee01b8 Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:36:59 -0400 Subject: [PATCH 7/8] check if os.environ.get is being cast to int or float; update unittest --- pylint/checkers/stdlib.py | 16 +++- .../i/invalid/invalid_envvar_value.py | 12 +++ .../i/invalid/invalid_envvar_value.txt | 88 +++++++++---------- 3 files changed, 68 insertions(+), 48 deletions(-) diff --git a/pylint/checkers/stdlib.py b/pylint/checkers/stdlib.py index 20ef7f1361..f1d05f73a4 100644 --- a/pylint/checkers/stdlib.py +++ b/pylint/checkers/stdlib.py @@ -694,7 +694,7 @@ def visit_call(self, node: nodes.Call) -> None: self.add_message("forgotten-debug-statement", node=node) elif ( isinstance(inferred, astroid.BoundMethod) - and self.is_os_environ_get(node) + and self._is_os_environ_get(node) and utils.is_builtin_object(inferred) ): # when os.environ.get() is inferred it creates a "builtins.dict" and "_collections_abc.Mapping" @@ -952,6 +952,14 @@ def _check_invalid_envvar_value( if call_arg is None or isinstance(call_arg, util.UninferableBase): return + if ( + message == "invalid-envvar-default" + and isinstance(node.parent, nodes.Call) + and isinstance(node.parent.func, nodes.Name) + and node.parent.func.name in {"int", "float"} + ): + return + name = infer.qname() if isinstance(call_arg, nodes.Const): emit = False @@ -964,7 +972,7 @@ def _check_invalid_envvar_value( message, node=node, args=( - "os.environ.get" if self.is_os_environ_get(node) else name, + "os.environ.get" if self._is_os_environ_get(node) else name, call_arg.pytype(), ), ) @@ -973,12 +981,12 @@ def _check_invalid_envvar_value( message, node=node, args=( - "os.environ.get" if self.is_os_environ_get(node) else name, + "os.environ.get" if self._is_os_environ_get(node) else name, call_arg.pytype(), ), ) - def is_os_environ_get(self, node: nodes.Call) -> bool: + def _is_os_environ_get(self, node: nodes.Call) -> bool: try: return ( isinstance(node.func, nodes.Attribute) diff --git a/tests/functional/i/invalid/invalid_envvar_value.py b/tests/functional/i/invalid/invalid_envvar_value.py index 14ca3aca91..e4fde6d9fb 100644 --- a/tests/functional/i/invalid/invalid_envvar_value.py +++ b/tests/functional/i/invalid/invalid_envvar_value.py @@ -58,6 +58,8 @@ def deep_function_returning_bytes(): getenv(key=function_returning_string()) getenv('TEST', "value") +int(getenv("TEST", 1)) +float(getenv("TEST", 1.0)) getenv('TEST', []) # [invalid-envvar-default] getenv('TEST', None) getenv('TEST', b"123") # [invalid-envvar-default] @@ -67,6 +69,8 @@ def deep_function_returning_bytes(): getenv('TEST', function_returning_bytes()) # [invalid-envvar-default] getenv('TEST', default="value") +int(getenv("TEST", default=1)) +float(getenv("TEST", default=1.0)) getenv('TEST', default=[]) # [invalid-envvar-default] getenv('TEST', default=None) getenv('TEST', default=b"123") # [invalid-envvar-default] @@ -77,6 +81,8 @@ def deep_function_returning_bytes(): getenv(key='TEST') getenv(key='TEST', default="value") +int(getenv(key="TEST", default=1)) +float(getenv(key="TEST", default=1.0)) getenv(key='TEST', default=b"value") # [invalid-envvar-default] getenv(key='TEST', default=["Crap"]) # [invalid-envvar-default] getenv(key='TEST', default=function_returning_list()) # [invalid-envvar-default] @@ -116,6 +122,8 @@ def deep_function_returning_bytes(): os.environ.get(key=function_returning_string()) os.environ.get('TEST', "value") +int(os.environ.get("TEST", 1)) +float(os.environ.get("TEST", 1.0)) os.environ.get('TEST', []) # [invalid-envvar-default] os.environ.get('TEST', None) os.environ.get('TEST', b"123") # [invalid-envvar-default] @@ -125,6 +133,8 @@ def deep_function_returning_bytes(): os.environ.get('TEST', function_returning_bytes()) # [invalid-envvar-default] os.environ.get('TEST', default="value") +int(os.environ.get("TEST", default=1)) +float(os.environ.get("TEST", default=1.0)) os.environ.get('TEST', default=[]) # [invalid-envvar-default] os.environ.get('TEST', default=None) os.environ.get('TEST', default=b"123") # [invalid-envvar-default] @@ -135,6 +145,8 @@ def deep_function_returning_bytes(): os.environ.get(key='TEST') os.environ.get(key='TEST', default="value") +int(os.environ.get(key="TEST", default=1)) +float(os.environ.get(key="TEST", default=1.0)) os.environ.get(key='TEST', default=b"value") # [invalid-envvar-default] os.environ.get(key='TEST', default=["Crap"]) # [invalid-envvar-default] os.environ.get(key='TEST', default=function_returning_list()) # [invalid-envvar-default] diff --git a/tests/functional/i/invalid/invalid_envvar_value.txt b/tests/functional/i/invalid/invalid_envvar_value.txt index 3a85e7ab80..22c6ae9288 100644 --- a/tests/functional/i/invalid/invalid_envvar_value.txt +++ b/tests/functional/i/invalid/invalid_envvar_value.txt @@ -17,47 +17,47 @@ invalid-envvar-value:54:0:54:20::os.getenv does not support builtins.list type a invalid-envvar-value:55:0:55:38::os.getenv does not support builtins.bytes type argument:UNDEFINED invalid-envvar-value:56:0:56:37::os.getenv does not support builtins.list type argument:UNDEFINED invalid-envvar-value:57:0:57:37::os.getenv does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-default:61:0:61:18::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:63:0:63:22::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:64:0:64:41::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:67:0:67:42::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:70:0:70:26::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:72:0:72:30::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:73:0:73:49::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:76:0:76:50::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:80:0:80:36::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:81:0:81:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:82:0:82:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:85:0:85:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-value:89:0:89:23::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:91:0:91:20::os.environ.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:92:0:92:24::os.environ.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:93:0:93:42::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:94:0:94:47::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:95:0:95:41::os.environ.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:96:0:96:41::os.environ.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:100:0:100:34::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:102:0:102:31::os.environ.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:103:0:103:35::os.environ.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:104:0:104:53::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:105:0:105:52::os.environ.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:106:0:106:52::os.environ.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:109:0:109:27::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:111:0:111:24::os.environ.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-value:112:0:112:28::os.environ.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:113:0:113:46::os.environ.get does not support builtins.bytes type argument:UNDEFINED -invalid-envvar-value:114:0:114:45::os.environ.get does not support builtins.list type argument:UNDEFINED -invalid-envvar-value:115:0:115:45::os.environ.get does not support builtins.NoneType type argument:UNDEFINED -invalid-envvar-default:119:0:119:26::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:121:0:121:30::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:122:0:122:49::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:125:0:125:50::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:128:0:128:34::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:130:0:130:38::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:131:0:131:57::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:134:0:134:58::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:138:0:138:44::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:139:0:139:44::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:140:0:140:61::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED -invalid-envvar-default:143:0:143:62::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED -invalid-envvar-default:144:0:144:62::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:63:0:63:18::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:65:0:65:22::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:66:0:66:41::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:69:0:69:42::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:74:0:74:26::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:76:0:76:30::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:77:0:77:49::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:80:0:80:50::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:86:0:86:36::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:87:0:87:36::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:88:0:88:53::os.getenv default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:91:0:91:54::os.getenv default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-value:95:0:95:23::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:97:0:97:20::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:98:0:98:24::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:99:0:99:42::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:100:0:100:47::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:101:0:101:41::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:102:0:102:41::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:106:0:106:34::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:108:0:108:31::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:109:0:109:35::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:110:0:110:53::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:111:0:111:52::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:112:0:112:52::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:115:0:115:27::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:117:0:117:24::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-value:118:0:118:28::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:119:0:119:46::os.environ.get does not support builtins.bytes type argument:UNDEFINED +invalid-envvar-value:120:0:120:45::os.environ.get does not support builtins.list type argument:UNDEFINED +invalid-envvar-value:121:0:121:45::os.environ.get does not support builtins.NoneType type argument:UNDEFINED +invalid-envvar-default:127:0:127:26::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:129:0:129:30::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:130:0:130:49::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:133:0:133:50::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:138:0:138:34::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:140:0:140:38::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:141:0:141:57::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:144:0:144:58::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:150:0:150:44::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:151:0:151:44::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:152:0:152:61::os.environ.get default type is builtins.list. Expected str or None.:UNDEFINED +invalid-envvar-default:155:0:155:62::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED +invalid-envvar-default:156:0:156:62::os.environ.get default type is builtins.bytes. Expected str or None.:UNDEFINED From 3b0fac23dfc0d4e3b5e44280b80281cb7b464954 Mon Sep 17 00:00:00 2001 From: Aearsears <53102185+Aearsears@users.noreply.github.com> Date: Sat, 23 Aug 2025 18:02:30 -0400 Subject: [PATCH 8/8] update pyreverse functional class diagram test --- .../functional/class_diagrams/colorized_output/colorized.mmd | 1 - .../functional/class_diagrams/colorized_output/colorized.puml | 1 - .../class_diagrams/colorized_output/custom_colors.dot | 2 +- .../class_diagrams/colorized_output/custom_colors.puml | 1 - 4 files changed, 1 insertion(+), 4 deletions(-) diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd index 66ba27e600..bf90bd708d 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.mmd @@ -33,7 +33,6 @@ classDiagram deprecated_classes(module: str) Iterable[str] deprecated_decorators() Iterable[str] deprecated_methods() set[str] - is_os_environ_get(node: nodes.Call) bool visit_boolop(node: nodes.BoolOp) None visit_call(node: nodes.Call) None visit_functiondef(node: nodes.FunctionDef) None diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml index 4f6c5ddc6a..fb60c29e27 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/colorized.puml @@ -31,7 +31,6 @@ class "StdlibChecker" as pylint.checkers.stdlib.StdlibChecker #44BB99 { deprecated_classes(module: str) -> Iterable[str] deprecated_decorators() -> Iterable[str] deprecated_methods() -> set[str] - is_os_environ_get(node: nodes.Call) -> bool visit_boolop(node: nodes.BoolOp) -> None visit_call(node: nodes.Call) -> None visit_functiondef(node: nodes.FunctionDef) -> None diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot index efd4ba6b7c..bdf7ed2f0f 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.dot @@ -4,7 +4,7 @@ charset="utf-8" "custom_colors.CheckerCollector" [color="red", fontcolor="black", label=<{CheckerCollector|checker1
checker2
checker3
|}>, shape="record", style="filled"]; "pylint.extensions.check_elif.ElseifUsedChecker" [color="#44BB88", fontcolor="black", label=<{ElseifUsedChecker|msgs : dict
name : str
|leave_module(_: nodes.Module): None
process_tokens(tokens: list[TokenInfo]): None
visit_if(node: nodes.If): None
}>, shape="record", style="filled"]; "pylint.checkers.exceptions.ExceptionsChecker" [color="yellow", fontcolor="black", label=<{ExceptionsChecker|msgs : dict
name : str
options : tuple
|open(): None
visit_binop(node: nodes.BinOp): None
visit_compare(node: nodes.Compare): None
visit_raise(node: nodes.Raise): None
visit_try(node: nodes.Try): None
visit_trystar(node: nodes.TryStar): None
}>, shape="record", style="filled"]; -"pylint.checkers.stdlib.StdlibChecker" [color="yellow", fontcolor="black", label=<{StdlibChecker|msgs : dict[str, MessageDefinitionTuple]
name : str
|deprecated_arguments(method: str): tuple[tuple[int \| None, str], ...]
deprecated_attributes(): Iterable[str]
deprecated_classes(module: str): Iterable[str]
deprecated_decorators(): Iterable[str]
deprecated_methods(): set[str]
is_os_environ_get(node: nodes.Call): bool
visit_boolop(node: nodes.BoolOp): None
visit_call(node: nodes.Call): None
visit_functiondef(node: nodes.FunctionDef): None
visit_if(node: nodes.If): None
visit_ifexp(node: nodes.IfExp): None
visit_unaryop(node: nodes.UnaryOp): None
}>, shape="record", style="filled"]; +"pylint.checkers.stdlib.StdlibChecker" [color="yellow", fontcolor="black", label=<{StdlibChecker|msgs : dict[str, MessageDefinitionTuple]
name : str
|deprecated_arguments(method: str): tuple[tuple[int \| None, str], ...]
deprecated_attributes(): Iterable[str]
deprecated_classes(module: str): Iterable[str]
deprecated_decorators(): Iterable[str]
deprecated_methods(): set[str]
visit_boolop(node: nodes.BoolOp): None
visit_call(node: nodes.Call): None
visit_functiondef(node: nodes.FunctionDef): None
visit_if(node: nodes.If): None
visit_ifexp(node: nodes.IfExp): None
visit_unaryop(node: nodes.UnaryOp): None
}>, shape="record", style="filled"]; "pylint.checkers.exceptions.ExceptionsChecker" -> "custom_colors.CheckerCollector" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="checker1", style="solid"]; "pylint.checkers.stdlib.StdlibChecker" -> "custom_colors.CheckerCollector" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="checker3", style="solid"]; "pylint.extensions.check_elif.ElseifUsedChecker" -> "custom_colors.CheckerCollector" [arrowhead="diamond", arrowtail="none", fontcolor="green", label="checker2", style="solid"]; diff --git a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml index b88f830422..ecfccde3c8 100644 --- a/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml +++ b/tests/pyreverse/functional/class_diagrams/colorized_output/custom_colors.puml @@ -31,7 +31,6 @@ class "StdlibChecker" as pylint.checkers.stdlib.StdlibChecker #yellow { deprecated_classes(module: str) -> Iterable[str] deprecated_decorators() -> Iterable[str] deprecated_methods() -> set[str] - is_os_environ_get(node: nodes.Call) -> bool visit_boolop(node: nodes.BoolOp) -> None visit_call(node: nodes.Call) -> None visit_functiondef(node: nodes.FunctionDef) -> None