Skip to content
Merged
3 changes: 3 additions & 0 deletions doc/whatsnew/fragments/9403.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
`--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`.

Closes #9403
15 changes: 14 additions & 1 deletion pylint/lint/message_state_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
)
from pylint.interfaces import HIGH
from pylint.message import MessageDefinition
from pylint.typing import ManagedMessage
from pylint.typing import ManagedMessage, MessageDefinitionTuple
from pylint.utils.pragma_parser import (
OPTION_PO,
InvalidPragmaError,
Expand All @@ -37,6 +37,11 @@ class _MessageStateHandler:

def __init__(self, linter: PyLinter) -> None:
self.linter = linter
self.default_enabled_messages: dict[str, MessageDefinitionTuple] = {
k: v
for k, v in self.linter.msgs.items()
if len(v) == 3 or v[3].get("default_enabled", True)
}
self._msgs_state: dict[str, bool] = {}
self._options_methods = {
"enable": self.enable,
Expand Down Expand Up @@ -84,6 +89,14 @@ def _get_messages_to_set(
message_definitions.extend(
self._get_messages_to_set(_msgid, enable, ignore_unknown)
)
if not enable:
# "all" should not disable pylint's own warnings
message_definitions = list(
filter(
lambda m: m.msgid not in self.default_enabled_messages,
message_definitions,
)
)
return message_definitions

# msgid is a category?
Expand Down
10 changes: 7 additions & 3 deletions pylint/lint/run.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,13 @@ def __init__(
sys.exit(code)
return

# Display help if there are no files to lint or no checks enabled
if not args or len(linter.config.disable) == len(
linter.msgs_store._messages_definitions
# Display help if there are no files to lint or only internal checks enabled (`--disable=all`)
disable_all_msg_set = set(
msg.symbol for msg in linter.msgs_store.messages
) - set(msg[1] for msg in linter.default_enabled_messages.values())
if not args or (
len(linter.config.enable) == 0
and set(linter.config.disable) == disable_all_msg_set
):
print("No files to lint: exiting.")
sys.exit(32)
Expand Down
20 changes: 20 additions & 0 deletions tests/test_self.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,26 @@ def test_disable_all(self) -> None:
self._runtest([UNNECESSARY_LAMBDA, "--disable=all"], out=out, code=32)
assert "No files to lint: exiting." in out.getvalue().strip()

def test_disable_all_enable_invalid(self) -> None:
# Reproduces issue #9403. If disable=all is used no error was raised for invalid messages unless
# unknown-option-value was manually enabled.
out = StringIO()
self._runtest(
# Enable one valid message to not run into "No files to lint: exiting."
[
UNNECESSARY_LAMBDA,
"--disable=all",
"--enable=import-error",
"--enable=foo",
],
out=out,
code=0,
)
assert (
"W0012: Unknown option value for '--enable', expected a valid pylint message and got 'foo'"
in out.getvalue().strip()
)

def test_output_with_verbose(self) -> None:
out = StringIO()
self._runtest([UNNECESSARY_LAMBDA, "--verbose"], out=out, code=4)
Expand Down