# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE # Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt # pylint: disable=duplicate-code from __future__ import annotations from typing import Any, Literal from astroid import nodes from pylint.interfaces import UNDEFINED, Confidence from pylint.lint import PyLinter from pylint.testutils.output_line import MessageTest class UnittestLinter(PyLinter): """A fake linter class to capture checker messages.""" def __init__(self) -> None: self._messages: list[MessageTest] = [] super().__init__() def release_messages(self) -> list[MessageTest]: try: return self._messages finally: self._messages = [] def add_message( self, msgid: str, line: int | None = None, # TODO: Make node non optional node: nodes.NodeNG | None = None, args: Any = None, confidence: Confidence | None = None, col_offset: int | None = None, end_lineno: int | None = None, end_col_offset: int | None = None, ) -> None: """Add a MessageTest to the _messages attribute of the linter class.""" # If confidence is None we set it to UNDEFINED as well in PyLinter if confidence is None: confidence = UNDEFINED # Look up "location" data of node if not yet supplied if node: if node.position: if not line: line = node.position.lineno if not col_offset: col_offset = node.position.col_offset if not end_lineno: end_lineno = node.position.end_lineno if not end_col_offset: end_col_offset = node.position.end_col_offset else: if not line: line = node.fromlineno if not col_offset: col_offset = node.col_offset if not end_lineno: end_lineno = node.end_lineno if not end_col_offset: end_col_offset = node.end_col_offset self._messages.append( MessageTest( msgid, line, node, args, confidence, col_offset, end_lineno, end_col_offset, ) ) @staticmethod def is_message_enabled(*unused_args: Any, **unused_kwargs: Any) -> Literal[True]: return True