Skip to content

Commit e64d453

Browse files
authored
Fix: [unknown-option-value] False negative after --disable=all (#9491)
1 parent 9f63895 commit e64d453

File tree

4 files changed

+44
-4
lines changed

4 files changed

+44
-4
lines changed

doc/whatsnew/fragments/9403.bugfix

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
`--enable` with `--disable=all` now produces an error, when an unknown msg code is used. Internal `pylint` messages are no longer affected by `--disable=all`.
2+
3+
Closes #9403

pylint/lint/message_state_handler.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
)
1919
from pylint.interfaces import HIGH
2020
from pylint.message import MessageDefinition
21-
from pylint.typing import ManagedMessage
21+
from pylint.typing import ManagedMessage, MessageDefinitionTuple
2222
from pylint.utils.pragma_parser import (
2323
OPTION_PO,
2424
InvalidPragmaError,
@@ -37,6 +37,11 @@ class _MessageStateHandler:
3737

3838
def __init__(self, linter: PyLinter) -> None:
3939
self.linter = linter
40+
self.default_enabled_messages: dict[str, MessageDefinitionTuple] = {
41+
k: v
42+
for k, v in self.linter.msgs.items()
43+
if len(v) == 3 or v[3].get("default_enabled", True)
44+
}
4045
self._msgs_state: dict[str, bool] = {}
4146
self._options_methods = {
4247
"enable": self.enable,
@@ -84,6 +89,14 @@ def _get_messages_to_set(
8489
message_definitions.extend(
8590
self._get_messages_to_set(_msgid, enable, ignore_unknown)
8691
)
92+
if not enable:
93+
# "all" should not disable pylint's own warnings
94+
message_definitions = list(
95+
filter(
96+
lambda m: m.msgid not in self.default_enabled_messages,
97+
message_definitions,
98+
)
99+
)
87100
return message_definitions
88101

89102
# msgid is a category?

pylint/lint/run.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,13 @@ def __init__(
175175
sys.exit(code)
176176
return
177177

178-
# Display help if there are no files to lint or no checks enabled
179-
if not args or len(linter.config.disable) == len(
180-
linter.msgs_store._messages_definitions
178+
# Display help if there are no files to lint or only internal checks enabled (`--disable=all`)
179+
disable_all_msg_set = set(
180+
msg.symbol for msg in linter.msgs_store.messages
181+
) - set(msg[1] for msg in linter.default_enabled_messages.values())
182+
if not args or (
183+
len(linter.config.enable) == 0
184+
and set(linter.config.disable) == disable_all_msg_set
181185
):
182186
print("No files to lint: exiting.")
183187
sys.exit(32)

tests/test_self.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,26 @@ def test_disable_all(self) -> None:
219219
self._runtest([UNNECESSARY_LAMBDA, "--disable=all"], out=out, code=32)
220220
assert "No files to lint: exiting." in out.getvalue().strip()
221221

222+
def test_disable_all_enable_invalid(self) -> None:
223+
# Reproduces issue #9403. If disable=all is used no error was raised for invalid messages unless
224+
# unknown-option-value was manually enabled.
225+
out = StringIO()
226+
self._runtest(
227+
# Enable one valid message to not run into "No files to lint: exiting."
228+
[
229+
UNNECESSARY_LAMBDA,
230+
"--disable=all",
231+
"--enable=import-error",
232+
"--enable=foo",
233+
],
234+
out=out,
235+
code=0,
236+
)
237+
assert (
238+
"W0012: Unknown option value for '--enable', expected a valid pylint message and got 'foo'"
239+
in out.getvalue().strip()
240+
)
241+
222242
def test_output_with_verbose(self) -> None:
223243
out = StringIO()
224244
self._runtest([UNNECESSARY_LAMBDA, "--verbose"], out=out, code=4)

0 commit comments

Comments
 (0)