aboutsummaryrefslogtreecommitdiff
path: root/pylint/reporters/ureports/text_writer.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylint/reporters/ureports/text_writer.py')
-rw-r--r--pylint/reporters/ureports/text_writer.py114
1 files changed, 114 insertions, 0 deletions
diff --git a/pylint/reporters/ureports/text_writer.py b/pylint/reporters/ureports/text_writer.py
new file mode 100644
index 000000000..392c86cc8
--- /dev/null
+++ b/pylint/reporters/ureports/text_writer.py
@@ -0,0 +1,114 @@
+# Copyright (c) 2015-2016, 2018-2020 Claudiu Popa <pcmanticore@gmail.com>
+# Copyright (c) 2018, 2020 Anthony Sottile <asottile@umich.edu>
+# Copyright (c) 2019-2021 Pierre Sassoulas <pierre.sassoulas@gmail.com>
+# Copyright (c) 2019 Hugo van Kemenade <hugovk@users.noreply.github.com>
+# Copyright (c) 2020 hippo91 <guillaume.peillex@gmail.com>
+# Copyright (c) 2021 Daniƫl van Noord <13665637+DanielNoord@users.noreply.github.com>
+# Copyright (c) 2021 Marc Mueller <30130371+cdce8p@users.noreply.github.com>
+# Copyright (c) 2021 bot <bot@noreply.github.com>
+
+# 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
+
+"""Text formatting drivers for ureports"""
+
+from typing import TYPE_CHECKING, List
+
+from pylint.reporters.ureports.base_writer import BaseWriter
+
+if TYPE_CHECKING:
+ from pylint.reporters.ureports.nodes import (
+ EvaluationSection,
+ Paragraph,
+ Section,
+ Table,
+ Text,
+ Title,
+ VerbatimText,
+ )
+
+TITLE_UNDERLINES = ["", "=", "-", "`", ".", "~", "^"]
+BULLETS = ["*", "-"]
+
+
+class TextWriter(BaseWriter):
+ """format layouts as text
+ (ReStructured inspiration but not totally handled yet)
+ """
+
+ def __init__(self):
+ super().__init__()
+ self.list_level = 0
+
+ def visit_section(self, layout: "Section") -> None:
+ """display a section as text"""
+ self.section += 1
+ self.writeln()
+ self.format_children(layout)
+ self.section -= 1
+ self.writeln()
+
+ def visit_evaluationsection(self, layout: "EvaluationSection") -> None:
+ """Display an evaluation section as a text."""
+ self.section += 1
+ self.format_children(layout)
+ self.section -= 1
+ self.writeln()
+
+ def visit_title(self, layout: "Title") -> None:
+ title = "".join(list(self.compute_content(layout)))
+ self.writeln(title)
+ try:
+ self.writeln(TITLE_UNDERLINES[self.section] * len(title))
+ except IndexError:
+ print("FIXME TITLE TOO DEEP. TURNING TITLE INTO TEXT")
+
+ def visit_paragraph(self, layout: "Paragraph") -> None:
+ """enter a paragraph"""
+ self.format_children(layout)
+ self.writeln()
+
+ def visit_table(self, layout: "Table") -> None:
+ """display a table as text"""
+ table_content = self.get_table_content(layout)
+ # get columns width
+ cols_width = [0] * len(table_content[0])
+ for row in table_content:
+ for index, col in enumerate(row):
+ cols_width[index] = max(cols_width[index], len(col))
+ self.default_table(layout, table_content, cols_width)
+ self.writeln()
+
+ def default_table(
+ self, layout: "Table", table_content: List[List[str]], cols_width: List[int]
+ ) -> None:
+ """format a table"""
+ cols_width = [size + 1 for size in cols_width]
+ format_strings = " ".join(["%%-%ss"] * len(cols_width))
+ format_strings %= tuple(cols_width)
+
+ table_linesep = "\n+" + "+".join("-" * w for w in cols_width) + "+\n"
+ headsep = "\n+" + "+".join("=" * w for w in cols_width) + "+\n"
+
+ self.write(table_linesep)
+ split_strings = format_strings.split(" ")
+ for index, line in enumerate(table_content):
+ self.write("|")
+ for line_index, at_index in enumerate(line):
+ self.write(split_strings[line_index] % at_index)
+ self.write("|")
+ if index == 0 and layout.rheaders:
+ self.write(headsep)
+ else:
+ self.write(table_linesep)
+
+ def visit_verbatimtext(self, layout: "VerbatimText") -> None:
+ """display a verbatim layout as text (so difficult ;)"""
+ self.writeln("::\n")
+ for line in layout.data.splitlines():
+ self.writeln(" " + line)
+ self.writeln()
+
+ def visit_text(self, layout: "Text") -> None:
+ """add some text"""
+ self.write(f"{layout.data}")