Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix: [unknown-option-value] False negative after --disable=all #9491

Merged
merged 12 commits into from
Jul 29, 2024
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
Loading