Coverage for src / dotbot / messenger / messenger.py: 74%
42 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-29 10:55 -0800
« prev ^ index » next coverage.py v7.12.0, created at 2025-11-29 10:55 -0800
1from dotbot.messenger.color import Color
2from dotbot.messenger.level import Level
3from dotbot.util.singleton import Singleton
6class Messenger(metaclass=Singleton):
7 def __init__(self, level: Level = Level.ACTION):
8 self.set_level(level)
9 self.use_color(True)
11 def set_level(self, level: Level) -> None:
12 self._level = level
14 def use_color(self, yesno: bool) -> None: # noqa: FBT001
15 self._use_color = yesno
17 def log(self, level: Level, message: str) -> None:
18 if level >= self._level:
19 print(f"{self._color(level)}{message}{self._reset()}") # noqa: T201
21 def debug(self, message: str) -> None:
22 self.log(Level.DEBUG, message)
24 def action(self, message: str) -> None:
25 self.log(Level.ACTION, message)
27 def info(self, message: str) -> None:
28 self.log(Level.INFO, message)
30 def lowinfo(self, message: str) -> None:
31 """Deprecated: use info() or action() instead."""
32 self.info(message)
34 def warning(self, message: str) -> None:
35 self.log(Level.WARNING, message)
37 def error(self, message: str) -> None:
38 self.log(Level.ERROR, message)
40 def _color(self, level: Level) -> str:
41 """
42 Get a color (terminal escape sequence) according to a level.
43 """
44 if not self._use_color or level < Level.DEBUG:
45 return ""
46 if level < Level.INFO:
47 return Color.YELLOW
48 if level < Level.ACTION:
49 return Color.BLUE
50 if level < Level.WARNING:
51 return Color.GREEN
52 if level < Level.ERROR:
53 return Color.MAGENTA
54 return Color.RED
56 def _reset(self) -> str:
57 """
58 Get a reset color (terminal escape sequence).
59 """
60 if not self._use_color:
61 return ""
62 return Color.RESET