|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
"""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" |
|
|
|
@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 _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) |
|
|