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
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-11 23:04 +0000
1"""Verbosity level control for reports.
3Configurable report detail level for different audiences with 5 distinct
4verbosity levels from executive to debug.
7References:
8"""
10from __future__ import annotations
12from dataclasses import dataclass
13from enum import Enum
14from typing import TYPE_CHECKING
16if TYPE_CHECKING:
17 from tracekit.reporting.core import Report
20class VerbosityLevel(Enum):
21 """Verbosity levels for report detail.
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
29 References:
30 REPORT-009: Verbosity Level Control
31 """
33 EXECUTIVE = "executive"
34 SUMMARY = "summary"
35 STANDARD = "standard"
36 DETAILED = "detailed"
37 DEBUG = "debug"
40@dataclass
41class VerbosityController:
42 """Verbosity level controller.
44 Attributes:
45 level: Current verbosity level.
47 References:
48 REPORT-009: Verbosity Level Control
49 """
51 level: VerbosityLevel = VerbosityLevel.STANDARD
53 def should_include_section(self, section_name: str) -> bool:
54 """Determine if section should be included at current verbosity.
56 Args:
57 section_name: Name of section to check.
59 Returns:
60 True if section should be included.
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 }
99 allowed_sections = sections_by_level.get(self.level, set())
100 return section_name in allowed_sections
102 def get_max_pages(self) -> int:
103 """Get maximum pages for current verbosity level.
105 Returns:
106 Maximum page count.
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)
121def apply_verbosity_level(
122 report: Report,
123 level: VerbosityLevel | str,
124) -> None:
125 """Apply verbosity level to report.
127 Args:
128 report: Report object to modify.
129 level: Verbosity level to apply.
131 Example:
132 >>> from tracekit.reporting.core import Report, ReportConfig
133 >>> report = Report(config=ReportConfig())
134 >>> apply_verbosity_level(report, "summary")
136 References:
137 REPORT-009: Verbosity Level Control
138 """
139 if isinstance(level, str):
140 level = VerbosityLevel(level.lower())
142 controller = VerbosityController(level=level)
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)
151 report.sections = visible_sections
153 # Update config
154 if hasattr(report, "config"):
155 report.config.verbosity = level.value
158__all__ = [
159 "VerbosityController",
160 "VerbosityLevel",
161 "apply_verbosity_level",
162]