Files
Uni-Lab-OS/unilabos/utils/banner_print.py
Junhan Chang c78ac482d8 Initial commit
2025-04-17 15:19:47 +08:00

184 lines
6.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
横幅和UI打印工具
提供用于显示彩色横幅、状态信息和其他UI元素的工具函数。
"""
import os
import platform
from datetime import datetime
import importlib.metadata
from typing import Dict, Any
# ANSI颜色代码
class Colors:
"""ANSI颜色代码集合"""
RESET = "\033[0m"
BOLD = "\033[1m"
ITALIC = "\033[3m"
UNDERLINE = "\033[4m"
BLACK = "\033[30m"
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
BLUE = "\033[34m"
MAGENTA = "\033[35m"
CYAN = "\033[36m"
WHITE = "\033[37m"
COLOR_HEAD = "\033[38;5;214m"
COLOR_DECO = "\033[38;5;242m"
COLOR_TAIL = "\033[38;5;220m"
BRIGHT_BLACK = "\033[90m"
BRIGHT_RED = "\033[91m"
BRIGHT_GREEN = "\033[92m"
BRIGHT_YELLOW = "\033[93m"
BRIGHT_BLUE = "\033[94m"
BRIGHT_MAGENTA = "\033[95m"
BRIGHT_CYAN = "\033[96m"
BRIGHT_WHITE = "\033[97m"
BG_BLACK = "\033[40m"
BG_RED = "\033[41m"
BG_GREEN = "\033[42m"
BG_YELLOW = "\033[43m"
BG_BLUE = "\033[44m"
BG_MAGENTA = "\033[45m"
BG_CYAN = "\033[46m"
BG_WHITE = "\033[47m"
def get_version() -> str:
"""
获取ilabos的版本号
通过importlib.metadata尝试获取包版本。
如果失败,返回开发版本号。
Returns:
版本号字符串
"""
try:
return importlib.metadata.version("unilabos")
except importlib.metadata.PackageNotFoundError:
return "dev-0.1.0" # 开发版本
def print_unilab_banner(args_dict: Dict[str, Any], show_config: bool = True) -> None:
"""
打印UNI LAB启动横幅
Args:
args_dict: 命令行参数字典
show_config: 是否显示配置信息
"""
# 检测终端是否支持ANSI颜色
if platform.system() == "Windows":
os.system("") # 启用Windows终端中的ANSI支持
# 获取当前时间
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 获取版本号
version = get_version()
# 构建UNI LAB字符艺术
banner = f"""{Colors.COLOR_HEAD}
██╗ ██╗ ███╗ ██╗ ██╗ ██╗ █████╗ ██████╗ {Colors.COLOR_TAIL}
██║ ██║ ████╗ ██║ ██║ ██║ ██╔══██╗ ██╔══██╗
██║ ██║ ██╔██╗ ██║ ██║ ██║ ███████║ ██████╔╝
██║ ██║ ██║╚██╗██║ ██║ ██║ ██╔══██║ ██╔══██╗
╚██████╔╝ ██║ ╚████║ ██║ ██████╗ ██║ ██║ ██████╔╝{Colors.COLOR_DECO}
╚════╝ ╚═╝ ╚═══╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ {Colors.RESET}"""
# 显示版本信息
system_info = f"""
{Colors.YELLOW}Version:{Colors.RESET} {Colors.BRIGHT_GREEN}{version}{Colors.RESET}
{Colors.YELLOW}System:{Colors.RESET} {Colors.WHITE}{platform.system()} {platform.release()}{Colors.RESET}
{Colors.YELLOW}Python:{Colors.RESET} {Colors.WHITE}{platform.python_version()}{Colors.RESET}
{Colors.YELLOW}Time:{Colors.RESET} {Colors.WHITE}{current_time}{Colors.RESET}
{Colors.BRIGHT_WHITE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{Colors.RESET}"""
# 打印横幅和系统信息
print(banner + system_info)
# 如果需要,显示配置信息
if show_config and args_dict:
print_config(args_dict)
def print_config(args_dict: Dict[str, Any]) -> None:
"""
打印配置信息
Args:
args_dict: 命令行参数字典
"""
config_info = f"{Colors.BRIGHT_BLUE}{Colors.BOLD}Configuration:{Colors.RESET}\n"
# 后端信息
if "backend" in args_dict:
config_info += f"{Colors.CYAN}• Backend:{Colors.RESET} "
config_info += f"{Colors.WHITE}{args_dict['backend']}{Colors.RESET}\n"
# 桥接信息
if "app_bridges" in args_dict:
config_info += f"{Colors.CYAN}• Bridges:{Colors.RESET} "
config_info += f"{Colors.WHITE}{', '.join(args_dict['app_bridges'])}{Colors.RESET}\n"
# 主机模式
if "without_host" in args_dict:
mode = "Slave" if args_dict["without_host"] else "Master"
config_info += f"{Colors.CYAN}• Host Mode:{Colors.RESET} {Colors.WHITE}{mode}{Colors.RESET}\n"
# 如果有图或设备信息,显示它们
if "graph" in args_dict and args_dict["graph"] is not None:
config_info += f"{Colors.CYAN}• Graph:{Colors.RESET} "
config_info += f"{Colors.WHITE}{args_dict['graph']}{Colors.RESET}\n"
elif "devices" in args_dict and args_dict["devices"] is not None:
config_info += f"{Colors.CYAN}• Devices:{Colors.RESET} "
config_info += f"{Colors.WHITE}{args_dict['devices']}{Colors.RESET}\n"
if "resources" in args_dict and args_dict["resources"] is not None:
config_info += f"{Colors.CYAN}• Resources:{Colors.RESET} "
config_info += f"{Colors.WHITE}{args_dict['resources']}{Colors.RESET}\n"
# 控制器配置
if "controllers" in args_dict and args_dict["controllers"] is not None:
config_info += f"{Colors.CYAN}• Controllers:{Colors.RESET} "
config_info += f"{Colors.WHITE}{args_dict['controllers']}{Colors.RESET}\n"
# 打印结束分隔线
config_info += f"{Colors.BRIGHT_WHITE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{Colors.RESET}\n"
print(config_info)
def print_status(message: str, status_type: str = "info") -> None:
"""
打印带颜色的状态消息
Args:
message: 要打印的消息
status_type: 状态类型('info', 'success', 'warning', 'error'
"""
color = Colors.WHITE
prefix = ""
if status_type == "info":
color = Colors.BLUE
prefix = "INFO"
elif status_type == "success":
color = Colors.GREEN
prefix = "SUCCESS"
elif status_type == "warning":
color = Colors.YELLOW
prefix = "WARNING"
elif status_type == "error":
color = Colors.RED
prefix = "ERROR"
print(f"{color}[{prefix}]{Colors.RESET} {message}")