Add should_use_color() function to hermes_cli/colors.py that checks NO_COLOR (https://no-color.org/) and TERM=dumb before emitting ANSI escapes. The existing color() helper now uses this function instead of a bare isatty() check. This is the foundation — cli.py and banner.py still have inline ANSI constants that bypass this module (tracked in #4071). Closes #4066 Co-authored-by: SHL0MS <SHL0MS@users.noreply.github.com>
39 lines
937 B
Python
39 lines
937 B
Python
"""Shared ANSI color utilities for Hermes CLI modules."""
|
|
|
|
import os
|
|
import sys
|
|
|
|
|
|
def should_use_color() -> bool:
|
|
"""Return True when colored output is appropriate.
|
|
|
|
Respects the NO_COLOR environment variable (https://no-color.org/)
|
|
and TERM=dumb, in addition to the existing TTY check.
|
|
"""
|
|
if os.environ.get("NO_COLOR") is not None:
|
|
return False
|
|
if os.environ.get("TERM") == "dumb":
|
|
return False
|
|
if not sys.stdout.isatty():
|
|
return False
|
|
return True
|
|
|
|
|
|
class Colors:
|
|
RESET = "\033[0m"
|
|
BOLD = "\033[1m"
|
|
DIM = "\033[2m"
|
|
RED = "\033[31m"
|
|
GREEN = "\033[32m"
|
|
YELLOW = "\033[33m"
|
|
BLUE = "\033[34m"
|
|
MAGENTA = "\033[35m"
|
|
CYAN = "\033[36m"
|
|
|
|
|
|
def color(text: str, *codes) -> str:
|
|
"""Apply color codes to text (only when color output is appropriate)."""
|
|
if not should_use_color():
|
|
return text
|
|
return "".join(codes) + text + Colors.RESET
|