summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>2021-10-07 16:30:51 +0200
committerGitHub <noreply@github.com>2021-10-07 16:30:51 +0200
commit05d3e6c6e41e0aec9cf24c101a9a01f1046f61f6 (patch)
treef9400399f04748c0c5d426328a6b0c7aca348650
parent066a1846634a3693abb41ce96da4dcdceef47ac0 (diff)
downloadpylint-git-05d3e6c6e41e0aec9cf24c101a9a01f1046f61f6.tar.gz
Move staticmethods out of MessagesHandlerMixIn (#5123)
-rwxr-xr-xdoc/exts/pylint_extensions.py6
-rw-r--r--pylint/message/message_definition.py28
-rw-r--r--pylint/message/message_handler_mix_in.py36
3 files changed, 34 insertions, 36 deletions
diff --git a/doc/exts/pylint_extensions.py b/doc/exts/pylint_extensions.py
index 4dc6f184f..31678735d 100755
--- a/doc/exts/pylint_extensions.py
+++ b/doc/exts/pylint_extensions.py
@@ -67,9 +67,13 @@ def builder_inited(app):
"\n load-plugins=pylint.extensions.docparams,"
"pylint.extensions.docstyle\n\n"
)
+
+ # Print checker documentation to stream
by_checker = get_plugins_info(linter, doc_files)
for checker, information in sorted(by_checker.items()):
- linter._print_checker_doc(information, stream=stream)
+ checker = information["checker"]
+ del information["checker"]
+ print(checker.get_full_documentation(**information)[:-1], file=stream)
def get_plugins_info(linter, doc_files):
diff --git a/pylint/message/message_definition.py b/pylint/message/message_definition.py
index bdada19fe..8785e154d 100644
--- a/pylint/message/message_definition.py
+++ b/pylint/message/message_definition.py
@@ -4,7 +4,9 @@
import sys
from typing import TYPE_CHECKING, List, Optional, Tuple
-from pylint.constants import MSG_TYPES
+from astroid import nodes
+
+from pylint.constants import _SCOPE_EXEMPT, MSG_TYPES, WarningScope
from pylint.exceptions import InvalidMessageError
from pylint.utils import normalize_text
@@ -88,3 +90,27 @@ class MessageDefinition:
title = title.splitlines()[0]
return f":{message_id}: *{title.rstrip(' ')}*\n{msg_help}"
return f":{message_id}:\n{msg_help}"
+
+ def check_message_definition(
+ self, line: Optional[int], node: Optional[nodes.NodeNG]
+ ) -> None:
+ """Check MessageDefinition for possible errors"""
+ if self.msgid[0] not in _SCOPE_EXEMPT:
+ # Fatal messages and reports are special, the node/scope distinction
+ # does not apply to them.
+ if self.scope == WarningScope.LINE:
+ if line is None:
+ raise InvalidMessageError(
+ f"Message {self.msgid} must provide line, got None"
+ )
+ if node is not None:
+ raise InvalidMessageError(
+ f"Message {self.msgid} must only provide line, "
+ f"got line={line}, node={node}"
+ )
+ elif self.scope == WarningScope.NODE:
+ # Node-based warnings may provide an override line.
+ if node is None:
+ raise InvalidMessageError(
+ f"Message {self.msgid} must provide Node, got None"
+ )
diff --git a/pylint/message/message_handler_mix_in.py b/pylint/message/message_handler_mix_in.py
index 10448f0e8..3391bd1b1 100644
--- a/pylint/message/message_handler_mix_in.py
+++ b/pylint/message/message_handler_mix_in.py
@@ -2,14 +2,12 @@
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
import sys
-from io import TextIOWrapper
from typing import TYPE_CHECKING, Any, List, Optional, TextIO, Tuple, Union
from astroid import nodes
from pylint import exceptions, interfaces
from pylint.constants import (
- _SCOPE_EXEMPT,
MAIN_CHECKER_NAME,
MSG_STATE_CONFIDENCE,
MSG_STATE_SCOPE_CONFIG,
@@ -17,7 +15,6 @@ from pylint.constants import (
MSG_TYPES,
MSG_TYPES_LONG,
MSG_TYPES_STATUS,
- WarningScope,
)
from pylint.message.message import Message
from pylint.utils import get_module_and_frameid, get_rst_section, get_rst_title
@@ -270,7 +267,7 @@ class MessagesHandlerMixIn:
"""
message_definitions = self.msgs_store.get_message_definitions(msgid)
for message_definition in message_definitions:
- self.check_message_definition(message_definition, line, node)
+ message_definition.check_message_definition(line, node)
self.file_state.handle_ignored_message(
self.get_message_state_scope(
message_definition.msgid, line, confidence
@@ -279,28 +276,6 @@ class MessagesHandlerMixIn:
line,
)
- @staticmethod
- def check_message_definition(message_definition, line, node):
- if message_definition.msgid[0] not in _SCOPE_EXEMPT:
- # Fatal messages and reports are special, the node/scope distinction
- # does not apply to them.
- if message_definition.scope == WarningScope.LINE:
- if line is None:
- raise exceptions.InvalidMessageError(
- f"Message {message_definition.msgid} must provide line, got None"
- )
- if node is not None:
- raise exceptions.InvalidMessageError(
- f"Message {message_definition.msgid} must only provide line, "
- f"got line={line}, node={node}"
- )
- elif message_definition.scope == WarningScope.NODE:
- # Node-based warnings may provide an override line.
- if node is None:
- raise exceptions.InvalidMessageError(
- f"Message {message_definition.msgid} must provide Node, got None"
- )
-
def add_one_message( # type: ignore # MessagesHandlerMixIn is always mixed with PyLinter
self: "PyLinter",
message_definition: "MessageDefinition",
@@ -310,7 +285,7 @@ class MessagesHandlerMixIn:
confidence: Optional[interfaces.Confidence],
col_offset: Optional[int],
) -> None:
- self.check_message_definition(message_definition, line, node)
+ message_definition.check_message_definition(line, node)
if line is None and node is not None:
line = node.fromlineno
if col_offset is None and hasattr(node, "col_offset"):
@@ -421,10 +396,3 @@ Below is a list of all checkers and their features.
def print_full_documentation(self, stream: TextIO = sys.stdout) -> None:
"""output a full documentation in ReST format"""
print(self.get_checkers_documentation()[:-1], file=stream)
-
- @staticmethod
- def _print_checker_doc(information, stream: TextIOWrapper) -> None:
- """Helper method used by doc/exts/pylint_extensions.py."""
- checker = information["checker"]
- del information["checker"]
- print(checker.get_full_documentation(**information)[:-1], file=stream)