Skip to content

Commit 4a1a733

Browse files
DanielNoordPierre-Sassoulas
authored andcommitted
Create _MessageStateHandler and move all private methods
1 parent e62f76f commit 4a1a733

File tree

2 files changed

+141
-115
lines changed

2 files changed

+141
-115
lines changed
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
2+
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
3+
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
4+
5+
from __future__ import annotations
6+
7+
from typing import TYPE_CHECKING
8+
9+
from pylint import exceptions
10+
from pylint.constants import MSG_TYPES, MSG_TYPES_LONG
11+
from pylint.message import MessageDefinition
12+
from pylint.typing import ManagedMessage
13+
14+
if TYPE_CHECKING:
15+
from pylint.lint.pylinter import PyLinter
16+
17+
18+
class _MessageStateHandler:
19+
"""Class that handles message disabling & enabling and processing of inline pragma's."""
20+
21+
def __init__(self, linter: PyLinter) -> None:
22+
self.linter = linter
23+
self._msgs_state: dict[str, bool] = {}
24+
25+
def _set_one_msg_status(
26+
self, scope: str, msg: MessageDefinition, line: int | None, enable: bool
27+
) -> None:
28+
"""Set the status of an individual message."""
29+
if scope == "module":
30+
assert isinstance(line, int) # should always be int inside module scope
31+
32+
self.linter.file_state.set_msg_status(msg, line, enable)
33+
if not enable and msg.symbol != "locally-disabled":
34+
self.linter.add_message(
35+
"locally-disabled", line=line, args=(msg.symbol, msg.msgid)
36+
)
37+
else:
38+
msgs = self._msgs_state
39+
msgs[msg.msgid] = enable
40+
41+
def _get_messages_to_set(
42+
self, msgid: str, enable: bool, ignore_unknown: bool = False
43+
) -> list[MessageDefinition]:
44+
"""Do some tests and find the actual messages of which the status should be set."""
45+
message_definitions: list[MessageDefinition] = []
46+
if msgid == "all":
47+
for _msgid in MSG_TYPES:
48+
message_definitions.extend(
49+
self._get_messages_to_set(_msgid, enable, ignore_unknown)
50+
)
51+
return message_definitions
52+
53+
# msgid is a category?
54+
category_id = msgid.upper()
55+
if category_id not in MSG_TYPES:
56+
category_id_formatted = MSG_TYPES_LONG.get(category_id)
57+
else:
58+
category_id_formatted = category_id
59+
if category_id_formatted is not None:
60+
for _msgid in self.linter.msgs_store._msgs_by_category[
61+
category_id_formatted
62+
]:
63+
message_definitions.extend(
64+
self._get_messages_to_set(_msgid, enable, ignore_unknown)
65+
)
66+
return message_definitions
67+
68+
# msgid is a checker name?
69+
if msgid.lower() in self.linter._checkers:
70+
for checker in self.linter._checkers[msgid.lower()]:
71+
for _msgid in checker.msgs:
72+
message_definitions.extend(
73+
self._get_messages_to_set(_msgid, enable, ignore_unknown)
74+
)
75+
return message_definitions
76+
77+
# msgid is report id?
78+
if msgid.lower().startswith("rp"):
79+
if enable:
80+
self.linter.enable_report(msgid)
81+
else:
82+
self.linter.disable_report(msgid)
83+
return message_definitions
84+
85+
try:
86+
# msgid is a symbolic or numeric msgid.
87+
message_definitions = self.linter.msgs_store.get_message_definitions(msgid)
88+
except exceptions.UnknownMessageError:
89+
if not ignore_unknown:
90+
raise
91+
return message_definitions
92+
93+
def _set_msg_status(
94+
self,
95+
msgid: str,
96+
enable: bool,
97+
scope: str = "package",
98+
line: int | None = None,
99+
ignore_unknown: bool = False,
100+
) -> None:
101+
"""Do some tests and then iterate over message definitions to set state."""
102+
assert scope in {"package", "module"}
103+
104+
message_definitions = self._get_messages_to_set(msgid, enable, ignore_unknown)
105+
106+
for message_definition in message_definitions:
107+
self._set_one_msg_status(scope, message_definition, line, enable)
108+
109+
# sync configuration object
110+
self.linter.config.enable = []
111+
self.linter.config.disable = []
112+
for msgid_or_symbol, is_enabled in self._msgs_state.items():
113+
symbols = [
114+
m.symbol
115+
for m in self.linter.msgs_store.get_message_definitions(msgid_or_symbol)
116+
]
117+
if is_enabled:
118+
self.linter.config.enable += symbols
119+
else:
120+
self.linter.config.disable += symbols
121+
122+
def _register_by_id_managed_msg(
123+
self, msgid_or_symbol: str, line: int | None, is_disabled: bool = True
124+
) -> None:
125+
"""If the msgid is a numeric one, then register it to inform the user
126+
it could furnish instead a symbolic msgid.
127+
"""
128+
if msgid_or_symbol[1:].isdigit():
129+
try:
130+
symbol = self.linter.msgs_store.message_id_store.get_symbol(
131+
msgid=msgid_or_symbol
132+
)
133+
except exceptions.UnknownMessageError:
134+
return
135+
managed = ManagedMessage(
136+
self.linter.current_name, msgid_or_symbol, symbol, line, is_disabled
137+
)
138+
self.linter._by_id_managed_msgs.append(managed)

pylint/lint/pylinter.py

Lines changed: 3 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@
2929
MSG_STATE_SCOPE_CONFIG,
3030
MSG_STATE_SCOPE_MODULE,
3131
MSG_TYPES,
32-
MSG_TYPES_LONG,
3332
MSG_TYPES_STATUS,
3433
WarningScope,
3534
)
3635
from pylint.lint.base_options import _make_linter_options
3736
from pylint.lint.caching import load_results, save_results
3837
from pylint.lint.expand_modules import expand_modules
38+
from pylint.lint.message_state_handler import _MessageStateHandler
3939
from pylint.lint.parallel import check_parallel
4040
from pylint.lint.report_functions import (
4141
report_messages_by_module_stats,
@@ -227,6 +227,7 @@ def _load_reporter_by_class(reporter_class: str) -> type[BaseReporter]:
227227
# pylint: disable=too-many-instance-attributes,too-many-public-methods
228228
class PyLinter(
229229
_ArgumentsManager,
230+
_MessageStateHandler,
230231
reporters.ReportsHandlerMixIn,
231232
checkers.BaseTokenChecker,
232233
):
@@ -265,6 +266,7 @@ def __init__(
265266
pylintrc: str | None = None, # pylint: disable=unused-argument
266267
) -> None:
267268
_ArgumentsManager.__init__(self, prog="pylint")
269+
_MessageStateHandler.__init__(self, self)
268270

269271
# Some stuff has to be done before initialization of other ancestors...
270272
# messages store / checkers / reporter / astroid manager
@@ -320,7 +322,6 @@ def __init__(
320322
# Attributes related to messages (states) and their handling
321323
self.msgs_store = MessageDefinitionStore()
322324
self.msg_status = 0
323-
self._msgs_state: dict[str, bool] = {}
324325
self._by_id_managed_msgs: list[ManagedMessage] = []
325326

326327
reporters.ReportsHandlerMixIn.__init__(self)
@@ -1401,119 +1402,6 @@ def add_ignored_message(
14011402

14021403
# Setting the state (disabled/enabled) of messages and registering them
14031404

1404-
def _set_one_msg_status(
1405-
self, scope: str, msg: MessageDefinition, line: int | None, enable: bool
1406-
) -> None:
1407-
"""Set the status of an individual message."""
1408-
if scope == "module":
1409-
assert isinstance(line, int) # should always be int inside module scope
1410-
1411-
self.file_state.set_msg_status(msg, line, enable)
1412-
if not enable and msg.symbol != "locally-disabled":
1413-
self.add_message(
1414-
"locally-disabled", line=line, args=(msg.symbol, msg.msgid)
1415-
)
1416-
else:
1417-
msgs = self._msgs_state
1418-
msgs[msg.msgid] = enable
1419-
1420-
def _get_messages_to_set(
1421-
self, msgid: str, enable: bool, ignore_unknown: bool = False
1422-
) -> list[MessageDefinition]:
1423-
"""Do some tests and find the actual messages of which the status should be set."""
1424-
message_definitions = []
1425-
if msgid == "all":
1426-
for _msgid in MSG_TYPES:
1427-
message_definitions.extend(
1428-
self._get_messages_to_set(_msgid, enable, ignore_unknown)
1429-
)
1430-
return message_definitions
1431-
1432-
# msgid is a category?
1433-
category_id = msgid.upper()
1434-
if category_id not in MSG_TYPES:
1435-
category_id_formatted = MSG_TYPES_LONG.get(category_id)
1436-
else:
1437-
category_id_formatted = category_id
1438-
if category_id_formatted is not None:
1439-
for _msgid in self.msgs_store._msgs_by_category[category_id_formatted]:
1440-
message_definitions.extend(
1441-
self._get_messages_to_set(_msgid, enable, ignore_unknown)
1442-
)
1443-
return message_definitions
1444-
1445-
# msgid is a checker name?
1446-
if msgid.lower() in self._checkers:
1447-
for checker in self._checkers[msgid.lower()]:
1448-
for _msgid in checker.msgs:
1449-
message_definitions.extend(
1450-
self._get_messages_to_set(_msgid, enable, ignore_unknown)
1451-
)
1452-
return message_definitions
1453-
1454-
# msgid is report id?
1455-
if msgid.lower().startswith("rp"):
1456-
if enable:
1457-
self.enable_report(msgid)
1458-
else:
1459-
self.disable_report(msgid)
1460-
return message_definitions
1461-
1462-
try:
1463-
# msgid is a symbolic or numeric msgid.
1464-
message_definitions = self.msgs_store.get_message_definitions(msgid)
1465-
except exceptions.UnknownMessageError:
1466-
if not ignore_unknown:
1467-
raise
1468-
return message_definitions
1469-
1470-
def _set_msg_status(
1471-
self,
1472-
msgid: str,
1473-
enable: bool,
1474-
scope: str = "package",
1475-
line: int | None = None,
1476-
ignore_unknown: bool = False,
1477-
) -> None:
1478-
"""Do some tests and then iterate over message definitions to set state."""
1479-
assert scope in {"package", "module"}
1480-
1481-
message_definitions = self._get_messages_to_set(msgid, enable, ignore_unknown)
1482-
1483-
for message_definition in message_definitions:
1484-
self._set_one_msg_status(scope, message_definition, line, enable)
1485-
1486-
# sync configuration object
1487-
self.config.enable = []
1488-
self.config.disable = []
1489-
for msgid_or_symbol, is_enabled in self._msgs_state.items():
1490-
symbols = [
1491-
m.symbol
1492-
for m in self.msgs_store.get_message_definitions(msgid_or_symbol)
1493-
]
1494-
if is_enabled:
1495-
self.config.enable += symbols
1496-
else:
1497-
self.config.disable += symbols
1498-
1499-
def _register_by_id_managed_msg(
1500-
self, msgid_or_symbol: str, line: int | None, is_disabled: bool = True
1501-
) -> None:
1502-
"""If the msgid is a numeric one, then register it to inform the user
1503-
it could furnish instead a symbolic msgid.
1504-
"""
1505-
if msgid_or_symbol[1:].isdigit():
1506-
try:
1507-
symbol = self.msgs_store.message_id_store.get_symbol(
1508-
msgid=msgid_or_symbol
1509-
)
1510-
except exceptions.UnknownMessageError:
1511-
return
1512-
managed = ManagedMessage(
1513-
self.current_name, msgid_or_symbol, symbol, line, is_disabled
1514-
)
1515-
self._by_id_managed_msgs.append(managed)
1516-
15171405
def disable(
15181406
self,
15191407
msgid: str,

0 commit comments

Comments
 (0)