Coverage for little_loops/config/cli.py: 89%

1"""CLI presentation configuration dataclasses.

2

3 Covers ANSI color overrides for log levels, priority labels, type labels,

4 and general CLI display options.

5"""

6

7 from __future__ import annotations

8

9 from dataclasses import dataclass, field

10 from typing import Any

11

12

13@dataclass

14 class CliColorsLoggerConfig:

15 """ANSI color overrides for Logger log-level output."""

16

17 info: str = "36"

18 success: str = "32"

19 warning: str = "33"

20 error: str = "38;5;208"

21

22 @classmethod

23 def from_dict(cls, data: dict[str, Any]) -> CliColorsLoggerConfig:

24 """Create CliColorsLoggerConfig from dictionary."""

25 return cls(

26 info=data.get("info", "36"),

27 success=data.get("success", "32"),

28 warning=data.get("warning", "33"),

29 error=data.get("error", "38;5;208"),

30 )

31

32

33@dataclass

34 class CliColorsPriorityConfig:

35 """ANSI color overrides for issue priority labels (P0–P5)."""

36

37 P0: str = "38;5;208;1"

38 P1: str = "38;5;208"

39 P2: str = "33"

40 P3: str = "0"

41 P4: str = "2"

42 P5: str = "2"

43

44 @classmethod

45 def from_dict(cls, data: dict[str, Any]) -> CliColorsPriorityConfig:

46 """Create CliColorsPriorityConfig from dictionary."""

47 return cls(

48 P0=data.get("P0", "38;5;208;1"),

49 P1=data.get("P1", "38;5;208"),

50 P2=data.get("P2", "33"),

51 P3=data.get("P3", "0"),

52 P4=data.get("P4", "2"),

53 P5=data.get("P5", "2"),

54 )

55

56

57@dataclass

58 class CliColorsTypeConfig:

59 """ANSI color overrides for issue type labels (BUG, FEAT, ENH)."""

60

61 BUG: str = "38;5;208"

62 FEAT: str = "32"

63 ENH: str = "34"

64

65 @classmethod

66 def from_dict(cls, data: dict[str, Any]) -> CliColorsTypeConfig:

67 """Create CliColorsTypeConfig from dictionary."""

68 return cls(

69 BUG=data.get("BUG", "38;5;208"),

70 FEAT=data.get("FEAT", "32"),

71 ENH=data.get("ENH", "34"),

72 )

73

74

75@dataclass

76 class CliColorsConfig:

77 """ANSI color overrides for logger levels, priority labels, and type labels."""

78

79 logger: CliColorsLoggerConfig = field(default_factory=CliColorsLoggerConfig)

80 priority: CliColorsPriorityConfig = field(default_factory=CliColorsPriorityConfig)

81 type: CliColorsTypeConfig = field(default_factory=CliColorsTypeConfig)

82 fsm_active_state: str = "32"

83

84 @classmethod

85 def from_dict(cls, data: dict[str, Any]) -> CliColorsConfig:

86 """Create CliColorsConfig from dictionary."""

87 return cls(

88 logger=CliColorsLoggerConfig.from_dict(data.get("logger", {})),

89 priority=CliColorsPriorityConfig.from_dict(data.get("priority", {})),

90 type=CliColorsTypeConfig.from_dict(data.get("type", {})),

91 fsm_active_state=data.get("fsm_active_state", "32"),

92 )

93

94

95@dataclass

96 class RefineStatusConfig:

97 """refine-status display configuration."""

98

99 columns: list[str] = field(default_factory=list)

100 elide_order: list[str] = field(default_factory=list)

101

102 @classmethod

103 def from_dict(cls, data: dict[str, Any]) -> RefineStatusConfig:

104 """Create RefineStatusConfig from dictionary."""

105 return cls(

106 columns=data.get("columns", []),

107 elide_order=data.get("elide_order", []),

108 )

109

110

111@dataclass

112 class CliConfig:

113 """CLI output configuration."""

114

115 color: bool = True

116 colors: CliColorsConfig = field(default_factory=CliColorsConfig)

117

118 @classmethod

119 def from_dict(cls, data: dict[str, Any]) -> CliConfig:

120 """Create CliConfig from dictionary."""

121 return cls(

122 color=data.get("color", True),

123 colors=CliColorsConfig.from_dict(data.get("colors", {})),

124 )