%PDF- %PDF-
Direktori : /opt/cloudlinux/venv/lib/python3.11/site-packages/pylint/reporters/ureports/ |
Current File : //opt/cloudlinux/venv/lib/python3.11/site-packages/pylint/reporters/ureports/base_writer.py |
# 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 """Universal report objects and some formatting drivers. A way to create simple reports using python objects, primarily designed to be formatted as text and html. """ from __future__ import annotations import sys from collections.abc import Iterator from io import StringIO from typing import TYPE_CHECKING, TextIO if TYPE_CHECKING: from pylint.reporters.ureports.nodes import ( BaseLayout, EvaluationSection, Paragraph, Section, Table, ) class BaseWriter: """Base class for ureport writers.""" def format( self, layout: BaseLayout, stream: TextIO = sys.stdout, encoding: str | None = None, ) -> None: """Format and write the given layout into the stream object. unicode policy: unicode strings may be found in the layout; try to call 'stream.write' with it, but give it back encoded using the given encoding if it fails """ if not encoding: encoding = getattr(stream, "encoding", "UTF-8") self.encoding = encoding or "UTF-8" self.out = stream self.begin_format() layout.accept(self) self.end_format() def format_children(self, layout: EvaluationSection | Paragraph | Section) -> None: """Recurse on the layout children and call their accept method (see the Visitor pattern). """ for child in getattr(layout, "children", ()): child.accept(self) def writeln(self, string: str = "") -> None: """Write a line in the output buffer.""" self.write(string + "\n") def write(self, string: str) -> None: """Write a string in the output buffer.""" self.out.write(string) def begin_format(self) -> None: """Begin to format a layout.""" self.section = 0 def end_format(self) -> None: """Finished formatting a layout.""" def get_table_content(self, table: Table) -> list[list[str]]: """Trick to get table content without actually writing it. return an aligned list of lists containing table cells values as string """ result: list[list[str]] = [[]] cols = table.cols for cell in self.compute_content(table): if cols == 0: result.append([]) cols = table.cols cols -= 1 result[-1].append(cell) # fill missing cells result[-1] += [""] * (cols - len(result[-1])) return result def compute_content(self, layout: BaseLayout) -> Iterator[str]: """Trick to compute the formatting of children layout before actually writing it. return an iterator on strings (one for each child element) """ # Patch the underlying output stream with a fresh-generated stream, # which is used to store a temporary representation of a child # node. out = self.out try: for child in layout.children: stream = StringIO() self.out = stream child.accept(self) yield stream.getvalue() finally: self.out = out