Coverage for packages / dqm-ml / src / dqm_ml / cli_tools.py: 100%
29 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 10:11 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-15 10:11 +0000
1"""CLI utilities for DQM-ML v2.
3This module provides utilities for colored console output and custom
4logging formatters.
5"""
7import logging
9from typing_extensions import override
12class Bcolors:
13 """ANSI color codes for terminal output formatting."""
15 HEADER = "\033[95m"
16 OKBLUE = "\033[94m"
17 OKCYAN = "\033[96m"
18 OKGREEN = "\033[92m"
19 WARNING = "\033[93m"
20 FAIL = "\033[91m"
21 ENDC = "\033[0m"
22 BOLD = "\033[1m"
23 UNDERLINE = "\033[4m"
26# TODO move logging in a dedicated module
27class CustomFormatter(logging.Formatter):
28 MSG_FMT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
30 LVL_COLOR = {
31 logging.DEBUG: Bcolors.OKBLUE,
32 logging.INFO: "",
33 logging.WARNING: Bcolors.WARNING,
34 logging.ERROR: Bcolors.FAIL,
35 logging.CRITICAL: Bcolors.FAIL + Bcolors.BOLD,
36 }
38 @override
39 def format(self, record: logging.LogRecord) -> str:
40 color = self.LVL_COLOR.get(record.levelno, "")
41 log_fmt = color + self.MSG_FMT + Bcolors.ENDC
42 formatter = logging.Formatter(log_fmt)
43 return formatter.format(record)
45 @classmethod
46 def init_log(cls, level: int | str, format: str = MSG_FMT) -> None:
47 # TODO : forward generic parameters of init_log to basicConfig
48 logging.basicConfig(format=format, level=level)
50 # We upgrade format for our color console formater
51 cls.MSG_FMT = format
53 # Adding color format to stream handler
54 logger = logging.getLogger()
55 for handler in logger.handlers:
56 if isinstance(handler, logging.StreamHandler):
57 handler.setFormatter(CustomFormatter())