third_party.pylibs.pylint.src/pylint/utils/docs.py
2022-04-18 18:55:48 +02:00

90 lines
3.4 KiB
Python

# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
# For details: https://github.com/PyCQA/pylint/blob/main/LICENSE
# Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt
"""Various helper functions to create the docs of a linter object."""
from __future__ import annotations
import sys
import warnings
from typing import TYPE_CHECKING, Any, TextIO
from pylint.constants import MAIN_CHECKER_NAME
from pylint.utils.utils import get_rst_section, get_rst_title
if TYPE_CHECKING:
from pylint.lint.pylinter import PyLinter
def _get_checkers_infos(linter: PyLinter) -> dict[str, dict[str, Any]]:
"""Get info from a checker and handle KeyError."""
by_checker: dict[str, dict[str, Any]] = {}
for checker in linter.get_checkers():
name = checker.name
if name != "master":
try:
by_checker[name]["checker"] = checker
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning)
by_checker[name]["options"] += checker.options_and_values()
by_checker[name]["msgs"].update(checker.msgs)
by_checker[name]["reports"] += checker.reports
except KeyError:
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning)
by_checker[name] = {
"checker": checker,
"options": list(checker.options_and_values()),
"msgs": dict(checker.msgs),
"reports": list(checker.reports),
}
return by_checker
def _get_checkers_documentation(linter: PyLinter) -> str:
"""Get documentation for individual checkers."""
result = get_rst_title("Pylint global options and switches", "-")
result += """
Pylint provides global options and switches.
"""
for checker in linter.get_checkers():
name = checker.name
if name == MAIN_CHECKER_NAME:
if checker.options:
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=DeprecationWarning)
for section, options in checker.options_by_section():
if section is None:
title = "General options"
else:
title = f"{section.capitalize()} options"
result += get_rst_title(title, "~")
assert isinstance(options, list)
result += f"{get_rst_section(None, options)}\n"
result += get_rst_title("Pylint checkers' options and switches", "-")
result += """\
Pylint checkers can provide three set of features:
* options that control their execution,
* messages that they can raise,
* reports that they can generate.
Below is a list of all checkers and their features.
"""
by_checker = _get_checkers_infos(linter)
for checker_name in sorted(by_checker):
information = by_checker[checker_name]
checker = information["checker"]
del information["checker"]
result += checker.get_full_documentation(**information)
return result
def print_full_documentation(linter: PyLinter, stream: TextIO = sys.stdout) -> None:
"""Output a full documentation in ReST format."""
print(_get_checkers_documentation(linter)[:-1], file=stream)