From fab618196219d9bc570c7dcbe73a5ebe5960c26b Mon Sep 17 00:00:00 2001 From: Gerry Campion Date: Tue, 7 Jul 2026 10:23:08 -0400 Subject: [PATCH] sort csv results by column instead of by rule output variables --- .../services/reporting/base_report_data.py | 10 ++++++++-- .../services/reporting/sdtm_report_data.py | 2 +- .../services/reporting/usdm_report_data.py | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cdisc_rules_engine/services/reporting/base_report_data.py b/cdisc_rules_engine/services/reporting/base_report_data.py index 0ff05ae01..5fc1612ec 100644 --- a/cdisc_rules_engine/services/reporting/base_report_data.py +++ b/cdisc_rules_engine/services/reporting/base_report_data.py @@ -56,10 +56,16 @@ def process_values( processed_values.append(value) return processed_values - @abstractmethod def get_csv_rows(self) -> tuple[list[str], list[list[str]]]: """ - Return (header, rows) for the CSV output format. + Return (header, sorted_rows) for the CSV output format. Each row is a list of string values matching the header columns. + Sorting is applied lexicographically by full column order. """ + header, rows = self._get_csv_rows() + return header, sorted(rows, key=lambda row: tuple(row)) + + @abstractmethod + def _get_csv_rows(self) -> tuple[list[str], list[list[str]]]: + """Return (header, rows) before base-class sorting is applied.""" pass diff --git a/cdisc_rules_engine/services/reporting/sdtm_report_data.py b/cdisc_rules_engine/services/reporting/sdtm_report_data.py index e313db0d1..ced0b11d9 100644 --- a/cdisc_rules_engine/services/reporting/sdtm_report_data.py +++ b/cdisc_rules_engine/services/reporting/sdtm_report_data.py @@ -347,7 +347,7 @@ def _generate_error_details( ) return errors - def get_csv_rows(self) -> tuple[list[str], list[list[str]]]: + def _get_csv_rows(self) -> tuple[list[str], list[list[str]]]: header = ["Dataset", "Record", "Variable", "Value"] rows = [] for issue in self.data_sheets.get("Issue Details", []): diff --git a/cdisc_rules_engine/services/reporting/usdm_report_data.py b/cdisc_rules_engine/services/reporting/usdm_report_data.py index 2b89f74a5..f5a80d3ee 100644 --- a/cdisc_rules_engine/services/reporting/usdm_report_data.py +++ b/cdisc_rules_engine/services/reporting/usdm_report_data.py @@ -245,7 +245,7 @@ def _generate_error_details( ) return errors - def get_csv_rows(self) -> tuple[list[str], list[list[str]]]: + def _get_csv_rows(self) -> tuple[list[str], list[list[str]]]: header = ["path", "attribute", "value"] rows = [] for issue in self.data_sheets.get("Issue Details", []):