From 7e71fa01c4c4a6139ceab9c0f1784bf599ee11ec Mon Sep 17 00:00:00 2001 From: Gerry Campion Date: Wed, 9 Aug 2023 14:13:38 -0400 Subject: [PATCH] Report on "ISSUE_REPORTED" and "EXECUTION_ERROR" --- cdisc_rules_engine/enums/execution_status.py | 7 + .../services/reporting/base_report.py | 142 +++++++++++------- cdisc_rules_engine/utilities/utils.py | 80 ++++++++-- resources/templates/report-template.xlsx | Bin 117193 -> 118949 bytes tests/unit/test_rules_engine.py | 62 ++++---- .../test_reporting/test_excel_export.py | 6 +- .../test_reporting/test_json_export.py | 6 +- 7 files changed, 200 insertions(+), 103 deletions(-) diff --git a/cdisc_rules_engine/enums/execution_status.py b/cdisc_rules_engine/enums/execution_status.py index d1b6b58bb..96ab25540 100644 --- a/cdisc_rules_engine/enums/execution_status.py +++ b/cdisc_rules_engine/enums/execution_status.py @@ -5,3 +5,10 @@ class ExecutionStatus(BaseEnum): SUCCESS = "success" SKIPPED = "skipped" EXECUTION_ERROR = "execution_error" + ISSUE_REPORTED = "issue_reported" + UNKNOWN_STATUS = "unknown_status" + + +class ExecutionError(BaseEnum): + AN_UNKNOWN_EXCEPTION_HAS_OCCURRED = "An unknown exception has occurred" + COLUMN_NOT_FOUND_IN_DATA = "Column not found in data" diff --git a/cdisc_rules_engine/services/reporting/base_report.py b/cdisc_rules_engine/services/reporting/base_report.py index 32798e401..2a4cf9201 100644 --- a/cdisc_rules_engine/services/reporting/base_report.py +++ b/cdisc_rules_engine/services/reporting/base_report.py @@ -4,7 +4,7 @@ from openpyxl import Workbook -from cdisc_rules_engine.enums.execution_status import ExecutionStatus +from cdisc_rules_engine.enums.execution_status import ExecutionStatus, ExecutionError from cdisc_rules_engine.models.rule_validation_result import RuleValidationResult from cdisc_rules_engine.models.validation_args import Validation_args @@ -47,24 +47,24 @@ def get_summary_data(self) -> List[List]: """ summary_data = [] for validation_result in self._results: - if validation_result.execution_status == "success": - for result in validation_result.results or []: - dataset = result.get("domain") - if ( - result.get("errors") - and result.get("executionStatus") == "success" - ): - summary_item = { - "dataset": dataset, - "core_id": validation_result.id, - "message": result.get("message"), - "issues": len(result.get("errors")), - } - - if self._item_type == "list": - summary_data.extend([[*summary_item.values()]]) - elif self._item_type == "dict": - summary_data.extend([summary_item]) + for result in validation_result.results or []: + dataset = result.get("domain") + if ( + result.get("errors") + and result.get("executionStatus") + == ExecutionStatus.ISSUE_REPORTED.value + ): + summary_item = { + "dataset": dataset, + "core_id": validation_result.id, + "message": result.get("message"), + "issues": len(result.get("errors")), + } + + if self._item_type == "list": + summary_data.extend([[*summary_item.values()]]) + elif self._item_type == "dict": + summary_data.extend([summary_item]) return sorted( summary_data, @@ -86,6 +86,70 @@ def get_detailed_data(self) -> List[List]: else (x["core_id"], x["dataset"]), ) + def _issue_details(self, validation_result: RuleValidationResult, result: dict): + errors = [] + variables = result.get("variables", []) + for error in [ + error + for error in result.get("errors") + if error.get("error") + not in [ + ExecutionError.AN_UNKNOWN_EXCEPTION_HAS_OCCURRED.value, + ExecutionError.COLUMN_NOT_FOUND_IN_DATA.value, + ] + ]: + error_item = { + "core_id": validation_result.id, + "message": result.get("message"), + "executability": validation_result.executability, + "dataset": result.get("domain") or "", + "USUBJID": error.get("USUBJID", ""), + "row": error.get("row", ""), + "SEQ": error.get("SEQ", ""), + } + + if self._item_type == "list": + error_item["variables"] = ", ".join(variables) + error_item["values"] = ", ".join( + [ + str(error.get("value", {}).get(variable)) + for variable in variables + ] + ) + errors = errors + [[*error_item.values()]] + elif self._item_type == "dict": + error_item["variables"] = variables + error_item["values"] = [ + str(error.get("value", {}).get(variable)) for variable in variables + ] + errors = errors + [error_item] + return errors + + def _error_details(self, validation_result: RuleValidationResult, result: dict): + errors = [] + for error in [ + error + for error in result.get("errors") + if error.get("error") + == ExecutionError.AN_UNKNOWN_EXCEPTION_HAS_OCCURRED.value + ]: + error_item = { + "core_id": validation_result.id, + "message": (f"{result.get('message')} - {error.get('error')}"), + "executability": validation_result.executability, + "dataset": result.get("domain") or "", + "USUBJID": "", + "row": "", + "SEQ": "", + "variables": "", + "values": error.get("message"), + } + if self._item_type == "list": + errors = errors + [[*error_item.values()]] + elif self._item_type == "dict": + errors = errors + [error_item] + return errors + def _generate_error_details( self, validation_result: RuleValidationResult ) -> List[List]: @@ -107,35 +171,11 @@ def _generate_error_details( """ errors = [] for result in validation_result.results or []: - if result.get("errors", []) and result.get("executionStatus") == "success": - variables = result.get("variables", []) - for error in result.get("errors"): - error_item = { - "core_id": validation_result.id, - "message": result.get("message"), - "executability": validation_result.executability, - "dataset": result.get("domain"), - "USUBJID": error.get("USUBJID", ""), - "row": error.get("row", ""), - "SEQ": error.get("SEQ", ""), - } - - if self._item_type == "list": - error_item["variables"] = ", ".join(variables) - error_item["values"] = ", ".join( - [ - str(error.get("value", {}).get(variable)) - for variable in variables - ] - ) - errors = errors + [[*error_item.values()]] - elif self._item_type == "dict": - error_item["variables"] = variables - error_item["values"] = [ - str(error.get("value", {}).get(variable)) - for variable in variables - ] - errors = errors + [error_item] + errors = ( + errors + + self._issue_details(validation_result, result) + + self._error_details(validation_result, result) + ) return errors def get_rules_report_data(self) -> List[List]: @@ -162,9 +202,9 @@ def get_rules_report_data(self) -> List[List]: "fda_rule_id": validation_result.fda_rule_id, "pmda_rule_id": validation_result.pmda_rule_id, "message": validation_result.message, - "status": ExecutionStatus.SUCCESS.value.upper() - if validation_result.execution_status == ExecutionStatus.SUCCESS.value - else ExecutionStatus.SKIPPED.value.upper(), + "status": ExecutionStatus( + validation_result.execution_status + ).value.upper(), } if self._item_type == "list": rules_report.append([*rules_item.values()]) diff --git a/cdisc_rules_engine/utilities/utils.py b/cdisc_rules_engine/utilities/utils.py index 4f9ae3754..c4312f8af 100644 --- a/cdisc_rules_engine/utilities/utils.py +++ b/cdisc_rules_engine/utilities/utils.py @@ -16,7 +16,7 @@ SUPPLEMENTARY_DOMAINS, ) from cdisc_rules_engine.constants.classes import SPECIAL_PURPOSE -from cdisc_rules_engine.enums.execution_status import ExecutionStatus +from cdisc_rules_engine.enums.execution_status import ExecutionError, ExecutionStatus from cdisc_rules_engine.interfaces import ConditionInterface from cdisc_rules_engine.models.base_validation_entity import BaseValidationEntity @@ -44,25 +44,75 @@ def mark_domain_as_validated(domain: str, validated_domains: Set[str]): def get_execution_status(results): """ - If all results have skipped status, return skipped. - Else return success + If any result has an execution error, return execution error + Else if any result has an issue reported, return issue reported + Else if any result is successful, return issue successful + Else, result should have all skips, return issue skipped """ if len(results) == 0: return ExecutionStatus.SUCCESS.value - if isinstance(results[0], BaseValidationEntity): - successful_results = [ - entity for entity in results if entity.status == ExecutionStatus.SUCCESS - ] - else: - successful_results = [ - result - for result in results - if result.get("executionStatus") == ExecutionStatus.SUCCESS.value - ] - if successful_results: + status = ( + { + ExecutionStatus.SUCCESS: [], + ExecutionStatus.EXECUTION_ERROR: [], + ExecutionStatus.ISSUE_REPORTED: results, + ExecutionStatus.SKIPPED: [], + } + if isinstance(results[0], BaseValidationEntity) + else { + ExecutionStatus.SUCCESS: [ + result + for result in results + if result.get("executionStatus") == ExecutionStatus.SUCCESS.value + ], + ExecutionStatus.EXECUTION_ERROR: [ + result + for result in results + if result.get("executionStatus") + == ExecutionStatus.EXECUTION_ERROR.value + and [ + error + for error in result.get("errors", []) + if error.get("error") + == ExecutionError.AN_UNKNOWN_EXCEPTION_HAS_OCCURRED.value + ] + ], + ExecutionStatus.ISSUE_REPORTED: [ + result + for result in results + if result.get("executionStatus") == ExecutionStatus.ISSUE_REPORTED.value + ], + ExecutionStatus.SKIPPED: [ + result + for result in results + if result.get("executionStatus") == ExecutionStatus.SKIPPED.value + or [ + error + for error in result.get("errors", []) + if error.get("error") + == ExecutionError.COLUMN_NOT_FOUND_IN_DATA.value + ] + ], + } + ) + print("break") + if len(results) != ( + len(status[ExecutionStatus.SUCCESS]) + + len(status[ExecutionStatus.EXECUTION_ERROR]) + + len(status[ExecutionStatus.ISSUE_REPORTED]) + + len(status[ExecutionStatus.SKIPPED]) + ): + return ExecutionStatus.UNKNOWN_STATUS.value + elif status[ExecutionStatus.EXECUTION_ERROR]: + return ExecutionStatus.EXECUTION_ERROR.value + elif status[ExecutionStatus.ISSUE_REPORTED]: + return ExecutionStatus.ISSUE_REPORTED.value + elif status[ExecutionStatus.SUCCESS]: return ExecutionStatus.SUCCESS.value - else: + elif status[ExecutionStatus.SKIPPED]: return ExecutionStatus.SKIPPED.value + else: + return ExecutionStatus.UNKNOWN_STATUS.value def get_standard_codelist_cache_key(standard: str, version: str) -> str: diff --git a/resources/templates/report-template.xlsx b/resources/templates/report-template.xlsx index 6c58ae0a88ce0a15571ad0214b0aeb508af648b0..77a004e218f90469cb5c521db135c52650f6528c 100644 GIT binary patch delta 10287 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 ZE5x7|^b|h11CrhgqI(eB4LzxF{|^9&YbF2y delta 8501 zcmZu%WmFx_vONcP3-0a~oZwCf?(XgmfxrX}5?oGjhv4q+7M$P?2?QqzZjZ>l-+TAI z`BAHCcTMf8p6Q-m-BXYQKb!zxMF)>KR3oP{2@L}ICa}X30{eUzenvKr5{Z|yF0$fb za+Ty{y7?E5Qq4zZ7FcR!v@Ua=NFQ4s{RR

eRLDPbi&F2Z^&%_&J;J8d#9GLy(5O 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 RJH&4iObJ)n^)x_1{{vg3=NbS2 diff --git a/tests/unit/test_rules_engine.py b/tests/unit/test_rules_engine.py index 713308c4c..00b31cb22 100644 --- a/tests/unit/test_rules_engine.py +++ b/tests/unit/test_rules_engine.py @@ -87,7 +87,7 @@ def test_validate_rule_invalid_suffix( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Suffix of AESTDY is equal to test.", @@ -121,7 +121,7 @@ def test_validate_rule_invalid_prefix( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Prefix of AESTDY is equal to test.", @@ -218,7 +218,7 @@ def test_validate_rule_cross_dataset_check( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["ECSTDY"], "message": "Value of ECSTDY is equal to AESTDY.", @@ -305,7 +305,7 @@ def test_validate_one_to_one_rel_across_datasets(dataset_rule_one_to_one_related ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["VISITNUM"], "message": "VISITNUM is not one-to-one related to VISIT", @@ -339,7 +339,7 @@ def test_validate_rule_single_dataset_check(dataset_rule_greater_than: dict): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["ECCOOLVAR"], "message": "Value for ECCOOLVAR greater than 30.", @@ -373,7 +373,7 @@ def test_validate_rule_equal_length(dataset_rule_has_equal_length: dict): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["ECCOOLVAR"], "message": "Length of ECCOOLVAR is equal to 5.", @@ -404,7 +404,7 @@ def test_validate_is_contained_by_distinct(mock_rule_distinct_operation: dict): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Value for AESTDY not in DM.USUBJID", @@ -435,7 +435,7 @@ def test_validate_rule_not_equal_length(dataset_rule_has_not_equal_length: dict) ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["ECCOOLVAR"], "message": "Length of ECCOOLVAR is not equal to 5.", @@ -460,7 +460,7 @@ def test_validate_rule_multiple_conditions(dataset_rule_multiple_conditions: dic ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["ECCOOLVAR"], "message": ( @@ -490,7 +490,7 @@ def test_validate_record_rule_numbers_separated_by_dash_pattern(): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Records have the following pattern: ^\\d+\\-\\d+$", @@ -518,7 +518,7 @@ def test_validate_record_rule_semi_colon_delimited_pattern(): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Records have the following pattern: [^,]*;[^,]*", @@ -548,7 +548,7 @@ def test_validate_record_rule_no_letters_numbers_underscores(): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Records have the following pattern: ^((?![a-zA-Z0-9_]).)*$", @@ -630,7 +630,7 @@ def test_validate_dataset_metadata_wrong_metadata( assert validation_result == [ { "domain": "EC", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["dataset_label", "dataset_name", "dataset_size"], "errors": [ { @@ -723,7 +723,7 @@ def test_validate_variable_metadata_wrong_metadata( { "domain": "EC", "variables": ["variable_data_type", "variable_label", "variable_name"], - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "errors": [ { "row": 1, @@ -788,7 +788,7 @@ def test_rule_with_domain_prefix_replacement(mock_get_dataset: MagicMock): ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AESTDY"], "message": "Invalid AESTDY value", @@ -813,7 +813,7 @@ def test_rule_with_domain_prefix_replacement(mock_get_dataset: MagicMock): ], [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["AE"], "message": "Domain AE exists", @@ -888,7 +888,7 @@ def test_validate_single_rule(dataset_rule_equal_to_error_objects: dict): assert validation_result == [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["AESTDY"], "errors": [ { @@ -963,7 +963,7 @@ def test_validate_single_rule_not_equal_to( assert validation_result == [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["AESTDY"], "errors": [ { @@ -1017,7 +1017,7 @@ def test_validate_single_rule_not_equal_to( [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["dataset_label", "dataset_location", "dataset_name"], "errors": [ { @@ -1126,7 +1126,7 @@ def test_validate_dataset_metadata_against_define_xml( [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["variable_size"], "errors": [{"row": 1, "value": {"variable_size": 30}}], "message": ( @@ -1164,7 +1164,7 @@ def test_validate_dataset_metadata_against_define_xml( [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["variable_size"], "errors": [{"row": 1, "value": {"variable_size": 30}}], "message": ( @@ -1258,7 +1258,7 @@ def filter_func(row): assert validation_result == [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": [ "AETERM", ], @@ -1306,7 +1306,7 @@ def filter_func(row): [ { "domain": "AE", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["AESTDY"], "errors": [ {"row": 1, "value": {"AESTDY": "test"}, "USUBJID": "1"}, @@ -1458,7 +1458,7 @@ def test_validate_split_dataset_metadata( assert validation_result == [ { "domain": "EC", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "errors": [ { "row": 2, @@ -1518,7 +1518,7 @@ def test_validate_split_dataset_variables_metadata( assert validation_result == [ { "domain": "EC", - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "variables": ["variable_data_type", "variable_label", "variable_name"], "errors": [ { @@ -1631,7 +1631,7 @@ def test_validate_record_in_parent_domain( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "EC", "variables": ["ECPRESP", "QNAM"], "message": "Dataset contents is wrong.", @@ -1693,7 +1693,7 @@ def test_validate_additional_columns( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "TS", "variables": ["TSVAL1", "TSVAL2", "TSVAL3"], "message": "Additional columns for TSVAL are empty.", @@ -1808,7 +1808,7 @@ def test_validate_dataset_contents_against_define_and_library_variable_metadata( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": [ "AESER", @@ -1969,7 +1969,7 @@ def test_validate_extract_metadata_operation( ) assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "SUPPEC", "variables": [ "RDOMAIN", @@ -2047,7 +2047,7 @@ def test_dataset_references_invalid_whodrug_terms( assert validation_result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": [ "AEINA", @@ -2174,7 +2174,7 @@ def test_validate_variables_order_against_library_metadata( ) assert result == [ { - "executionStatus": "success", + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "domain": "AE", "variables": ["$column_order_from_dataset", "$column_order_from_library"], "message": RuleProcessor.extract_message_from_rule( diff --git a/tests/unit/test_services/test_reporting/test_excel_export.py b/tests/unit/test_services/test_reporting/test_excel_export.py index 9e56d2a36..856f4232c 100644 --- a/tests/unit/test_services/test_reporting/test_excel_export.py +++ b/tests/unit/test_services/test_reporting/test_excel_export.py @@ -63,7 +63,7 @@ { "domain": "AE", "variables": ["AESTDY", "DOMAIN"], - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "errors": [ { "row": 1, @@ -133,7 +133,7 @@ { "domain": "TT", "variables": ["TTVAR1", "TTVAR2"], - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "errors": [ { "row": 1, @@ -165,7 +165,7 @@ def test_get_rules_report_data(): result.fda_rule_id, result.pmda_rule_id, result.message, - ExecutionStatus.SUCCESS.value.upper(), + ExecutionStatus.ISSUE_REPORTED.value.upper(), ] ) expected_reports = sorted(expected_reports, key=lambda x: x[0]) diff --git a/tests/unit/test_services/test_reporting/test_json_export.py b/tests/unit/test_services/test_reporting/test_json_export.py index 85471ec53..7fe4c44af 100644 --- a/tests/unit/test_services/test_reporting/test_json_export.py +++ b/tests/unit/test_services/test_reporting/test_json_export.py @@ -56,7 +56,7 @@ { "domain": "AE", "variables": ["AESTDY", "DOMAIN"], - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "errors": [ { "row": 1, @@ -126,7 +126,7 @@ { "domain": "TT", "variables": ["TTVAR1", "TTVAR2"], - "executionStatus": ExecutionStatus.SUCCESS.value, + "executionStatus": ExecutionStatus.ISSUE_REPORTED.value, "errors": [ { "row": 1, @@ -157,7 +157,7 @@ def test_get_rules_report_data(): "fda_rule_id": result.fda_rule_id, "pmda_rule_id": result.pmda_rule_id, "message": result.message, - "status": ExecutionStatus.SUCCESS.value.upper(), + "status": ExecutionStatus.ISSUE_REPORTED.value.upper(), } ) expected_reports = sorted(expected_reports, key=lambda x: x["core_id"])