162306a36Sopenharmony_ci#!/usr/bin/env python3 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci# 462306a36Sopenharmony_ci# Utilities for printing and coloring output. 562306a36Sopenharmony_ci# 662306a36Sopenharmony_ci# Copyright (C) 2022, Google LLC. 762306a36Sopenharmony_ci# Author: Daniel Latypov <dlatypov@google.com> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ciimport datetime 1062306a36Sopenharmony_ciimport sys 1162306a36Sopenharmony_ciimport typing 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci_RESET = '\033[0;0m' 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciclass Printer: 1662306a36Sopenharmony_ci """Wraps a file object, providing utilities for coloring output, etc.""" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci def __init__(self, output: typing.IO[str]): 1962306a36Sopenharmony_ci self._output = output 2062306a36Sopenharmony_ci self._use_color = output.isatty() 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci def print(self, message: str) -> None: 2362306a36Sopenharmony_ci print(message, file=self._output) 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci def print_with_timestamp(self, message: str) -> None: 2662306a36Sopenharmony_ci ts = datetime.datetime.now().strftime('%H:%M:%S') 2762306a36Sopenharmony_ci self.print(f'[{ts}] {message}') 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci def _color(self, code: str, text: str) -> str: 3062306a36Sopenharmony_ci if not self._use_color: 3162306a36Sopenharmony_ci return text 3262306a36Sopenharmony_ci return code + text + _RESET 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci def red(self, text: str) -> str: 3562306a36Sopenharmony_ci return self._color('\033[1;31m', text) 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci def yellow(self, text: str) -> str: 3862306a36Sopenharmony_ci return self._color('\033[1;33m', text) 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci def green(self, text: str) -> str: 4162306a36Sopenharmony_ci return self._color('\033[1;32m', text) 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci def color_len(self) -> int: 4462306a36Sopenharmony_ci """Returns the length of the color escape codes.""" 4562306a36Sopenharmony_ci return len(self.red('')) 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci# Provides a default instance that prints to stdout 4862306a36Sopenharmony_cistdout = Printer(sys.stdout) 49