xfstestsdb/xfstestsdb/colors.py
Anna Schumaker 6529eb61f8 xfstestsdb: Create a ColorScheme class
This will be used by tools to print out text with colored outut. I
provide 3 options:

  * A NoneScheme for printing text without any formatting
  * A DarkScheme with colors chosen for a dark terminal
  * A LightScheme with colors chosen for a light terminal

Users can set the XFSTESTSDB_COLORS environment variable to either
"none", "dark", or "light". If this environment variable isn't set, or
if it is set to an invalid value, then xfstestsdb will use dark mode by
default.

Signed-off-by: Anna Schumaker <anna@nowheycreamery.com>
2023-02-15 15:57:19 -05:00

103 lines
3.3 KiB
Python

# Copyright 2023 (c) Anna Schumaker.
"""Color handling functions."""
import os
import termcolor
class ColorScheme:
"""Base class for color scheme handling."""
def __init__(self, name: str) -> None:
"""Initialize a ColorScheme."""
self.name = name
def __getitem__(self, key: str | bool | None) -> None:
"""Get the color for the specific situation."""
return None
def format(self, text: str, color: str | None = None,
bgcolor: str | None = None, bold: bool = False,
dark: bool | str = False) -> str:
"""Format the given text based on the provided attributes."""
on_color = self[bgcolor]
on_color = f"on_{on_color}" if on_color else None
attrs = []
if bold:
attrs.append("bold")
if dark is True or self[dark]:
attrs.append("dark")
return termcolor.colored(text, color=self[color], on_color=on_color,
attrs=attrs)
class DarkScheme(ColorScheme):
"""Dark mode color scheme."""
def __getitem__(self, key: str) -> str | bool | None:
"""Get dark mode colors."""
match key:
case "diff-+": return "green"
case "diff--": return "red"
case "diff-@": return "magenta"
case "diff- ": return "light_grey"
case "fg" | "fg-odd": return "light_grey"
case "fg-even": return "cyan"
case "fg-dark": return False
case "fg-header": return "yellow"
case "fg-passed": return "green"
case "fg-failure": return "red"
case "fg-skipped": return "dark_grey"
case "fg-testcase": return "cyan"
case "table-bg": return "black"
case "table-border": return "dark_grey"
return None
class LightScheme(ColorScheme):
"""Light mode color scheme."""
def __getitem__(self, key: str) -> str | bool | None:
"""Get light mode colors."""
match key:
case "diff-+": return "green"
case "diff--": return "red"
case "diff-@": return "magenta"
case "diff- ": return "light_grey"
case "fg" | "fg-odd": return "dark_grey"
case "fg-even": return "green"
case "fg-dark": return True
case "fg-header": return "blue"
case "fg-passed": return "green"
case "fg-failure": return "red"
case "fg-skipped": return "light_grey"
case "fg-testcase": return "cyan"
case "table-bg": return "white"
case "table-border": return "light_grey"
return None
class NoneScheme(ColorScheme):
"""Color scheme for no colors."""
def format(self, text, *args, **kwargs) -> str:
"""Simply return the text with no formatting."""
return text
def get_default_colors() -> str:
"""Check the environment to determine the default color scheme."""
match os.getenv("XFSTESTSDB_COLORS"):
case "light": return "light"
case "none": return "none"
case _: return "dark"
def get_colors(color_scheme: str) -> ColorScheme:
"""Get the current color scheme."""
match color_scheme:
case "dark": return DarkScheme("dark")
case "light": return LightScheme("light")
case _: return NoneScheme("none")