Commit | Line | Data |
---|---|---|
e756dbeb DL |
1 | #!/usr/bin/env python3 |
2 | # SPDX-License-Identifier: GPL-2.0 | |
3 | # | |
4 | # Utilities for printing and coloring output. | |
5 | # | |
6 | # Copyright (C) 2022, Google LLC. | |
7 | # Author: Daniel Latypov <dlatypov@google.com> | |
8 | ||
9 | import datetime | |
10 | import sys | |
11 | import typing | |
12 | ||
13 | _RESET = '\033[0;0m' | |
14 | ||
15 | class Printer: | |
16 | """Wraps a file object, providing utilities for coloring output, etc.""" | |
17 | ||
695e2603 | 18 | def __init__(self, output: typing.IO[str]): |
e756dbeb DL |
19 | self._output = output |
20 | self._use_color = output.isatty() | |
21 | ||
22 | def print(self, message: str) -> None: | |
23 | print(message, file=self._output) | |
24 | ||
25 | def print_with_timestamp(self, message: str) -> None: | |
26 | ts = datetime.datetime.now().strftime('%H:%M:%S') | |
27 | self.print(f'[{ts}] {message}') | |
28 | ||
29 | def _color(self, code: str, text: str) -> str: | |
30 | if not self._use_color: | |
31 | return text | |
32 | return code + text + _RESET | |
33 | ||
34 | def red(self, text: str) -> str: | |
35 | return self._color('\033[1;31m', text) | |
36 | ||
37 | def yellow(self, text: str) -> str: | |
38 | return self._color('\033[1;33m', text) | |
39 | ||
40 | def green(self, text: str) -> str: | |
41 | return self._color('\033[1;32m', text) | |
42 | ||
43 | def color_len(self) -> int: | |
44 | """Returns the length of the color escape codes.""" | |
45 | return len(self.red('')) | |
46 | ||
47 | # Provides a default instance that prints to stdout | |
48 | stdout = Printer(sys.stdout) |