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

1from dotbot.messenger.color import Color 

2from dotbot.messenger.level import Level 

3from dotbot.util.singleton import Singleton 

4 

5 

6class Messenger(metaclass=Singleton): 

7 def __init__(self, level: Level = Level.ACTION): 

8 self.set_level(level) 

9 self.use_color(True) 

10 

11 def set_level(self, level: Level) -> None: 

12 self._level = level 

13 

14 def use_color(self, yesno: bool) -> None: # noqa: FBT001 

15 self._use_color = yesno 

16 

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 

20 

21 def debug(self, message: str) -> None: 

22 self.log(Level.DEBUG, message) 

23 

24 def action(self, message: str) -> None: 

25 self.log(Level.ACTION, message) 

26 

27 def info(self, message: str) -> None: 

28 self.log(Level.INFO, message) 

29 

30 def lowinfo(self, message: str) -> None: 

31 """Deprecated: use info() or action() instead.""" 

32 self.info(message) 

33 

34 def warning(self, message: str) -> None: 

35 self.log(Level.WARNING, message) 

36 

37 def error(self, message: str) -> None: 

38 self.log(Level.ERROR, message) 

39 

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 

55 

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