Coverage for src / tracekit / reporting / content / verbosity.py: 100%

33 statements  

« prev     ^ index     » next       coverage.py v7.13.1, created at 2026-01-11 23:04 +0000

1"""Verbosity level control for reports. 

2 

3Configurable report detail level for different audiences with 5 distinct 

4verbosity levels from executive to debug. 

5 

6 

7References: 

8""" 

9 

10from __future__ import annotations 

11 

12from dataclasses import dataclass 

13from enum import Enum 

14from typing import TYPE_CHECKING 

15 

16if TYPE_CHECKING: 

17 from tracekit.reporting.core import Report 

18 

19 

20class VerbosityLevel(Enum): 

21 """Verbosity levels for report detail. 

22 

23 - EXECUTIVE: 1 page, pass/fail + key findings only 

24 - SUMMARY: 2-5 pages, results + brief context, no raw data 

25 - STANDARD: 5-20 pages, full results + methodology + plots 

26 - DETAILED: 20-50 pages, all measurements + intermediate results 

27 - DEBUG: 50+ pages, raw data + traces + full provenance 

28 

29 References: 

30 REPORT-009: Verbosity Level Control 

31 """ 

32 

33 EXECUTIVE = "executive" 

34 SUMMARY = "summary" 

35 STANDARD = "standard" 

36 DETAILED = "detailed" 

37 DEBUG = "debug" 

38 

39 

40@dataclass 

41class VerbosityController: 

42 """Verbosity level controller. 

43 

44 Attributes: 

45 level: Current verbosity level. 

46 

47 References: 

48 REPORT-009: Verbosity Level Control 

49 """ 

50 

51 level: VerbosityLevel = VerbosityLevel.STANDARD 

52 

53 def should_include_section(self, section_name: str) -> bool: 

54 """Determine if section should be included at current verbosity. 

55 

56 Args: 

57 section_name: Name of section to check. 

58 

59 Returns: 

60 True if section should be included. 

61 

62 References: 

63 REPORT-009: Verbosity Level Control 

64 """ 

65 # Define sections for each level 

66 sections_by_level = { 

67 VerbosityLevel.EXECUTIVE: {"executive_summary", "key_findings"}, 

68 VerbosityLevel.SUMMARY: {"summary", "results", "key_plots"}, 

69 VerbosityLevel.STANDARD: { 

70 "summary", 

71 "results", 

72 "methodology", 

73 "plots", 

74 "tables", 

75 }, 

76 VerbosityLevel.DETAILED: { 

77 "summary", 

78 "results", 

79 "methodology", 

80 "plots", 

81 "tables", 

82 "measurements", 

83 "intermediate_results", 

84 }, 

85 VerbosityLevel.DEBUG: { 

86 "summary", 

87 "results", 

88 "methodology", 

89 "plots", 

90 "tables", 

91 "measurements", 

92 "intermediate_results", 

93 "raw_data", 

94 "logs", 

95 "provenance", 

96 }, 

97 } 

98 

99 allowed_sections = sections_by_level.get(self.level, set()) 

100 return section_name in allowed_sections 

101 

102 def get_max_pages(self) -> int: 

103 """Get maximum pages for current verbosity level. 

104 

105 Returns: 

106 Maximum page count. 

107 

108 References: 

109 REPORT-009: Verbosity Level Control 

110 """ 

111 max_pages = { 

112 VerbosityLevel.EXECUTIVE: 1, 

113 VerbosityLevel.SUMMARY: 5, 

114 VerbosityLevel.STANDARD: 20, 

115 VerbosityLevel.DETAILED: 50, 

116 VerbosityLevel.DEBUG: 999, 

117 } 

118 return max_pages.get(self.level, 20) 

119 

120 

121def apply_verbosity_level( 

122 report: Report, 

123 level: VerbosityLevel | str, 

124) -> None: 

125 """Apply verbosity level to report. 

126 

127 Args: 

128 report: Report object to modify. 

129 level: Verbosity level to apply. 

130 

131 Example: 

132 >>> from tracekit.reporting.core import Report, ReportConfig 

133 >>> report = Report(config=ReportConfig()) 

134 >>> apply_verbosity_level(report, "summary") 

135 

136 References: 

137 REPORT-009: Verbosity Level Control 

138 """ 

139 if isinstance(level, str): 

140 level = VerbosityLevel(level.lower()) 

141 

142 controller = VerbosityController(level=level) 

143 

144 # Filter sections based on verbosity 

145 if hasattr(report, "sections"): 

146 visible_sections = [] 

147 for section in report.sections: 

148 if controller.should_include_section(section.title.lower()): 

149 visible_sections.append(section) 

150 

151 report.sections = visible_sections 

152 

153 # Update config 

154 if hasattr(report, "config"): 

155 report.config.verbosity = level.value 

156 

157 

158__all__ = [ 

159 "VerbosityController", 

160 "VerbosityLevel", 

161 "apply_verbosity_level", 

162]