from time import strftime, localtime from sys import stdout, stderr from os import path import inspect BLUE = "\033[34m" YELLOW = "\033[33m" RED = "\033[31m" RESET = "\033[0m" def _log(color: str, level: str, msg: str, err=False) -> int: frame = inspect.stack()[2] filename = path.basename(inspect.getmodule(frame[0]).__file__) timestr = strftime("%H:%M:%S", localtime()) funcstr = "%s:%d" % (filename, frame.lineno) write = stderr.write if err else stdout.write return write( "%s[%s]%s %s %s: %s\n" % (color, level.lower(), RESET, timestr, funcstr, msg) ) def info(msg: str) -> None: _log(BLUE, "info", msg) def warn(msg: str) -> None: _log(YELLOW, "warn", msg, err=True) def fail(msg: str, exception=None) -> None: size = _log(RED, "fail", msg, err=True) if exception is not None: size -= len(msg) + len(RED) + len(RESET) + 1 + len("details: ") stderr.write(" " * size + "details: ") stderr.write(exception.__str__() + "\n")