From 1020cd97dc6ca74c520d72ca01016254953b2f5f Mon Sep 17 00:00:00 2001 From: erdemerikci Date: Fri, 19 Jun 2026 16:27:30 +0300 Subject: [PATCH] Implement new functions for parsing and retrieving ring bounds in kilometers, enhancing report generation logic. Remove redundant `_ring_upper_km` function and update sorting of ring items based on lower bounds, improving clarity and accuracy in report outputs. --- src/reporting/docx.py | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/reporting/docx.py b/src/reporting/docx.py index 62b992a..0d3febf 100644 --- a/src/reporting/docx.py +++ b/src/reporting/docx.py @@ -345,6 +345,30 @@ def _add_ring_bullet(doc: Document, ring_label: str, ring_color: str | None, siz r.font.size = Pt(size_pt) +def _parse_ring_bounds_km(label: str) -> tuple[float | None, float | None]: + s = str(label).strip() + if ":" in s: + s = s.split(":", 1)[0] + s = s.lower().replace("km", "").strip() + if "-" not in s: + return None, None + try: + lower_str, upper_str = s.split("-", 1) + return float(lower_str), float(upper_str) + except Exception: + return None, None + + +def _ring_lower_km(label: str) -> float: + lower, _ = _parse_ring_bounds_km(label) + return lower if lower is not None else float("inf") + + +def _ring_upper_km(label: str) -> float | None: + _, upper = _parse_ring_bounds_km(label) + return upper + + def _ring_color_for_label(label: str) -> str | None: s = str(label) if ":" in s: @@ -743,20 +767,6 @@ def create_docx_report( # Align the "outermost" ring used for commentary with the analysis radius used in stats. outermost_upper_km = analysis_radius_km - def _ring_upper_km(label: str) -> float | None: - s = str(label).strip() - if ":" in s: - s = s.split(":", 1)[0] - s = s.lower().replace("km", "").strip() - # Expected formats: "0-2.0" or "2.0-4.0" - if "-" not in s: - return None - try: - upper = float(s.split("-", 1)[1]) - return upper - except Exception: - return None - rings = [] for ring_name, ring_data in ring_stats.items(): total = int(ring_data.get("total", 0)) @@ -1080,7 +1090,10 @@ def create_docx_report( ) ring_items: list[str] = [] - for ring_name, ring_data in sorted((stats.get("lightning_by_distance_rings") or {}).items()): + for ring_name, ring_data in sorted( + (stats.get("lightning_by_distance_rings") or {}).items(), + key=lambda kv: _ring_lower_km(kv[0]), + ): if ring_data.get("total", 0) > 0: ring_items.append( s.ring_item.format(