forked from Minki/linux
e756dbebd9
Context: * kunit_kernel.py is importing kunit_parser.py just to use the print_with_timestamp() function * the parser is directly printing to stdout, which will become an issue if we ever try to run multiple kernels in parallel This patch introduces a kunit_printer.py file and migrates callers of kunit_parser.print_with_timestamp() to call kunit_printer.stdout.print_with_timestamp() instead. Future changes: If we want to support showing results for parallel runs, we could then create new Printer's that don't directly write to stdout and refactor the code to pass around these Printer objects. Signed-off-by: Daniel Latypov <dlatypov@google.com> Reviewed-by: David Gow <davidgow@google.com> Reviewed-by: Brendan Higgins <brendanhiggins@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
49 lines
1.2 KiB
Python
49 lines
1.2 KiB
Python
#!/usr/bin/env python3
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Utilities for printing and coloring output.
|
|
#
|
|
# Copyright (C) 2022, Google LLC.
|
|
# Author: Daniel Latypov <dlatypov@google.com>
|
|
|
|
import datetime
|
|
import sys
|
|
import typing
|
|
|
|
_RESET = '\033[0;0m'
|
|
|
|
class Printer:
|
|
"""Wraps a file object, providing utilities for coloring output, etc."""
|
|
|
|
def __init__(self, output: typing.IO):
|
|
self._output = output
|
|
self._use_color = output.isatty()
|
|
|
|
def print(self, message: str) -> None:
|
|
print(message, file=self._output)
|
|
|
|
def print_with_timestamp(self, message: str) -> None:
|
|
ts = datetime.datetime.now().strftime('%H:%M:%S')
|
|
self.print(f'[{ts}] {message}')
|
|
|
|
def _color(self, code: str, text: str) -> str:
|
|
if not self._use_color:
|
|
return text
|
|
return code + text + _RESET
|
|
|
|
def red(self, text: str) -> str:
|
|
return self._color('\033[1;31m', text)
|
|
|
|
def yellow(self, text: str) -> str:
|
|
return self._color('\033[1;33m', text)
|
|
|
|
def green(self, text: str) -> str:
|
|
return self._color('\033[1;32m', text)
|
|
|
|
def color_len(self) -> int:
|
|
"""Returns the length of the color escape codes."""
|
|
return len(self.red(''))
|
|
|
|
# Provides a default instance that prints to stdout
|
|
stdout = Printer(sys.stdout)
|