Files
2026-06-23 11:27:54 +08:00

156 lines
3.8 KiB
Python

# Copyright (c) 2024 Broadcom. All Rights Reserved.
# The term "Broadcom" refers to Broadcom Inc.
# and/or its subsidiaries.
import sys
import tempfile
from lib.environment import Environment, DefaultDict
from lib.text_utils import translate_text
class ColorKey(object):
"""
Class for holding color mapping to its terminal escape sequence
"""
RED = '{COLORS[RED]}'
GREEN = '{COLORS[GREEN]}'
BLUE = '{COLORS[BLUE]}'
YELLOW = '{COLORS[YELLOW]}'
CYAN = '{COLORS[CYAN]}'
LIGHT_BLUE = '{COLORS[LIGHT_BLUE]}'
UNDER_LINE = '{COLORS[UNDER_LINE]}'
NORMAL = '{COLORS[NORMAL]}'
def init_env_colormap():
"""
Initialize color map in the environment
"""
env = Environment.get_environment()
color_disabled = env.get_value('COLORS_DISABLED') is True
if color_disabled:
color_map = DefaultDict()
else:
color_map = {
'RED': '\033[31m',
'GREEN': '\033[32m',
'YELLOW': '\033[33m',
'BLUE': '\033[34m',
'CYAN': '\033[36m',
'LIGHT_BLUE': '\033[94m',
'UNDER_LINE': '\033[04m',
'NORMAL': '\033[00m'
}
env.set_value('COLORS', color_map)
def set_text_color(color):
"""
Set the color. The color will affect any normal print() calls following this method call
:param color: ColorKey object
"""
print_text(color, end='')
def print_text(*text, max_width=0, sep='', end='\n'):
"""
Print text with additional preprocessing based
:param text: Text to be print. The text will be translated first
:param max_width: if > 0, new line will be added automatically if each line
:param sep: separator between text
:param end: add end text after the last of line
"""
text = translate_text(*text, sep=sep)
if max_width > 0:
text_len = len(text)
idx = 0
while idx < text_len:
if idx + max_width < text_len:
print(text[idx:max_width])
else:
print(text[idx:], end=end)
else:
print(text, end=end)
sys.stdout.flush()
def print_text_warning(text, end='\n'):
"""
Print warning text with yellow color.
:param text: Text to be print
:param end: end characters at the end of text
"""
print_text(ColorKey.YELLOW, text, ColorKey.NORMAL, sep='', end=end)
def print_text_error(text, end='\n'):
"""
Print error text. By default it's identical to print_text_warning,
printing text with yellow color.
"""
print_text_warning(text, end=end)
def print_header(text):
"""
Print header text
"""
print()
print_text("{}{}".format(ColorKey.CYAN, text))
print_text("{}{}".format('-' * 65, ColorKey.NORMAL))
def print_task(text):
"""
Print formatted text for task name
"""
print("{:<52}".format(text), end='', flush=True)
def print_task_status(status_text, color=ColorKey.GREEN):
"""
Print formatted text for task status
"""
set_text_color(color)
print("{:>13}".format(status_text), end='')
set_text_color(ColorKey.NORMAL)
print(flush=True)
def print_task_status_warning(result):
"""
Print warning task status (color: yellow)
"""
print_task_status(result, ColorKey.YELLOW)
def print_task_status_error(result):
"""
Print error task status (color: red)
"""
print_task_status(result, ColorKey.RED)
def capture_method_output(method, *args, **kwargs):
"""
Invoke the method and capture the stdout output produced by this method
:param method: method to be invoked
:return: captured stdout output
"""
stdout = sys.stdout
try:
with tempfile.NamedTemporaryFile('w+') as file:
sys.stdout = file
method(*args, **kwargs)
file.seek(0)
return file.read()
finally:
sys.stdout = stdout
init_env_colormap()