From 77d1143d4dd14fb77c0be6d862adab43c401ec83 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Fri, 16 Jan 2026 12:59:26 -0500 Subject: [PATCH 1/6] test --- core.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/core.py b/core.py index 3504abc8b..81ef225be 100644 --- a/core.py +++ b/core.py @@ -4,6 +4,7 @@ import os import pickle import tempfile +import sys from datetime import datetime from multiprocessing import freeze_support from dotenv import load_dotenv @@ -363,7 +364,7 @@ def _validate_no_arguments(logger) -> None: ), ) @click.pass_context -def validate( +def validate( # noqa ctx, cache: str, pool_size: int, @@ -406,7 +407,14 @@ def validate( python core.py -s SDTM -v 3.4 -d /path/to/datasets """ - + python_version = sys.version_info + if python_version.major != 3 or python_version.minor != 12: + logger = logging.getLogger("validator") + logger.warning( + f"Warning: This tool is designed for Python 3.12. " + f"You are using Python {python_version.major}.{python_version.minor}.{python_version.micro}. " + f"Executable: {sys.executable}" + ) # Validate conditional options logger = logging.getLogger("validator") load_dotenv() From a677e6c17888798bd56b6cb2ce4dd944f4bf9f3d Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Tue, 20 Jan 2026 09:10:58 -0500 Subject: [PATCH 2/6] readme --- README.md | 13 +++++++++---- core.py | 12 ++---------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8bc42b805..0c78dae27 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ Run `python core.py validate --help` to see the list of validation options. -v, --version TEXT Standard version to validate against [required] -ss, --substandard TEXT Substandard to validate against - [required for TIG] + [required for TIG] -ct, --controlled-terminology-package TEXT Controlled terminology package to validate against, can provide more than one @@ -434,7 +434,7 @@ pip install cdisc-rules-engine For implementation instructions, see [PYPI.md](PYPI.md). -### Cloning +### Source Code In the terminal, navigate to the directory you intend to install CORE rules engine in @@ -444,11 +444,16 @@ In the terminal, navigate to the directory you intend to install CORE rules engi git clone https://github.com/cdisc-org/cdisc-rules-engine ``` -2. Ensure you have Python 3.12 installed: - You can check your Python version with: +2. **IMPORTANT: Python 3.12 is required** + + CORE Rules Engine requires Python 3.12. Other versions are not supported and may cause unexpected errors or incorrect validation results. + + Check your Python version: + ``` python --version ``` + If you don't have Python 3.12, please download and install it from [python.org](https://www.python.org/downloads/) or using your system's package manager. ### Installing dependencies diff --git a/core.py b/core.py index 81ef225be..3504abc8b 100644 --- a/core.py +++ b/core.py @@ -4,7 +4,6 @@ import os import pickle import tempfile -import sys from datetime import datetime from multiprocessing import freeze_support from dotenv import load_dotenv @@ -364,7 +363,7 @@ def _validate_no_arguments(logger) -> None: ), ) @click.pass_context -def validate( # noqa +def validate( ctx, cache: str, pool_size: int, @@ -407,14 +406,7 @@ def validate( # noqa python core.py -s SDTM -v 3.4 -d /path/to/datasets """ - python_version = sys.version_info - if python_version.major != 3 or python_version.minor != 12: - logger = logging.getLogger("validator") - logger.warning( - f"Warning: This tool is designed for Python 3.12. " - f"You are using Python {python_version.major}.{python_version.minor}.{python_version.micro}. " - f"Executable: {sys.executable}" - ) + # Validate conditional options logger = logging.getLogger("validator") load_dotenv() From ed2f0847f477cade2aa2c2eba5e3ae6d7c5f3d16 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Tue, 20 Jan 2026 09:18:58 -0500 Subject: [PATCH 3/6] warning --- cdisc_rules_engine/utilities/utils.py | 13 +++++++++++++ core.py | 3 ++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cdisc_rules_engine/utilities/utils.py b/cdisc_rules_engine/utilities/utils.py index f3e001cee..ed7699822 100644 --- a/cdisc_rules_engine/utilities/utils.py +++ b/cdisc_rules_engine/utilities/utils.py @@ -7,6 +7,7 @@ import os import re import ast +import sys import pandas as pd from datetime import datetime from typing import Callable, Iterable, List, Optional, Union @@ -31,6 +32,7 @@ from cdisc_rules_engine.check_operators.helpers import is_valid_date from cdisc_rules_engine.models.sdtm_dataset_metadata import SDTMDatasetMetadata from cdisc_rules_engine.constants.adam_products import ADAM_PRODUCTS +from cdisc_rules_engine.services import logger def convert_file_size(size_in_bytes: int, desired_unit: str) -> float: @@ -481,3 +483,14 @@ def set_max_errors_per_rule(args): per_dataset = bool(env_per_dataset or cli_per_dataset) return max_errors_per_rule, per_dataset + + +def python_version_check(): + python_version = sys.version_info + if python_version.major != 3 or python_version.minor != 12: + logger.warning( + f"This tool is designed for the Python version outlined in the top of the readme." + f"You are using Python {python_version.major}.{python_version.minor}.{python_version.micro} " + f"You may experience unexpected errors or issues with the validation" + ) + return diff --git a/core.py b/core.py index 3504abc8b..77661a84b 100644 --- a/core.py +++ b/core.py @@ -27,6 +27,7 @@ generate_report_filename, get_rules_cache_key, validate_dataset_files_exist, + python_version_check, ) from cdisc_rules_engine.enums.dataformat_types import DataFormatTypes from scripts.list_dataset_metadata_handler import list_dataset_metadata_handler @@ -410,7 +411,7 @@ def validate( # Validate conditional options logger = logging.getLogger("validator") load_dotenv() - + python_version_check() validate_dataset_files_exist(dataset_path, logger, ctx) if raw_report is True: From 754256b12d0cab782ed3cf76bc98b5d848696aec Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Mon, 26 Jan 2026 09:24:25 -0500 Subject: [PATCH 4/6] minimum version --- cdisc_rules_engine/constants/__init__.py | 2 ++ cdisc_rules_engine/utilities/utils.py | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/cdisc_rules_engine/constants/__init__.py b/cdisc_rules_engine/constants/__init__.py index e61d21310..1b5119923 100644 --- a/cdisc_rules_engine/constants/__init__.py +++ b/cdisc_rules_engine/constants/__init__.py @@ -17,3 +17,5 @@ NULL_FLAVORS = ["", None, {None}, [], {}, np.nan] KNOWN_REPORT_EXTENSIONS = [".json", ".xlsx", ".xls"] + +PYTHON_MINIMUM_VERSION = (3, 12) diff --git a/cdisc_rules_engine/utilities/utils.py b/cdisc_rules_engine/utilities/utils.py index ed7699822..dc8847a9d 100644 --- a/cdisc_rules_engine/utilities/utils.py +++ b/cdisc_rules_engine/utilities/utils.py @@ -26,6 +26,7 @@ SUPPLEMENTARY_DOMAINS, ) from cdisc_rules_engine.constants.classes import SPECIAL_PURPOSE, SPECIAL_PURPOSE_MODEL +from cdisc_rules_engine.constants import PYTHON_MINIMUM_VERSION from cdisc_rules_engine.enums.execution_status import ExecutionStatus from cdisc_rules_engine.interfaces import ConditionInterface from cdisc_rules_engine.models.base_validation_entity import BaseValidationEntity @@ -486,11 +487,18 @@ def set_max_errors_per_rule(args): def python_version_check(): - python_version = sys.version_info - if python_version.major != 3 or python_version.minor != 12: + current = sys.version_info[:2] + + if current < PYTHON_MINIMUM_VERSION: + logger.error( + f"Python {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}+ is required. " + f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " + f"Please upgrade Python to continue." + ) + sys.exit(1) + elif current != PYTHON_MINIMUM_VERSION: logger.warning( - f"This tool is designed for the Python version outlined in the top of the readme." - f"You are using Python {python_version.major}.{python_version.minor}.{python_version.micro} " - f"You may experience unexpected errors or issues with the validation" + f"This tool was tested with Python {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}. " + f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " + f"The application may still work, but you may experience unexpected errors or issues with validation." ) - return From 728fb239eb93904833444575afbf86580a7c0017 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Tue, 27 Jan 2026 08:31:37 -0500 Subject: [PATCH 5/6] change --- cdisc_rules_engine/constants/__init__.py | 2 -- cdisc_rules_engine/utilities/utils.py | 21 --------------------- core.py | 19 +++++++++++++++++-- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/cdisc_rules_engine/constants/__init__.py b/cdisc_rules_engine/constants/__init__.py index 1b5119923..e61d21310 100644 --- a/cdisc_rules_engine/constants/__init__.py +++ b/cdisc_rules_engine/constants/__init__.py @@ -17,5 +17,3 @@ NULL_FLAVORS = ["", None, {None}, [], {}, np.nan] KNOWN_REPORT_EXTENSIONS = [".json", ".xlsx", ".xls"] - -PYTHON_MINIMUM_VERSION = (3, 12) diff --git a/cdisc_rules_engine/utilities/utils.py b/cdisc_rules_engine/utilities/utils.py index 541e3c491..f3b8906a5 100644 --- a/cdisc_rules_engine/utilities/utils.py +++ b/cdisc_rules_engine/utilities/utils.py @@ -9,7 +9,6 @@ import os import re import ast -import sys import pandas as pd from datetime import datetime from typing import Callable, Iterable, List, Optional, Union @@ -28,14 +27,12 @@ SUPPLEMENTARY_DOMAINS, ) from cdisc_rules_engine.constants.classes import SPECIAL_PURPOSE, SPECIAL_PURPOSE_MODEL -from cdisc_rules_engine.constants import PYTHON_MINIMUM_VERSION from cdisc_rules_engine.enums.execution_status import ExecutionStatus from cdisc_rules_engine.interfaces import ConditionInterface from cdisc_rules_engine.models.base_validation_entity import BaseValidationEntity from cdisc_rules_engine.check_operators.helpers import is_valid_date from cdisc_rules_engine.models.sdtm_dataset_metadata import SDTMDatasetMetadata from cdisc_rules_engine.constants.adam_products import ADAM_PRODUCTS -from cdisc_rules_engine.services import logger def convert_file_size(size_in_bytes: int, desired_unit: str) -> float: @@ -488,24 +485,6 @@ def set_max_errors_per_rule(args): return max_errors_per_rule, per_dataset -def python_version_check(): - current = sys.version_info[:2] - - if current < PYTHON_MINIMUM_VERSION: - logger.error( - f"Python {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}+ is required. " - f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " - f"Please upgrade Python to continue." - ) - sys.exit(1) - elif current != PYTHON_MINIMUM_VERSION: - logger.warning( - f"This tool was tested with Python {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}. " - f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " - f"The application may still work, but you may experience unexpected errors or issues with validation." - ) - - def load_json_with_optional_encoding(path: str, encoding: str | None = None) -> dict: tried = [] if encoding: diff --git a/core.py b/core.py index 3961c4702..f3018cf45 100644 --- a/core.py +++ b/core.py @@ -27,7 +27,6 @@ generate_report_filename, get_rules_cache_key, validate_dataset_files_exist, - python_version_check, ) from cdisc_rules_engine.enums.dataformat_types import DataFormatTypes from scripts.list_dataset_metadata_handler import list_dataset_metadata_handler @@ -411,7 +410,6 @@ def validate( # Validate conditional options logger = logging.getLogger("validator") load_dotenv() - python_version_check() validate_dataset_files_exist(dataset_path, logger, ctx) if raw_report is True: @@ -880,4 +878,21 @@ def test_validate(filetype): if __name__ == "__main__": freeze_support() + import sys + + current = sys.version_info[:2] + PYTHON_MINIMUM_VERSION = (3, 12) + if current < PYTHON_MINIMUM_VERSION: + print( + f"Python {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}+ is required. " + f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " + f"Please upgrade Python to continue." + ) + sys.exit(1) + elif current != PYTHON_MINIMUM_VERSION: + print( + f"This tool was tested wit hPython {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}. " + f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " + f"The application may still work, but you may experience unexpected errors or issues with validation." + ) cli() From 34c9967e057b536b10b7acd283e065f879a1fe45 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Tue, 27 Jan 2026 15:19:09 -0500 Subject: [PATCH 6/6] revert core.py --- core.py | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/core.py b/core.py index f3018cf45..3d4d663fd 100644 --- a/core.py +++ b/core.py @@ -410,6 +410,7 @@ def validate( # Validate conditional options logger = logging.getLogger("validator") load_dotenv() + validate_dataset_files_exist(dataset_path, logger, ctx) if raw_report is True: @@ -878,21 +879,4 @@ def test_validate(filetype): if __name__ == "__main__": freeze_support() - import sys - - current = sys.version_info[:2] - PYTHON_MINIMUM_VERSION = (3, 12) - if current < PYTHON_MINIMUM_VERSION: - print( - f"Python {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}+ is required. " - f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " - f"Please upgrade Python to continue." - ) - sys.exit(1) - elif current != PYTHON_MINIMUM_VERSION: - print( - f"This tool was tested wit hPython {PYTHON_MINIMUM_VERSION[0]}.{PYTHON_MINIMUM_VERSION[1]}. " - f"You are using Python {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}. " - f"The application may still work, but you may experience unexpected errors or issues with validation." - ) cli()