| # -*- coding: utf-8 -*- |
| # Copyright (c) 2009-2010, 2012-2013 LOGILAB S.A. (Paris, FRANCE) <[email protected]> |
| # Copyright (c) 2013-2014 Google, Inc. |
| # Copyright (c) 2014 Michal Nowikowski <[email protected]> |
| # Copyright (c) 2014 Arun Persaud <[email protected]> |
| # Copyright (c) 2015-2018, 2020 Claudiu Popa <[email protected]> |
| # Copyright (c) 2015 Florian Bruhin <[email protected]> |
| # Copyright (c) 2015 Ionel Cristian Maries <[email protected]> |
| # Copyright (c) 2018 ssolanki <[email protected]> |
| # Copyright (c) 2018 Ville Skyttä <[email protected]> |
| # Copyright (c) 2020 Anthony Sottile <[email protected]> |
| |
| # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html |
| # For details: https://github.com/PyCQA/pylint/blob/master/COPYING |
| |
| """Interfaces for Pylint objects""" |
| from collections import namedtuple |
| |
| Confidence = namedtuple("Confidence", ["name", "description"]) |
| # Warning Certainties |
| HIGH = Confidence("HIGH", "No false positive possible.") |
| 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, INFERENCE, INFERENCE_FAILURE, UNDEFINED] |
| |
| |
| class Interface: |
| """Base class for interfaces.""" |
| |
| @classmethod |
| def is_implemented_by(cls, instance): |
| return implements(instance, cls) |
| |
| |
| def implements(obj, interface): |
| """Return true if the give object (maybe an instance or class) implements |
| the interface. |
| """ |
| kimplements = getattr(obj, "__implements__", ()) |
| if not isinstance(kimplements, (list, tuple)): |
| kimplements = (kimplements,) |
| for implementedinterface in kimplements: |
| if issubclass(implementedinterface, interface): |
| return True |
| return False |
| |
| |
| class IChecker(Interface): |
| """This is a base interface, not designed to be used elsewhere than for |
| sub interfaces definition. |
| """ |
| |
| def open(self): |
| """called before visiting project (i.e set of modules)""" |
| |
| def close(self): |
| """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, astroid): |
| """ 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): |
| """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): |
| """Handle the given message object.""" |
| |
| def display_reports(self, layout): |
| """display results encapsulated in the layout tree |
| """ |
| |
| |
| __all__ = ("IRawChecker", "IAstroidChecker", "ITokenChecker", "IReporter") |