From 05d3e6c6e41e0aec9cf24c101a9a01f1046f61f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20van=20Noord?= <13665637+DanielNoord@users.noreply.github.com> Date: Thu, 7 Oct 2021 16:30:51 +0200 Subject: Move staticmethods out of MessagesHandlerMixIn (#5123) --- doc/exts/pylint_extensions.py | 6 +++++- pylint/message/message_definition.py | 28 ++++++++++++++++++++++++- pylint/message/message_handler_mix_in.py | 36 ++------------------------------ 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) -- cgit v1.2.1