| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- # 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
- """Interfaces for Pylint objects."""
- from __future__ import annotations
- import warnings
- from tokenize import TokenInfo
- from typing import TYPE_CHECKING, NamedTuple
- from astroid import nodes
- if TYPE_CHECKING:
- from pylint.checkers import BaseChecker
- from pylint.message import Message
- from pylint.reporters.ureports.nodes import Section
- __all__ = (
- "IRawChecker",
- "IAstroidChecker",
- "ITokenChecker",
- "IReporter",
- "IChecker",
- "HIGH",
- "CONTROL_FLOW",
- "INFERENCE",
- "INFERENCE_FAILURE",
- "UNDEFINED",
- "CONFIDENCE_LEVELS",
- "CONFIDENCE_LEVEL_NAMES",
- )
- class Confidence(NamedTuple):
- name: str
- description: str
- # Warning Certainties
- HIGH = Confidence("HIGH", "Warning that is not based on inference result.")
- CONTROL_FLOW = Confidence(
- "CONTROL_FLOW", "Warning based on assumptions about control flow."
- )
- INFERENCE = Confidence("INFERENCE", "Warning based on inference result.")
- INFERENCE_FAILURE = Confidence(
- "INFERENCE_FAILURE", "Warning based on inference with failures."
- )
- UNDEFINED = Confidence("UNDEFINED", "Warning without any associated confidence level.")
- CONFIDENCE_LEVELS = [HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, UNDEFINED]
- CONFIDENCE_LEVEL_NAMES = [i.name for i in CONFIDENCE_LEVELS]
- class Interface:
- """Base class for interfaces."""
- def __init__(self) -> None:
- warnings.warn(
- "Interface and all of its subclasses have been deprecated "
- "and will be removed in pylint 3.0.",
- DeprecationWarning,
- stacklevel=2,
- )
- @classmethod
- def is_implemented_by(
- cls: type[Interface] | tuple[type[Interface], ...], instance: BaseChecker
- ) -> bool:
- with warnings.catch_warnings():
- warnings.filterwarnings("ignore", category=DeprecationWarning)
- return implements(instance, cls)
- def implements(
- obj: BaseChecker,
- interface: type[Interface] | tuple[type[Interface], ...],
- ) -> bool:
- """Does the given object (maybe an instance or class) implement the interface."""
- # TODO: 3.0: Remove deprecated function
- warnings.warn(
- "implements has been deprecated in favour of using basic "
- "inheritance patterns without using __implements__.",
- DeprecationWarning,
- stacklevel=2,
- )
- implements_ = getattr(obj, "__implements__", ())
- if not isinstance(implements_, (list, tuple)):
- implements_ = (implements_,)
- return any(issubclass(i, interface) for i in implements_)
- class IChecker(Interface):
- """Base interface, to be used only for sub interfaces definition."""
- def open(self) -> None:
- """Called before visiting project (i.e. set of modules)."""
- def close(self) -> None:
- """Called after visiting project (i.e. set of modules)."""
- class IRawChecker(IChecker):
- """Interface for checker which need to parse the raw file."""
- def process_module(self, node: nodes.Module) -> None:
- """Process a module.
- The module's content is accessible via ``astroid.stream``
- """
- class ITokenChecker(IChecker):
- """Interface for checkers that need access to the token list."""
- def process_tokens(self, tokens: list[TokenInfo]) -> None:
- """Process a module.
- Tokens is a list of all source code tokens in the file.
- """
- class IAstroidChecker(IChecker):
- """Interface for checker which prefers receive events according to
- statement type.
- """
- class IReporter(Interface):
- """Reporter collect messages and display results encapsulated in a layout."""
- def handle_message(self, msg: Message) -> None:
- """Handle the given message object."""
- def display_reports(self, layout: Section) -> None:
- """Display results encapsulated in the layout tree."""
|