From 0d5c630c7da3daa6efa1978642ee7931fc0173c6 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Wed, 13 May 2026 16:34:30 -0400 Subject: [PATCH] normalize standards --- TestRule/__init__.py | 6 ++- cdisc_rules_engine/enums/standard_types.py | 5 ++- cdisc_rules_engine/utilities/utils.py | 48 +++++++++++++--------- 3 files changed, 36 insertions(+), 23 deletions(-) diff --git a/TestRule/__init__.py b/TestRule/__init__.py index d0f88256d..b23f6645f 100644 --- a/TestRule/__init__.py +++ b/TestRule/__init__.py @@ -2,7 +2,7 @@ from cdisc_rules_engine.services.cache.in_memory_cache_service import ( InMemoryCacheService, ) -from cdisc_rules_engine.utilities.utils import normalize_adam_input +from cdisc_rules_engine.utilities.utils import normalize_standard_input from cdisc_rules_engine.services.cdisc_library_service import CDISCLibraryService from cdisc_rules_engine.services.cache.cache_populator_service import CachePopulator from scripts.run_validation import run_single_rule_validation @@ -119,7 +119,9 @@ def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse: # standard_version = standards_data.get("version") standard_substandard = standards_data.get("substandard") use_case = standards_data.get("use_case") - standard, standard_version = normalize_adam_input(standard, standard_version) + standard, standard_version = normalize_standard_input( + standard, standard_version + ) codelists = json_data.get("codelists", []) cache = InMemoryCacheService() library_service = CDISCLibraryService(api_key, cache) diff --git a/cdisc_rules_engine/enums/standard_types.py b/cdisc_rules_engine/enums/standard_types.py index f787d4afd..fd4b49bd6 100644 --- a/cdisc_rules_engine/enums/standard_types.py +++ b/cdisc_rules_engine/enums/standard_types.py @@ -6,6 +6,9 @@ class StandardTypes(BaseEnum): SDTMIG = "sdtmig" SENDIG = "sendig" - ADAM = "adam" + SENDIG_AR = "sendig-ar" + SENDIG_DART = "sendig-dart" + SENDIG_GENETOX = "sendig-genetox" + ADAMIG = "adamig" TIG = "tig" USDM = "usdm" diff --git a/cdisc_rules_engine/utilities/utils.py b/cdisc_rules_engine/utilities/utils.py index 8ee1c1e75..36ef49989 100644 --- a/cdisc_rules_engine/utilities/utils.py +++ b/cdisc_rules_engine/utilities/utils.py @@ -112,7 +112,7 @@ def get_execution_status(results): def get_standard_codelist_cache_key(standard: str, version: str) -> str: - standard, version = normalize_adam_input(standard, version) + standard, version = normalize_standard_input(standard, version) return f"{standard.lower()}-{version.replace('.', '-')}-codelists" @@ -142,7 +142,7 @@ def get_library_variables_metadata_cache_key( standard_type: str, standard_version: str, standard_substandard: str ) -> str: if not standard_substandard: - standard_type, standard_version = normalize_adam_input( + standard_type, standard_version = normalize_standard_input( standard_type, standard_version ) return f"library_variables_metadata/{standard_type}/{standard_version}" @@ -153,7 +153,7 @@ def get_library_variables_metadata_cache_key( def get_standard_details_cache_key( standard_type: str, standard_version: str, standard_substandard: str = None ) -> str: - standard_type, standard_version = normalize_adam_input( + standard_type, standard_version = normalize_standard_input( standard_type, standard_version ) if not standard_substandard: @@ -162,24 +162,32 @@ def get_standard_details_cache_key( return f"standards/{standard_type}/{standard_version}/{standard_substandard.lower()}" -def normalize_adam_input(standard: str, version: str) -> tuple: +def normalize_standard_input(standard: str, version: str) -> tuple: """ - Normalizes ADAM user input to the expected internal format. - Args: - standard: User input like 'adamig', 'adam-adae' - version: User input like '1-0' - Returns: - Tuple of (normalized_standard, normalized_version) - Examples: - - ('adamig', '1-0') -> ('adam', 'adamig-1-0') - - ('adam-adae', '1-0') -> ('adam', 'adam-adae-1-0') - - ('sdtm', '3-4') -> ('sdtm', '3-4') + Normalizes user CLI input for standards that have sub-variant prefixes, + translating them into the internal library path format used in the cache. + + The CDISC Library API stores sub-variants with the variant name folded + into the version field. + + Examples: + ('adamig', '1-3') -> ('adam', 'adamig-1-3') + ('adam-adae', '1-0') -> ('adam', 'adam-adae-1-0') + ('sendig-dart', '1-1') -> ('sendig', 'dart-1-1') + ('sendig-ar', '1-0') -> ('sendig', 'ar-1-0') + ('sendig-genetox', '1-0') -> ('sendig', 'genetox-1-0') + ('sdtmig-ap', '1-0') -> ('sdtmig', 'ap-1-0') + ('sdtmig-md', '1-0') -> ('sdtmig', 'md-1-0') """ - if standard: - standard_lower = standard.lower() - if standard_lower in ADAM_PRODUCTS: - return "adam", f"{standard_lower}-{version}" - # Non-ADAM standard - keep as is + if not standard: + return standard, version + standard_lower = standard.lower() + if standard_lower in ADAM_PRODUCTS: + return "adam", f"{standard_lower}-{version}" + for base in ("sendig", "sdtmig"): + if standard_lower.startswith(f"{base}-"): + sub = standard_lower[len(base) + 1 :] + return base, f"{sub}-{version}" return standard, version @@ -292,7 +300,7 @@ def get_variable_codelist_map_cache_key(standard: str, version: str, subversion) if subversion: return f"{standard}-{version}-{subversion}-codelists" else: - standard, version = normalize_adam_input(standard, version) + standard, version = normalize_standard_input(standard, version) return f"{standard}-{version}-codelists"