| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | """Contains a utility for good-looking prints.""" |
| |
|
| | import os |
| | from typing import List, Union |
| |
|
| |
|
| | class ANSI: |
| | """ |
| | Helper for en.wikipedia.org/wiki/ANSI_escape_code |
| | """ |
| |
|
| | _bold = "\u001b[1m" |
| | _gray = "\u001b[90m" |
| | _red = "\u001b[31m" |
| | _reset = "\u001b[0m" |
| | _yellow = "\u001b[33m" |
| |
|
| | @classmethod |
| | def bold(cls, s: str) -> str: |
| | return cls._format(s, cls._bold) |
| |
|
| | @classmethod |
| | def gray(cls, s: str) -> str: |
| | return cls._format(s, cls._gray) |
| |
|
| | @classmethod |
| | def red(cls, s: str) -> str: |
| | return cls._format(s, cls._bold + cls._red) |
| |
|
| | @classmethod |
| | def yellow(cls, s: str) -> str: |
| | return cls._format(s, cls._yellow) |
| |
|
| | @classmethod |
| | def _format(cls, s: str, code: str) -> str: |
| | if os.environ.get("NO_COLOR"): |
| | |
| | return s |
| | return f"{code}{s}{cls._reset}" |
| |
|
| |
|
| | def tabulate(rows: List[List[Union[str, int]]], headers: List[str]) -> str: |
| | """ |
| | Inspired by: |
| | |
| | - stackoverflow.com/a/8356620/593036 |
| | - stackoverflow.com/questions/9535954/printing-lists-as-tabular-data |
| | """ |
| | col_widths = [max(len(str(x)) for x in col) for col in zip(*rows, headers)] |
| | row_format = ("{{:{}}} " * len(headers)).format(*col_widths) |
| | lines = [] |
| | lines.append(row_format.format(*headers)) |
| | lines.append(row_format.format(*["-" * w for w in col_widths])) |
| | for row in rows: |
| | lines.append(row_format.format(*row)) |
| | return "\n".join(lines) |
| |
|