From 8ae46a9926d71b72c57c660bb68043b39b184400 Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Tue, 28 Apr 2026 17:03:13 -0700 Subject: [PATCH 01/17] Define dependencies in pyproject.toml Moves dependency constraints to pyproject.toml. Makes requirements.txt a lockfile. --- .github/workflows/lint-format.yml | 2 +- .github/workflows/test-unit.yml | 4 +-- docs/contributing.md | 2 +- docs/development.md | 2 +- pyproject.toml | 42 ++++++++++++++++++++++++++++--- requirements-dev.txt | 7 ------ requirements.txt | 2 ++ 7 files changed, 46 insertions(+), 15 deletions(-) delete mode 100644 requirements-dev.txt diff --git a/.github/workflows/lint-format.yml b/.github/workflows/lint-format.yml index 4c7f70fe0..f455d0b78 100644 --- a/.github/workflows/lint-format.yml +++ b/.github/workflows/lint-format.yml @@ -49,7 +49,7 @@ jobs: python-version: "3.12" - name: Install linters run: | - pip install black flake8 -c requirements-dev.txt + pip install black flake8 - name: Run flake8 run: | flake8 ${{needs.get_changed_files.outputs.py}} --count --select=E9,F63,F7,F82 --show-source --statistics diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index 38a9e55ae..d11d78b30 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -16,8 +16,8 @@ jobs: python-version: "3.12" - name: Install requirements run: | - pip install -r requirements-dev.txt - pip install -e . + pip install -r requirements.txt + pip install --group dev -e . - name: Running Tests env: CDISC_LIBRARY_API_KEY: fakekey12341234 diff --git a/docs/contributing.md b/docs/contributing.md index d53a3315e..f087b60b9 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -34,7 +34,7 @@ This project enforces consistent formatting and linting via pre-commit hooks. - [`flake8`](https://flake8.pycqa.org/) — Python linter - [`prettier`](https://prettier.io/) — JSON, YAML, and Markdown formatter -Both `black` and `flake8` are included in `requirements-dev.txt`. After installing dependencies, install the pre-commit hooks: +Both `black` and `flake8` are included in the `dev` dependency group in `pyproject.toml`. After installing dependencies, install the pre-commit hooks: ```bash pre-commit install diff --git a/docs/development.md b/docs/development.md index bb4c27427..f39f2cccc 100644 --- a/docs/development.md +++ b/docs/development.md @@ -47,7 +47,7 @@ source venv/bin/activate .\venv\Scripts\Activate # Install dependencies -python -m pip install -r requirements-dev.txt +pip install -e . && pip install --group dev ``` --- diff --git a/pyproject.toml b/pyproject.toml index bb4d69066..53067241a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,12 +4,49 @@ build-backend = "setuptools.build_meta" [project] name = "cdisc-rules-engine" -dynamic = ["version", "dependencies"] +dynamic = ["version"] description = "Open source offering of the cdisc rules engine" readme = "docs/PYPI.md" requires-python = ">=3.12, <3.13" license = { text = "MIT" } authors = [{ name = "cdisc-org", email = "info@cdisc.org" }] +dependencies = [ + "business_rules_enhanced >=1.4.8", + "cachetools >=6.1.0", + "cdisc-library-client >=0.1.6", + "click >=8.1.7, <8.3.0", + "dask[dataframe,array] >=2024.6.0, <2024.8.1", + "fastparquet >=2024.2.0", + "importlib-metadata >=8.5.0", + "jsonata-python >=0.6.0", + "jsonpath-ng >=1.6.1, <1.8.0", + "jsonschema >=4.18.5", + "lxml >=5.2.1", + "numpy >=1.26.0", + "odmlib >=0.1.4", + "openpyxl >=3.1.5", + "pandas >=2.1.4, <2.2.0", + "psutil >=6.1.1", + "pyinstaller >=6.11.0", + "pympler >=1.1", + "pyreadstat >=1.2.7, <1.2.9", + "python-dotenv >=1.0.0", + "pyyaml >=6.0.2", + "redis >=4.5.0", + "requests >=2.32.3", + "setuptools >=75.6.0", + "titlecase >=2.4.1", +] + +[dependency-groups] +dev = [ + "black >=24.10.0", + "flake8 >=6.1.0", + "pre-commit >=2.20.0", + "pytest >=7.4.0, <8.0.0", + "pytest-asyncio >=0.21.0", + "pytest-cov >=6.0.0", +] [project.urls] "Homepage" = "https://github.com/cdisc-org/cdisc-rules-engine" @@ -26,5 +63,4 @@ include-package-data = true py-modules = ["version"] [tool.setuptools.dynamic] -version = { attr = "version.__version__" } -dependencies = {file = ["requirements.txt"]} \ No newline at end of file +version = { attr = "version.__version__" } \ No newline at end of file diff --git a/requirements-dev.txt b/requirements-dev.txt deleted file mode 100644 index ac709f651..000000000 --- a/requirements-dev.txt +++ /dev/null @@ -1,7 +0,0 @@ --r requirements.txt -black==24.10.0 -flake8==6.1.0 -pre-commit==2.20.0 -pytest==7.4.0 -pytest-asyncio==0.21.0 -pytest-cov==6.0.0 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 4481051f6..61556482d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,5 @@ +# Lockfile: exact pinned versions for reproducible installs. +# Dependency constraints are defined in pyproject.toml. business_rules_enhanced==1.4.8 cachetools==6.1.0 cdisc-library-client==0.1.6 From c6d67553628dca6e18563af5073766a5f96b9a30 Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Tue, 28 Apr 2026 17:08:54 -0700 Subject: [PATCH 02/17] Support click 8.3.0 Fixes an incompatibility caused by click 8.3.0, which passes the default value as-is. --- core.py | 2 -- pyproject.toml | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/core.py b/core.py index 98f0a5a70..ea660b867 100644 --- a/core.py +++ b/core.py @@ -357,7 +357,6 @@ def load_custom_dotenv_from_data_options(_ctx, _param, value): "-s", "--standard", required=True, - default=None, help="CDISC standard to validate against", envvar="PRODUCT", ) @@ -365,7 +364,6 @@ def load_custom_dotenv_from_data_options(_ctx, _param, value): "-v", "--version", required=True, - default=None, help="Standard version to validate against", envvar="VERSION", ) diff --git a/pyproject.toml b/pyproject.toml index 53067241a..cc3f2749b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,7 @@ dependencies = [ "business_rules_enhanced >=1.4.8", "cachetools >=6.1.0", "cdisc-library-client >=0.1.6", - "click >=8.1.7, <8.3.0", + "click >=8.1.7", "dask[dataframe,array] >=2024.6.0, <2024.8.1", "fastparquet >=2024.2.0", "importlib-metadata >=8.5.0", From 024eaf2a19ace0a3c7b18446f0e15092f574a193 Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Tue, 28 Apr 2026 17:09:40 -0700 Subject: [PATCH 03/17] Support pyreadstat 1.2.9 Fixes an incompatibility caused by pyreadstat 1.2.9, which changed original_variable_type from 'NULL' to None --- cdisc_rules_engine/services/datasetxpt_metadata_reader.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cdisc_rules_engine/services/datasetxpt_metadata_reader.py b/cdisc_rules_engine/services/datasetxpt_metadata_reader.py index f20506c91..b96dc4540 100644 --- a/cdisc_rules_engine/services/datasetxpt_metadata_reader.py +++ b/cdisc_rules_engine/services/datasetxpt_metadata_reader.py @@ -61,7 +61,7 @@ def read(self) -> dict: "variable_labels": list(metadata.column_labels), "variable_names": list(metadata.column_names), "variable_formats": [ - "" if data_type == "NULL" else data_type + "" if (data_type == "NULL" or data_type is None) else data_type for data_type in metadata.original_variable_types.values() ], "variable_name_to_label_map": metadata.column_names_to_labels, diff --git a/pyproject.toml b/pyproject.toml index cc3f2749b..d2ecefed3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,7 +29,7 @@ dependencies = [ "psutil >=6.1.1", "pyinstaller >=6.11.0", "pympler >=1.1", - "pyreadstat >=1.2.7, <1.2.9", + "pyreadstat >=1.2.7", "python-dotenv >=1.0.0", "pyyaml >=6.0.2", "redis >=4.5.0", From 0c89818393b238f5d25509db86b335f895a44e95 Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Tue, 28 Apr 2026 17:11:02 -0700 Subject: [PATCH 04/17] Support jsonpath-ng 1.8.0 Works around an behavior change in jsonpath-ng 1.8.0 where Child.str gets wrapped in parenthesis. --- .../services/data_services/usdm_data_service.py | 15 +++++++++++++-- pyproject.toml | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/cdisc_rules_engine/services/data_services/usdm_data_service.py b/cdisc_rules_engine/services/data_services/usdm_data_service.py index 34ebe2285..f3175bdd3 100644 --- a/cdisc_rules_engine/services/data_services/usdm_data_service.py +++ b/cdisc_rules_engine/services/data_services/usdm_data_service.py @@ -399,8 +399,19 @@ def __read_node_metadata( } @staticmethod - def __get_full_path(node: DatumInContext): - return f"{node.full_path}".replace(".[", "[") + def __get_full_path(node: DatumInContext) -> str: + parts = [] + current = node + while current is not None and current.context is not None: + parts.append(str(current.path)) + current = current.context + result = "" + for part in reversed(parts): + if part.startswith("["): + result += part + else: + result = (result + "." if result else "") + part + return result def __get_datasets_content_index(self) -> List[dict]: """ diff --git a/pyproject.toml b/pyproject.toml index d2ecefed3..bdf60450e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ dependencies = [ "fastparquet >=2024.2.0", "importlib-metadata >=8.5.0", "jsonata-python >=0.6.0", - "jsonpath-ng >=1.6.1, <1.8.0", + "jsonpath-ng >=1.6.1", "jsonschema >=4.18.5", "lxml >=5.2.1", "numpy >=1.26.0", From 70fbadbe051dd20f07368a121e3084a0e538549f Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Thu, 4 Jun 2026 16:19:11 -0700 Subject: [PATCH 05/17] Suport dask 2024.8.1 Fixes tokenization errors when using dask 2024.8.1+. Starting with this version, dask enforces that tokens remain stable across pickle round-trips (dask/dask#11320). Capturing self in a lambda fails this check because instance objects can have non-deterministic pickle representations. Since calculate_variable_value_length is already a static method, replacing self with the class name is enough to remove the capture. --- .../dataset_builders/contents_define_vlm_dataset_builder.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cdisc_rules_engine/dataset_builders/contents_define_vlm_dataset_builder.py b/cdisc_rules_engine/dataset_builders/contents_define_vlm_dataset_builder.py index fb2374b9c..328a90e48 100644 --- a/cdisc_rules_engine/dataset_builders/contents_define_vlm_dataset_builder.py +++ b/cdisc_rules_engine/dataset_builders/contents_define_vlm_dataset_builder.py @@ -66,7 +66,7 @@ def build(self): data_contents_with_vlm["variable_value_length"] = data_contents_with_vlm.data[ ["variable_value", "define_vlm_data_type"] ].apply( - lambda row: self.calculate_variable_value_length( + lambda row: ValuesDatasetBuilder.calculate_variable_value_length( row["variable_value"], row["define_vlm_data_type"] ), axis=1, diff --git a/pyproject.toml b/pyproject.toml index bdf60450e..4e5a5664d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ "cachetools >=6.1.0", "cdisc-library-client >=0.1.6", "click >=8.1.7", - "dask[dataframe,array] >=2024.6.0, <2024.8.1", + "dask[dataframe,array] >=2024.6.0, <2024.12.1", "fastparquet >=2024.2.0", "importlib-metadata >=8.5.0", "jsonata-python >=0.6.0", From 3fb77e75c74a2ea2363704125de96bf449828ea5 Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Thu, 4 Jun 2026 16:19:35 -0700 Subject: [PATCH 06/17] Support dask 2024.12.1 Fixes an import error caused by dask 2024.12.1, which removed the legacy dask.dataframe.dd submodule (dask/dask#11604). Changes the import to `import dask.dataframe as dd`, consistent with every other file in the codebase. --- cdisc_rules_engine/services/data_readers/csv_reader.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cdisc_rules_engine/services/data_readers/csv_reader.py b/cdisc_rules_engine/services/data_readers/csv_reader.py index ae8aa90d0..901e6d695 100644 --- a/cdisc_rules_engine/services/data_readers/csv_reader.py +++ b/cdisc_rules_engine/services/data_readers/csv_reader.py @@ -1,6 +1,6 @@ import tempfile -from dask.dataframe import dd +import dask.dataframe as dd from cdisc_rules_engine.exceptions.custom_exceptions import InvalidCSVFile from cdisc_rules_engine.interfaces import DataReaderInterface diff --git a/pyproject.toml b/pyproject.toml index 4e5a5664d..75d487fb6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ "cachetools >=6.1.0", "cdisc-library-client >=0.1.6", "click >=8.1.7", - "dask[dataframe,array] >=2024.6.0, <2024.12.1", + "dask[dataframe,array] >=2024.6.0, <2025.4.0", "fastparquet >=2024.2.0", "importlib-metadata >=8.5.0", "jsonata-python >=0.6.0", From c95bcfb8beac22cb2689e648f189e9b75db13a0c Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Thu, 4 Jun 2026 16:20:21 -0700 Subject: [PATCH 07/17] Support dask 2025.4.0 Dask 2025.4.0 optimizes multiple DataFrames together, which exposes division mismatches when assigning a pandas Series to a dask DataFrame column. The old reset_index/set_index workaround no longer avoids this. Replacing it with compute-assign-rewrap via dd.from_pandas, which builds a clean expression graph. This is safe because __getitem__ already computes the DataFrame to produce the Series being assigned. --- cdisc_rules_engine/models/dataset/dask_dataset.py | 6 +++--- pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cdisc_rules_engine/models/dataset/dask_dataset.py b/cdisc_rules_engine/models/dataset/dask_dataset.py index f966d1d33..2609335cd 100644 --- a/cdisc_rules_engine/models/dataset/dask_dataset.py +++ b/cdisc_rules_engine/models/dataset/dask_dataset.py @@ -81,9 +81,9 @@ def __setitem__(self, key, value): array_values = da.from_array(value, chunks=tuple(chunks)) self._data[key] = array_values elif isinstance(value, pd.Series): - self._data = self._data.reset_index() - self._data = self._data.set_index("index") - self._data[key] = value + pdf = self._data.compute() + pdf[key] = value.values + self._data = dd.from_pandas(pdf, npartitions=1) elif isinstance(value, dd.DataFrame): for column in value: self._data[column] = value[column] diff --git a/pyproject.toml b/pyproject.toml index 75d487fb6..46e20e36e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,7 +15,7 @@ dependencies = [ "cachetools >=6.1.0", "cdisc-library-client >=0.1.6", "click >=8.1.7", - "dask[dataframe,array] >=2024.6.0, <2025.4.0", + "dask[dataframe,array] >=2024.6.0", "fastparquet >=2024.2.0", "importlib-metadata >=8.5.0", "jsonata-python >=0.6.0", From 4e9f24eea40b8c450a77f3314c8e9d8b9320eb7a Mon Sep 17 00:00:00 2001 From: Filipp Shpomer Date: Thu, 4 Jun 2026 16:21:28 -0700 Subject: [PATCH 08/17] Support pandas 2.2.0 Fixes a unit test to support pandas 2.2.0+. The pandas release fixes a sorting bug with https://github.com/pandas-dev/pandas/pull/54611. This commit changes the expected results accordingly. Also fixes a merge type mismatch introduced by upstream #1709: the codelist metadata side was cast to StringDtype but the evaluation dataset side was not. With pandas 2.2.0, empty columns infer as float64, and merging float64 with string is rejected. Casting both sides to string before the merge resolves this. --- cdisc_rules_engine/operations/codelist_extensible.py | 4 ++++ cdisc_rules_engine/operations/codelist_terms.py | 4 ++++ pyproject.toml | 2 +- .../test_dataset_metadata_define_dataset_builder.py | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/cdisc_rules_engine/operations/codelist_extensible.py b/cdisc_rules_engine/operations/codelist_extensible.py index 62cd7b56f..cc3ab7042 100644 --- a/cdisc_rules_engine/operations/codelist_extensible.py +++ b/cdisc_rules_engine/operations/codelist_extensible.py @@ -32,6 +32,10 @@ def _handle_multiple_versions(self) -> pd.Series: "codelist_code": "string", } ) + cast_cols = {self.params.ct_version: "string"} + if self.params.codelist_code in self.evaluation_dataset.columns: + cast_cols[self.params.codelist_code] = "string" + self.evaluation_dataset = self.evaluation_dataset.astype(cast_cols) if self.params.codelist_code in self.evaluation_dataset.columns: is_extensible = self.evaluation_dataset.merge( ct_df.data, diff --git a/cdisc_rules_engine/operations/codelist_terms.py b/cdisc_rules_engine/operations/codelist_terms.py index 90a0a6d18..5ddcf21ef 100644 --- a/cdisc_rules_engine/operations/codelist_terms.py +++ b/cdisc_rules_engine/operations/codelist_terms.py @@ -64,6 +64,10 @@ def _handle_multiple_versions(self) -> pd.Series: "codelist_code": "string", } ) + cast_cols = {self.params.ct_version: "string"} + if self.params.codelist_code in self.evaluation_dataset.columns: + cast_cols[self.params.codelist_code] = "string" + self.evaluation_dataset = self.evaluation_dataset.astype(cast_cols) if self.params.codelist_code in self.evaluation_dataset.columns: result = self.evaluation_dataset.merge( ct_df.data, diff --git a/pyproject.toml b/pyproject.toml index 46e20e36e..7418ff68c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,7 @@ dependencies = [ "numpy >=1.26.0", "odmlib >=0.1.4", "openpyxl >=3.1.5", - "pandas >=2.1.4, <2.2.0", + "pandas >=2.1.4, <3.0.0", "psutil >=6.1.1", "pyinstaller >=6.11.0", "pympler >=1.1", diff --git a/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py b/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py index aff6c25e8..350c2e8dc 100644 --- a/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py +++ b/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py @@ -149,7 +149,7 @@ def test_dataset_metadata_define_dataset_builder(dataset_path): expected_results["dm.xpt"], expected_results["ae.xpt"], ] - ).astype(object) + ).astype(object).sort_values("dataset_location").reset_index(drop=True) result_df = result.data[expected_df.columns].reset_index(drop=True) From 6a2c209af5dbeb7e654338d8ae8d254e865371be Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Fri, 5 Jun 2026 14:12:08 -0400 Subject: [PATCH 09/17] testing --- .../models/dataset/dask_dataset.py | 4 +-- .../data_services/usdm_data_service.py | 13 +--------- docs/development.md | 7 +++--- ...dataset_metadata_define_dataset_builder.py | 25 +++++++++++++------ 4 files changed, 24 insertions(+), 25 deletions(-) diff --git a/cdisc_rules_engine/models/dataset/dask_dataset.py b/cdisc_rules_engine/models/dataset/dask_dataset.py index 2609335cd..4d719e7ce 100644 --- a/cdisc_rules_engine/models/dataset/dask_dataset.py +++ b/cdisc_rules_engine/models/dataset/dask_dataset.py @@ -82,8 +82,8 @@ def __setitem__(self, key, value): self._data[key] = array_values elif isinstance(value, pd.Series): pdf = self._data.compute() - pdf[key] = value.values - self._data = dd.from_pandas(pdf, npartitions=1) + pdf[key] = value.reindex(pdf.index) + self._data = dd.from_pandas(pdf, npartitions=self._data.npartitions) elif isinstance(value, dd.DataFrame): for column in value: self._data[column] = value[column] diff --git a/cdisc_rules_engine/services/data_services/usdm_data_service.py b/cdisc_rules_engine/services/data_services/usdm_data_service.py index f3175bdd3..e7950eed7 100644 --- a/cdisc_rules_engine/services/data_services/usdm_data_service.py +++ b/cdisc_rules_engine/services/data_services/usdm_data_service.py @@ -400,18 +400,7 @@ def __read_node_metadata( @staticmethod def __get_full_path(node: DatumInContext) -> str: - parts = [] - current = node - while current is not None and current.context is not None: - parts.append(str(current.path)) - current = current.context - result = "" - for part in reversed(parts): - if part.startswith("["): - result += part - else: - result = (result + "." if result else "") + part - return result + return str(node.full_path).replace(".[", "[") def __get_datasets_content_index(self) -> List[dict]: """ diff --git a/docs/development.md b/docs/development.md index f39f2cccc..85ba30521 100644 --- a/docs/development.md +++ b/docs/development.md @@ -42,12 +42,13 @@ python -m venv venv # Activate (Linux/Mac) source venv/bin/activate +# Install dependencies (Linux/Mac) +pip install -e . && pip install --group dev # Activate (Windows) .\venv\Scripts\Activate - -# Install dependencies -pip install -e . && pip install --group dev +# Install dependencies () +pip install -e .; pip install --group dev ``` --- diff --git a/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py b/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py index 350c2e8dc..1f35852bd 100644 --- a/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py +++ b/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py @@ -143,15 +143,24 @@ def test_dataset_metadata_define_dataset_builder(dataset_path): result = builder.build() - expected_df = pd.DataFrame( - [ - expected_results["ts.xpt"], - expected_results["dm.xpt"], - expected_results["ae.xpt"], - ] - ).astype(object).sort_values("dataset_location").reset_index(drop=True) + expected_df = ( + pd.DataFrame( + [ + expected_results["ts.xpt"], + expected_results["dm.xpt"], + expected_results["ae.xpt"], + ] + ) + .astype(object) + .sort_values("dataset_location") + .reset_index(drop=True) + ) - result_df = result.data[expected_df.columns].reset_index(drop=True) + result_df = ( + result.data[expected_df.columns] + .sort_values("dataset_location") + .reset_index(drop=True) + ) # Check that columns are the same assert list(result_df.columns) == list(expected_df.columns), "Columns do not match" From 0b6f2bb2c32d529266ab3875e60f49ea31680adc Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Fri, 5 Jun 2026 14:37:25 -0400 Subject: [PATCH 10/17] restore --- cdisc_rules_engine/models/dataset/dask_dataset.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cdisc_rules_engine/models/dataset/dask_dataset.py b/cdisc_rules_engine/models/dataset/dask_dataset.py index 4d719e7ce..f966d1d33 100644 --- a/cdisc_rules_engine/models/dataset/dask_dataset.py +++ b/cdisc_rules_engine/models/dataset/dask_dataset.py @@ -81,9 +81,9 @@ def __setitem__(self, key, value): array_values = da.from_array(value, chunks=tuple(chunks)) self._data[key] = array_values elif isinstance(value, pd.Series): - pdf = self._data.compute() - pdf[key] = value.reindex(pdf.index) - self._data = dd.from_pandas(pdf, npartitions=self._data.npartitions) + self._data = self._data.reset_index() + self._data = self._data.set_index("index") + self._data[key] = value elif isinstance(value, dd.DataFrame): for column in value: self._data[column] = value[column] From a0565f2ad4f9b00469ab12e7349c8556e0437fb6 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Fri, 5 Jun 2026 14:47:17 -0400 Subject: [PATCH 11/17] parentheses strip --- cdisc_rules_engine/services/data_services/usdm_data_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cdisc_rules_engine/services/data_services/usdm_data_service.py b/cdisc_rules_engine/services/data_services/usdm_data_service.py index e7950eed7..5532737a1 100644 --- a/cdisc_rules_engine/services/data_services/usdm_data_service.py +++ b/cdisc_rules_engine/services/data_services/usdm_data_service.py @@ -400,7 +400,7 @@ def __read_node_metadata( @staticmethod def __get_full_path(node: DatumInContext) -> str: - return str(node.full_path).replace(".[", "[") + return str(node.full_path).replace(".[", "[").replace("(", "").replace(")", "") def __get_datasets_content_index(self) -> List[dict]: """ From 8c1dfb377cdaae183cee210e56257d04ed0d80a3 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Fri, 5 Jun 2026 15:02:23 -0400 Subject: [PATCH 12/17] stringg to str --- cdisc_rules_engine/operations/codelist_extensible.py | 4 ++-- cdisc_rules_engine/operations/codelist_terms.py | 4 ++-- .../services/data_services/usdm_data_service.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cdisc_rules_engine/operations/codelist_extensible.py b/cdisc_rules_engine/operations/codelist_extensible.py index cc3ab7042..f5e24cf41 100644 --- a/cdisc_rules_engine/operations/codelist_extensible.py +++ b/cdisc_rules_engine/operations/codelist_extensible.py @@ -32,9 +32,9 @@ def _handle_multiple_versions(self) -> pd.Series: "codelist_code": "string", } ) - cast_cols = {self.params.ct_version: "string"} + cast_cols = {self.params.ct_version: str} if self.params.codelist_code in self.evaluation_dataset.columns: - cast_cols[self.params.codelist_code] = "string" + cast_cols[self.params.codelist_code] = str self.evaluation_dataset = self.evaluation_dataset.astype(cast_cols) if self.params.codelist_code in self.evaluation_dataset.columns: is_extensible = self.evaluation_dataset.merge( diff --git a/cdisc_rules_engine/operations/codelist_terms.py b/cdisc_rules_engine/operations/codelist_terms.py index 5ddcf21ef..e2fbba0b6 100644 --- a/cdisc_rules_engine/operations/codelist_terms.py +++ b/cdisc_rules_engine/operations/codelist_terms.py @@ -60,8 +60,8 @@ def _handle_multiple_versions(self) -> pd.Series: ct_df = self.evaluation_dataset.__class__.from_dict(ct_data) ct_df = ct_df.astype( { - "version": "string", - "codelist_code": "string", + "version": str, + "codelist_code": str, } ) cast_cols = {self.params.ct_version: "string"} diff --git a/cdisc_rules_engine/services/data_services/usdm_data_service.py b/cdisc_rules_engine/services/data_services/usdm_data_service.py index 5532737a1..e7950eed7 100644 --- a/cdisc_rules_engine/services/data_services/usdm_data_service.py +++ b/cdisc_rules_engine/services/data_services/usdm_data_service.py @@ -400,7 +400,7 @@ def __read_node_metadata( @staticmethod def __get_full_path(node: DatumInContext) -> str: - return str(node.full_path).replace(".[", "[").replace("(", "").replace(")", "") + return str(node.full_path).replace(".[", "[") def __get_datasets_content_index(self) -> List[dict]: """ From d9e4405c9662275b07f50917355c229b7b6faa5e Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Fri, 5 Jun 2026 15:25:35 -0400 Subject: [PATCH 13/17] black formatting for 26.5.1 --- .../test_dataset_metadata_define_dataset_builder.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py b/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py index 1f35852bd..dad459b54 100644 --- a/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py +++ b/tests/unit/test_dataset_builders/test_dataset_metadata_define_dataset_builder.py @@ -11,7 +11,6 @@ ) from cdisc_rules_engine.models.dataset.pandas_dataset import PandasDataset - define_metadata = [ { "define_dataset_name": "TS", From 93a8cd0b56a4dd309fac735b3e0b65f8cc73ad06 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Mon, 8 Jun 2026 16:18:13 -0400 Subject: [PATCH 14/17] pylock --- .github/workflows/build-binary.yml | 6 +- .github/workflows/build-version.yml | 18 +- .github/workflows/prerelease-update-cache.yml | 5 +- .github/workflows/release.yml | 5 +- .github/workflows/test-release.yml | 5 +- .github/workflows/test-suite.yml | 4 +- .github/workflows/test-unit.yml | 5 +- .../workflows/validate-published-rules.yml | 5 +- docs/development.md | 16 +- docs/quick-start.md | 8 +- pylock.dev.toml | 518 ++++++++++++++++++ pylock.toml | 371 +++++++++++++ 12 files changed, 941 insertions(+), 25 deletions(-) create mode 100644 pylock.dev.toml create mode 100644 pylock.toml diff --git a/.github/workflows/build-binary.yml b/.github/workflows/build-binary.yml index 8a257da1d..e811c12ad 100644 --- a/.github/workflows/build-binary.yml +++ b/.github/workflows/build-binary.yml @@ -21,9 +21,9 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine - pip install --no-deps -r requirements.txt - pip install -r requirements.txt --no-cache-dir + pip install uv + uv pip sync pylock.toml + pip install -e . - name: Build Binary (Linux) if: runner.os == 'Linux' diff --git a/.github/workflows/build-version.yml b/.github/workflows/build-version.yml index f23872f85..370553c5f 100644 --- a/.github/workflows/build-version.yml +++ b/.github/workflows/build-version.yml @@ -19,9 +19,9 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install setuptools wheel twine - pip install --no-deps -r requirements.txt - pip install -r requirements.txt --no-cache-dir + pip install uv + uv pip sync pylock.toml + pip install -e . - name: Update CDISC standards cache env: CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} @@ -73,9 +73,9 @@ jobs: # - name: Install dependencies # run: | # python -m pip install --upgrade pip -# pip install setuptools wheel twine -# pip install --no-deps -r requirements.txt -# pip install -r requirements.txt --no-cache-dir +# pip install uv +# uv pip sync pylock.toml +# pip install -e . # - name: Update CDISC standards cache # env: # CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} @@ -117,9 +117,9 @@ jobs: # - name: Install dependencies # run: | # python -m pip install --upgrade pip -# pip install setuptools wheel twine -# pip install --no-deps -r requirements.txt -# pip install -r requirements.txt --no-cache-dir +# pip install uv +# uv pip sync pylock.toml +# pip install -e . # - name: Update CDISC standards cache # env: # CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} diff --git a/.github/workflows/prerelease-update-cache.yml b/.github/workflows/prerelease-update-cache.yml index ba225f5d1..d10256fd4 100644 --- a/.github/workflows/prerelease-update-cache.yml +++ b/.github/workflows/prerelease-update-cache.yml @@ -23,7 +23,10 @@ jobs: python-version: "3.12" - name: Install requirements - run: pip install -r requirements.txt + run: | + pip install uv + uv pip sync pylock.toml + pip install -e . - name: Run Update Cache Script run: python core.py update-cache diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f3b8258e2..d0e0e38ea 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -102,8 +102,9 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install build setuptools wheel twine - pip install -r requirements.txt + pip install uv build twine + uv pip sync pylock.toml + pip install -e . - name: Build package run: | python -m build diff --git a/.github/workflows/test-release.yml b/.github/workflows/test-release.yml index bd3a60802..41628c7e4 100644 --- a/.github/workflows/test-release.yml +++ b/.github/workflows/test-release.yml @@ -81,8 +81,9 @@ jobs: - name: Install dependencies run: | python -m pip install --upgrade pip - pip install build setuptools wheel twine - pip install -r requirements.txt + pip install uv build twine + uv pip sync pylock.toml + pip install -e . - name: Build package run: | diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index 0e33d67bd..813681909 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -28,7 +28,9 @@ jobs: python-version: "3.12" - name: Install dependencies run: | - pip install -r requirements.txt + pip install uv + uv pip sync pylock.toml + pip install -e . - name: Update rules cache env: CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index d11d78b30..41f139346 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -16,8 +16,9 @@ jobs: python-version: "3.12" - name: Install requirements run: | - pip install -r requirements.txt - pip install --group dev -e . + pip install uv + uv pip sync pylock.toml pylock.dev.toml + pip install -e . - name: Running Tests env: CDISC_LIBRARY_API_KEY: fakekey12341234 diff --git a/.github/workflows/validate-published-rules.yml b/.github/workflows/validate-published-rules.yml index 1c68f210c..383effe9a 100644 --- a/.github/workflows/validate-published-rules.yml +++ b/.github/workflows/validate-published-rules.yml @@ -81,8 +81,9 @@ jobs: run: | python -m venv venv ./venv/bin/pip install --upgrade pip - ./venv/bin/pip install -r engine/requirements.txt - + ./venv/bin/pip install uv + ./venv/bin/uv pip sync engine/pylock.toml + ./venv/bin/pip install -e engine/. # ----------------------------------------------------------------------- # 5. Run validation for every Published rule # ----------------------------------------------------------------------- diff --git a/docs/development.md b/docs/development.md index 85ba30521..eb859f186 100644 --- a/docs/development.md +++ b/docs/development.md @@ -47,10 +47,22 @@ pip install -e . && pip install --group dev # Activate (Windows) .\venv\Scripts\Activate -# Install dependencies () -pip install -e .; pip install --group dev + +# Install uv (if not already installed) +pip install uv + +# Install pinned dependencies from the primary & dev lockfiles +uv pip sync pylock.toml pylock.dev.toml + +# Install the package itself in editable mode +pip install -e . ``` +> **Note:** `pylock.toml` and `pylock.dev.toml` are standard lockfiles (PEP 751) and can be used +> with any compatible tool. If you prefer not to use uv, you can install core dependencies via +> standard pip (`pip install .`), though dev dependencies will need to be installed separately +> and exact version pinning is only guaranteed when using a tool that supports `pylock.toml`. + --- ## Running Tests diff --git a/docs/quick-start.md b/docs/quick-start.md index 0b810ae20..0fcd6cc50 100644 --- a/docs/quick-start.md +++ b/docs/quick-start.md @@ -125,9 +125,15 @@ python -m venv venv ### 3. Install Dependencies ```bash -python -m pip install -r requirements-dev.txt +pip install uv +uv pip sync pylock.toml ``` +> **Note:** `pylock.toml` is a standard format (PEP 751) and can be used with any compatible tool. +> If you prefer not to use uv, you can install directly from `pyproject.toml` using standard pip +> (`pip install .`) or any other PEP 517-compatible tool such as pip-tools or Poetry. Note that +> exact version pinning is only guaranteed when using a tool that supports `pylock.toml`. + ### 4. Populate the Cache ```bash diff --git a/pylock.dev.toml b/pylock.dev.toml new file mode 100644 index 000000000..7cbaea02c --- /dev/null +++ b/pylock.dev.toml @@ -0,0 +1,518 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --group dev -o pylock.dev.toml +lock-version = "1.0" +created-by = "uv" +requires-python = ">=3.12.10" + +[[packages]] +name = "altgraph" +version = "0.17.5" +sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", upload-time = 2025-11-21T20:35:50Z, size = 48428, hashes = { sha256 = "c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", upload-time = 2025-11-21T20:35:49Z, size = 21228, hashes = { sha256 = "f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597" } }] + +[[packages]] +name = "attrs" +version = "26.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", upload-time = 2026-03-19T14:22:25Z, size = 952055, hashes = { sha256 = "d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", upload-time = 2026-03-19T14:22:23Z, size = 67548, hashes = { sha256 = "c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309" } }] + +[[packages]] +name = "black" +version = "26.5.1" +sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", upload-time = 2026-05-18T16:53:36Z, size = 679439, hashes = { sha256 = "dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", upload-time = 2026-05-18T17:05:25Z, size = 1486825, hashes = { sha256 = "a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264" } }, + { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", upload-time = 2026-05-18T16:53:33Z, size = 213693, hashes = { sha256 = "4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2" } }, +] + +[[packages]] +name = "business-rules-enhanced" +version = "1.4.8" +sdist = { url = "https://files.pythonhosted.org/packages/ad/d8/c77f91155c19822ca31f7bd273234485c46263631721a6dae9717543514a/business_rules_enhanced-1.4.8.tar.gz", upload-time = 2025-07-17T20:33:49Z, size = 14119, hashes = { sha256 = "9a5d37ad34efea59f725f33e6c4a983d5f90a7d845864223ce4a50b7c8c36254" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/6d/ac/faa00bef5f6f2e4c0b9e6a0cb821e30f3b1854184070313975ee38ed6999/business_rules_enhanced-1.4.8-py3-none-any.whl", upload-time = 2025-07-17T20:33:48Z, size = 12547, hashes = { sha256 = "b02c8cf919b40dcb6b8da22d5f4f499da635a96546ae01dac55d663325aa90f8" } }] + +[[packages]] +name = "cachetools" +version = "7.1.4" +sdist = { url = "https://files.pythonhosted.org/packages/f4/8b/0d3945a13955303b81272f759a0331e54c5c793da455e6f5706b89d2639c/cachetools-7.1.4.tar.gz", upload-time = 2026-05-21T22:40:43Z, size = 40085, hashes = { sha256 = "437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", upload-time = 2026-05-21T22:40:41Z, size = 16761, hashes = { sha256 = "323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54" } }] + +[[packages]] +name = "cdisc-library-client" +version = "0.1.6" +sdist = { url = "https://files.pythonhosted.org/packages/0c/17/d426b962cbe1d955922db868fea873b03109b46f80585e06660dd6a07d05/cdisc_library_client-0.1.6.tar.gz", upload-time = 2024-12-09T19:57:05Z, size = 4133, hashes = { sha256 = "d3e112d68f406a3d02d9e53c2981fd7cbceec4976ec41d0c5634c24ddf2558d4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1f/d3/1e1dfccb4c3fcf4ccbfcd566b9b71c060fba4ba06d33ea9742aa1e2440fb/cdisc_library_client-0.1.6-py3-none-any.whl", upload-time = 2024-12-09T19:57:04Z, size = 4847, hashes = { sha256 = "701fd27c29b3255ccadf3db717b2e68ec2d8edc9992782b7eeb130fe09175e09" } }] + +[[packages]] +name = "cerberus" +version = "1.3.8" +sdist = { url = "https://files.pythonhosted.org/packages/7a/cf/845d32e330e49e34f1a22dc44868750e75485d7c08c07d37795bcf0a780e/cerberus-1.3.8.tar.gz", upload-time = 2025-11-06T18:29:40Z, size = 29660, hashes = { sha256 = "579554887ffd189226774b87570f4a76db75cf0efcbaffcacd5e98b8ee877f61" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a1/00/ff53f3a4d51e64e9137ce2408a43edf18fec96eebb61f87a6598578fa563/cerberus-1.3.8-py3-none-any.whl", upload-time = 2025-11-06T18:29:38Z, size = 30567, hashes = { sha256 = "46c029e3e2a4735408ed36bec14ef2cbf3e50d8ebe47fb34ee1e54b2da814df2" } }] + +[[packages]] +name = "certifi" +version = "2026.5.20" +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", upload-time = 2026-05-20T11:46:50Z, size = 135422, hashes = { sha256 = "69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", upload-time = 2026-05-20T11:46:48Z, size = 134134, hashes = { sha256 = "3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897" } }] + +[[packages]] +name = "cfgv" +version = "3.5.0" +sdist = { url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz", upload-time = 2025-11-19T20:55:51Z, size = 7334, hashes = { sha256 = "d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl", upload-time = 2025-11-19T20:55:50Z, size = 7445, hashes = { sha256 = "a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0" } }] + +[[packages]] +name = "charset-normalizer" +version = "3.4.7" +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", upload-time = 2026-04-02T09:28:39Z, size = 144271, hashes = { sha256 = "ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", upload-time = 2026-04-02T09:26:42Z, size = 159330, hashes = { sha256 = "5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6" } }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", upload-time = 2026-04-02T09:28:37Z, size = 61958, hashes = { sha256 = "3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d" } }, +] + +[[packages]] +name = "click" +version = "8.4.1" +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", upload-time = 2026-05-22T04:08:37Z, size = 353007, hashes = { sha256 = "918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", upload-time = 2026-05-22T04:08:35Z, size = 116639, hashes = { sha256 = "482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2" } }] + +[[packages]] +name = "cloudpickle" +version = "3.1.2" +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", upload-time = 2025-11-03T09:25:26Z, size = 22330, hashes = { sha256 = "7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", upload-time = 2025-11-03T09:25:25Z, size = 22228, hashes = { sha256 = "9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a" } }] + +[[packages]] +name = "colorama" +version = "0.4.6" +marker = "sys_platform == 'win32'" +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", upload-time = 2022-10-25T02:36:22Z, size = 27697, hashes = { sha256 = "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", upload-time = 2022-10-25T02:36:20Z, size = 25335, hashes = { sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" } }] + +[[packages]] +name = "coverage" +version = "7.14.1" +sdist = { url = "https://files.pythonhosted.org/packages/54/fd/0ab2772530e946e1be1abd0bc09e647ec9b02e88f0867857601fefca8953/coverage-7.14.1.tar.gz", upload-time = 2026-05-26T20:41:36Z, size = 920132, hashes = { sha256 = "30c08f7d90415aa98b3c990385dea2939b0da55f38515e5b369b83655f8523be" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/81/8b7cd386839b039ebe1855733b9f9449a8dec5d79564018234f185a7fa70/coverage-7.14.1-cp312-cp312-win_amd64.whl", upload-time = 2026-05-26T20:39:26Z, size = 223372, hashes = { sha256 = "54acdb6674a4661768d7bf7db32dfb9f46ab1d764f8aba6df75ce1a6a088724e" } }, + { url = "https://files.pythonhosted.org/packages/8a/3c/1a983b9a745d7f83d53f057bcc5bf79ba6a2bbc08266b3f0c7d6fe630c9b/coverage-7.14.1-py3-none-any.whl", upload-time = 2026-05-26T20:41:34Z, size = 211815, hashes = { sha256 = "a252f21c27e38347e60111a3266b03827422a7d5525951aceee313aa68bab1d2" } }, +] + +[[packages]] +name = "cramjam" +version = "2.11.0" +sdist = { url = "https://files.pythonhosted.org/packages/14/12/34bf6e840a79130dfd0da7badfb6f7810b8fcfd60e75b0539372667b41b6/cramjam-2.11.0.tar.gz", upload-time = 2025-07-27T21:25:07Z, size = 99100, hashes = { sha256 = "5c82500ed91605c2d9781380b378397012e25127e89d64f460fea6aeac4389b4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/75/b1/d53002729cfd94c5844ddfaf1233c86d29f2dbfc1b764a6562c41c044199/cramjam-2.11.0-cp312-cp312-win_amd64.whl", upload-time = 2025-07-27T21:22:51Z, size = 1709287, hashes = { sha256 = "53fed080476d5f6ad7505883ec5d1ec28ba36c2273db3b3e92d7224fe5e463db" } }] + +[[packages]] +name = "dask" +version = "2026.3.0" +sdist = { url = "https://files.pythonhosted.org/packages/d7/2a/5d8cc1579590af86576dde890254440e478c7174b93a02095ecfc2e6ba38/dask-2026.3.0.tar.gz", upload-time = 2026-03-18T07:10:14Z, size = 11000710, hashes = { sha256 = "f7d96c8274e8a900d217c1ff6ea8d1bbf0b4c2c21e74a409644498d925eb8f85" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl", upload-time = 2026-03-18T07:10:12Z, size = 1485630, hashes = { sha256 = "be614b9242b0b38288060fb2d7696125946469c98a1c30e174883fd199e0428d" } }] + +[[packages]] +name = "distlib" +version = "0.4.2" +sdist = { url = "https://files.pythonhosted.org/packages/46/8d/873e9252ea2c0e0c857884e0a2899ec43ade132345df1925ef24cbe64f18/distlib-0.4.2.tar.gz", upload-time = 2026-06-08T16:24:15Z, size = 614914, hashes = { sha256 = "baeb401c90f27acd15c4861ae0847d1e731c27ac3dbf4210643ba61fa1e813db" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c1/60/aa891c893821d4d127292ed66c6940d1d715894bd5a0ce048056bc641773/distlib-0.4.2-py2.py3-none-any.whl", upload-time = 2026-06-08T16:24:13Z, size = 470510, hashes = { sha256 = "ca4cb11e5d746b5ec13c199cbf19ae27a241f89702b54e153a74332955446067" } }] + +[[packages]] +name = "elementpath" +version = "5.1.1" +sdist = { url = "https://files.pythonhosted.org/packages/94/95/eeb61a2a917bf506d1402748e71c62399d8dcdd8cdccd64c81962832c260/elementpath-5.1.1.tar.gz", upload-time = 2026-01-20T21:42:27Z, size = 375378, hashes = { sha256 = "c4d1bd6aed987258354d0ea004d965eb0a6818213326bd4fd9bde5dacdb20277" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/14/5a/4ddfd9aeecdc75a78b5d85d882abc2b822115caae2c00a4d0eb23cc101fc/elementpath-5.1.1-py3-none-any.whl", upload-time = 2026-01-20T21:42:24Z, size = 259962, hashes = { sha256 = "57637359065e60654422d8474c1749b09bb21348012b7197f868027e3c09c9b9" } }] + +[[packages]] +name = "et-xmlfile" +version = "2.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", upload-time = 2024-10-25T17:25:40Z, size = 17234, hashes = { sha256 = "dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", upload-time = 2024-10-25T17:25:39Z, size = 18059, hashes = { sha256 = "7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa" } }] + +[[packages]] +name = "fastparquet" +version = "2026.5.0" +sdist = { url = "https://files.pythonhosted.org/packages/1e/82/2de205357ce01bd86b9955910b7bf2bbcc29f7aa5cfbc1f0fadc299fc2b3/fastparquet-2026.5.0.tar.gz", upload-time = 2026-05-15T13:16:46Z, size = 498405, hashes = { sha256 = "12a813d1c91b9d316a8d43860074daf4566849f776f9cd549742aa71d907e4f6" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/08/fe/ba47bfa67868c42f3203e6738b90b80e25f3ecdf1f85e253b27ef2135cf2/fastparquet-2026.5.0-cp312-cp312-win_amd64.whl", upload-time = 2026-05-15T13:19:39Z, size = 695697, hashes = { sha256 = "76f5e7df0fbeb50c694023bf0d77afeb0a33982d30e827d473abd7caf5462a9d" } }] + +[[packages]] +name = "filelock" +version = "3.29.1" +sdist = { url = "https://files.pythonhosted.org/packages/1f/f9/f38573ed5844586db374d085911740a501ccfa373b455fc9413f09f85237/filelock-3.29.1.tar.gz", upload-time = 2026-06-03T15:19:04Z, size = 59335, hashes = { sha256 = "d97e6b1b9757569626c58caa07dc4beb1613f4a2938b1e8cc81afca398906c9e" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/4c/a0/614c5fe402fd88951df45f4dda2fa3b4e17a99ecd92340771929169b3b95/filelock-3.29.1-py3-none-any.whl", upload-time = 2026-06-03T15:19:02Z, size = 40750, hashes = { sha256 = "85199dfd706869641b72b2e8955d5416a4b2b7dc4b0e8e6d97b4cc1299a6983b" } }] + +[[packages]] +name = "flake8" +version = "7.3.0" +sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", upload-time = 2025-06-20T19:31:35Z, size = 48326, hashes = { sha256 = "fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", upload-time = 2025-06-20T19:31:34Z, size = 57922, hashes = { sha256 = "b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e" } }] + +[[packages]] +name = "fsspec" +version = "2026.4.0" +sdist = { url = "https://files.pythonhosted.org/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", upload-time = 2026-04-29T20:42:38Z, size = 312760, hashes = { sha256 = "301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", upload-time = 2026-04-29T20:42:36Z, size = 203402, hashes = { sha256 = "11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2" } }] + +[[packages]] +name = "identify" +version = "2.6.19" +sdist = { url = "https://files.pythonhosted.org/packages/52/63/51723b5f116cc04b061cb6f5a561790abf249d25931d515cd375e063e0f4/identify-2.6.19.tar.gz", upload-time = 2026-04-17T18:39:50Z, size = 99567, hashes = { sha256 = "6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/94/84/d9273cd09688070a6523c4aee4663a8538721b2b755c4962aafae0011e72/identify-2.6.19-py2.py3-none-any.whl", upload-time = 2026-04-17T18:39:49Z, size = 99397, hashes = { sha256 = "20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a" } }] + +[[packages]] +name = "idna" +version = "3.18" +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", upload-time = 2026-06-02T14:34:07Z, size = 196711, hashes = { sha256 = "ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", upload-time = 2026-06-02T14:34:06Z, size = 65455, hashes = { sha256 = "7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2" } }] + +[[packages]] +name = "importlib-metadata" +version = "9.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", upload-time = 2026-03-20T06:42:56Z, size = 56405, hashes = { sha256 = "a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", upload-time = 2026-03-20T06:42:55Z, size = 27789, hashes = { sha256 = "2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7" } }] + +[[packages]] +name = "iniconfig" +version = "2.3.0" +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", upload-time = 2025-10-18T21:55:43Z, size = 20503, hashes = { sha256 = "c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", upload-time = 2025-10-18T21:55:41Z, size = 7484, hashes = { sha256 = "f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12" } }] + +[[packages]] +name = "jsonata-python" +version = "0.6.2" +sdist = { url = "https://files.pythonhosted.org/packages/f4/cc/16f20b1e9466a9904601df339a6b2b31d82eeba6ae97610076ffc9fec9a2/jsonata_python-0.6.2.tar.gz", upload-time = 2026-03-21T07:02:20Z, size = 363452, hashes = { sha256 = "6d553563f0d2cbfd64842d6b35fcec18615acbcf0859061be04bacce3a83b418" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/b6/fb/8ba2f1354718839087cb83b138d710026a05a05e3780c9afa8e43d0a9b86/jsonata_python-0.6.2-py3-none-any.whl", upload-time = 2026-03-21T07:02:19Z, size = 83798, hashes = { sha256 = "86c61632f23587d945cf1693fe966f023593c7ebfe2615814db8756c67e7c776" } }] + +[[packages]] +name = "jsonpath-ng" +version = "1.8.0" +sdist = { url = "https://files.pythonhosted.org/packages/32/58/250751940d75c8019659e15482d548a4aa3b6ce122c515102a4bfdac50e3/jsonpath_ng-1.8.0.tar.gz", upload-time = 2026-02-24T14:42:06Z, size = 74513, hashes = { sha256 = "54252968134b5e549ea5b872f1df1168bd7defe1a52fed5a358c194e1943ddc3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/03/99/33c7d78a3fb70d545fd5411ac67a651c81602cc09c9cf0df383733f068c5/jsonpath_ng-1.8.0-py3-none-any.whl", upload-time = 2026-02-28T00:53:19Z, size = 67844, hashes = { sha256 = "b8dde192f8af58d646fc031fac9c99fe4d00326afc4148f1f043c601a8cfe138" } }] + +[[packages]] +name = "jsonschema" +version = "4.26.0" +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", upload-time = 2026-01-07T13:41:07Z, size = 366583, hashes = { sha256 = "0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", upload-time = 2026-01-07T13:41:05Z, size = 90630, hashes = { sha256 = "d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce" } }] + +[[packages]] +name = "jsonschema-specifications" +version = "2025.9.1" +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", upload-time = 2025-09-08T01:34:59Z, size = 32855, hashes = { sha256 = "b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", upload-time = 2025-09-08T01:34:57Z, size = 18437, hashes = { sha256 = "98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe" } }] + +[[packages]] +name = "locket" +version = "1.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", upload-time = 2022-04-20T22:04:44Z, size = 4350, hashes = { sha256 = "5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", upload-time = 2022-04-20T22:04:42Z, size = 4398, hashes = { sha256 = "b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" } }] + +[[packages]] +name = "lxml" +version = "6.1.1" +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", upload-time = 2026-05-18T19:19:06Z, size = 4197430, hashes = { sha256 = "ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", upload-time = 2026-05-18T19:17:56Z, size = 3997255, hashes = { sha256 = "26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77" } }] + +[[packages]] +name = "mccabe" +version = "0.7.0" +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", upload-time = 2022-01-24T01:14:51Z, size = 9658, hashes = { sha256 = "348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", upload-time = 2022-01-24T01:14:49Z, size = 7350, hashes = { sha256 = "6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" } }] + +[[packages]] +name = "mypy-extensions" +version = "1.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", upload-time = 2025-04-22T14:54:24Z, size = 6343, hashes = { sha256 = "52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", upload-time = 2025-04-22T14:54:22Z, size = 4963, hashes = { sha256 = "1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505" } }] + +[[packages]] +name = "narwhals" +version = "2.22.1" +sdist = { url = "https://files.pythonhosted.org/packages/62/3c/c4ef2164a71c1a63d7f1ae411c4082c5fa872405106db60a4b7114989ad7/narwhals-2.22.1.tar.gz", upload-time = 2026-06-05T12:34:34Z, size = 647493, hashes = { sha256 = "d62920805a0a43b7ff8b54b0c0d3142d796f8a9301836ada37e573d6a33cbcd9" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl", upload-time = 2026-06-05T12:34:32Z, size = 454815, hashes = { sha256 = "60567d774edf77db53906f89d9fbd164e66e56d66d388e1e6990f17ac33cfb53" } }] + +[[packages]] +name = "nodeenv" +version = "1.10.0" +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", upload-time = 2025-12-20T14:08:54Z, size = 55611, hashes = { sha256 = "996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", upload-time = 2025-12-20T14:08:52Z, size = 23438, hashes = { sha256 = "5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827" } }] + +[[packages]] +name = "numpy" +version = "2.4.6" +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", upload-time = 2026-05-18T23:37:14Z, size = 20735807, hashes = { sha256 = "f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", upload-time = 2026-05-18T23:34:23Z, size = 12321687, hashes = { sha256 = "d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751" } }] + +[[packages]] +name = "odmlib" +version = "0.1.4" +sdist = { url = "https://files.pythonhosted.org/packages/25/7b/60a82f027eaf462e3da3b7daa31f903cee93aaf1a0e26c4a747d5303fe6f/odmlib-0.1.4.tar.gz", upload-time = 2022-03-20T17:21:22Z, size = 257481, hashes = { sha256 = "3b4c31ccf4b68a2c5f1cbe0265a44fe40556f9b3e650efe5846662ae31b96a51" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/f0/ce/15da461c1b996144b459882a6affd097a21737b19077a3a5f064b40bd4e1/odmlib-0.1.4-py3-none-any.whl", upload-time = 2022-03-20T17:21:20Z, size = 311107, hashes = { sha256 = "712e9204013a80923607f453ec5266fd05a0b7cae2a3b96ba35d2e1bcb57624d" } }] + +[[packages]] +name = "openpyxl" +version = "3.1.5" +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", upload-time = 2024-06-28T14:03:44Z, size = 186464, hashes = { sha256 = "cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", upload-time = 2024-06-28T14:03:41Z, size = 250910, hashes = { sha256 = "5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2" } }] + +[[packages]] +name = "packaging" +version = "26.2" +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", upload-time = 2026-04-24T20:15:23Z, size = 228134, hashes = { sha256 = "ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", upload-time = 2026-04-24T20:15:22Z, size = 100195, hashes = { sha256 = "5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e" } }] + +[[packages]] +name = "pandas" +version = "2.3.3" +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", upload-time = 2025-09-29T23:34:51Z, size = 4495223, hashes = { sha256 = "e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", upload-time = 2025-09-29T23:20:54Z, size = 10992722, hashes = { sha256 = "a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b" } }] + +[[packages]] +name = "partd" +version = "1.4.2" +sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", upload-time = 2024-05-06T19:51:41Z, size = 21029, hashes = { sha256 = "d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", upload-time = 2024-05-06T19:51:39Z, size = 18905, hashes = { sha256 = "978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f" } }] + +[[packages]] +name = "pathspec" +version = "1.1.1" +sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", upload-time = 2026-04-27T01:46:08Z, size = 135180, hashes = { sha256 = "17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", upload-time = 2026-04-27T01:46:07Z, size = 57328, hashes = { sha256 = "a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189" } }] + +[[packages]] +name = "pathvalidate" +version = "3.3.1" +sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", upload-time = 2025-06-15T09:07:20Z, size = 63262, hashes = { sha256 = "b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", upload-time = 2025-06-15T09:07:19Z, size = 24305, hashes = { sha256 = "5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f" } }] + +[[packages]] +name = "pefile" +version = "2024.8.26" +marker = "sys_platform == 'win32'" +sdist = { url = "https://files.pythonhosted.org/packages/03/4f/2750f7f6f025a1507cd3b7218691671eecfd0bbebebe8b39aa0fe1d360b8/pefile-2024.8.26.tar.gz", upload-time = 2024-08-26T20:58:38Z, size = 76008, hashes = { sha256 = "3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/54/16/12b82f791c7f50ddec566873d5bdd245baa1491bac11d15ffb98aecc8f8b/pefile-2024.8.26-py3-none-any.whl", upload-time = 2024-08-26T21:01:02Z, size = 74766, hashes = { sha256 = "76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f" } }] + +[[packages]] +name = "platformdirs" +version = "4.10.0" +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", upload-time = 2026-05-28T03:32:53Z, size = 31224, hashes = { sha256 = "31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", upload-time = 2026-05-28T03:32:52Z, size = 22743, hashes = { sha256 = "fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a" } }] + +[[packages]] +name = "pluggy" +version = "1.6.0" +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", upload-time = 2025-05-15T12:30:07Z, size = 69412, hashes = { sha256 = "7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", upload-time = 2025-05-15T12:30:06Z, size = 20538, hashes = { sha256 = "e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" } }] + +[[packages]] +name = "pre-commit" +version = "4.6.0" +sdist = { url = "https://files.pythonhosted.org/packages/8e/22/2de9408ac81acbb8a7d05d4cc064a152ccf33b3d480ebe0cd292153db239/pre_commit-4.6.0.tar.gz", upload-time = 2026-04-21T20:31:41Z, size = 198525, hashes = { sha256 = "718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/80/6e/4b28b62ecb6aae56769c34a8ff1d661473ec1e9519e2d5f8b2c150086b26/pre_commit-4.6.0-py2.py3-none-any.whl", upload-time = 2026-04-21T20:31:40Z, size = 226472, hashes = { sha256 = "e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b" } }] + +[[packages]] +name = "psutil" +version = "7.2.2" +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", upload-time = 2026-01-28T18:14:54Z, size = 493740, hashes = { sha256 = "0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", upload-time = 2026-01-28T18:15:33Z, size = 137737, hashes = { sha256 = "eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988" } }] + +[[packages]] +name = "pyarrow" +version = "24.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", upload-time = 2026-04-21T10:51:25Z, size = 1180261, hashes = { sha256 = "85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", upload-time = 2026-04-21T10:48:01Z, size = 27355660, hashes = { sha256 = "295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826" } }] + +[[packages]] +name = "pycodestyle" +version = "2.14.0" +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", upload-time = 2025-06-20T18:49:48Z, size = 39472, hashes = { sha256 = "c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", upload-time = 2025-06-20T18:49:47Z, size = 31594, hashes = { sha256 = "dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d" } }] + +[[packages]] +name = "pyflakes" +version = "3.4.0" +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", upload-time = 2025-06-20T18:45:27Z, size = 64669, hashes = { sha256 = "b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", upload-time = 2025-06-20T18:45:26Z, size = 63551, hashes = { sha256 = "f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f" } }] + +[[packages]] +name = "pyinstaller" +version = "6.20.0" +sdist = { url = "https://files.pythonhosted.org/packages/46/60/d03d52e6690d4e9caf333dcd14550cde634ce6c118b3bc8fa3112c3186fd/pyinstaller-6.20.0.tar.gz", upload-time = 2026-04-22T20:59:36Z, size = 4048728, hashes = { sha256 = "95c5c7e03d5d61e9dfb8ef259c699cf492bb1041beb6dbe83696608cec07347a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/76/8c/300f57578882cce259bfb5ae56fda3b69caa3fe9df40a176c719920ea6e2/pyinstaller-6.20.0-py3-none-win_amd64.whl", upload-time = 2026-04-22T20:59:14Z, size = 1391851, hashes = { sha256 = "d588844e890ee80c4365867f98146636e1849bbca8e4284bbf0c809aff0f161a" } }] + +[[packages]] +name = "pyinstaller-hooks-contrib" +version = "2026.5" +sdist = { url = "https://files.pythonhosted.org/packages/1a/67/f4452d68793fb15beba4f19ef39a38a8822f0da7452b503c400d5a21f5c1/pyinstaller_hooks_contrib-2026.5.tar.gz", upload-time = 2026-05-04T22:36:55Z, size = 173689, hashes = { sha256 = "f066dfca8f7c45ff6336c9cf9fe25b4e48bfeb322a1aa24faaedfb8a8d1b0b08" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/f6/5c/fd465d11da4d12b50d7eb5d2ee2ceb780d8d049dbb489f3828d131e387af/pyinstaller_hooks_contrib-2026.5-py3-none-any.whl", upload-time = 2026-05-04T22:36:53Z, size = 457314, hashes = { sha256 = "ea1535783fbdac4626351709e83f3ea80b681d3a4745763ebb407b5e27342eb9" } }] + +[[packages]] +name = "pympler" +version = "1.1" +sdist = { url = "https://files.pythonhosted.org/packages/dd/37/c384631908029676d8e7213dd956bb686af303a80db7afbc9be36bc49495/pympler-1.1.tar.gz", upload-time = 2024-06-28T19:56:06Z, size = 179954, hashes = { sha256 = "1eaa867cb8992c218430f1708fdaccda53df064144d1c5656b1e6f1ee6000424" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl", upload-time = 2024-06-28T19:56:05Z, size = 165766, hashes = { sha256 = "5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506" } }] + +[[packages]] +name = "pyreadstat" +version = "1.3.5" +sdist = { url = "https://files.pythonhosted.org/packages/4a/5d/0dce5f7c8570afd3a2595f95c5fa8f814adfcdcd5b248470e3b6f132eb33/pyreadstat-1.3.5.tar.gz", upload-time = 2026-05-19T12:22:09Z, size = 514802, hashes = { sha256 = "c7332a764b221193522cbf942ed07898aac48180fe1a4435a5dc9a2fdd81c1e1" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/e2/1c/21ce077750fdeadad800289f0a8c648b4a8165b6da6908b287994ce1e3d6/pyreadstat-1.3.5-cp312-cp312-win_amd64.whl", upload-time = 2026-05-19T12:21:47Z, size = 2024486, hashes = { sha256 = "a7a32414c93dcfac36b3d525c3d16f91b8f86bc4ed7cac13ad29ab05a9204e34" } }] + +[[packages]] +name = "pytest" +version = "7.4.4" +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", upload-time = 2023-12-31T12:00:18Z, size = 1357116, hashes = { sha256 = "2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", upload-time = 2023-12-31T12:00:13Z, size = 325287, hashes = { sha256 = "b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" } }] + +[[packages]] +name = "pytest-asyncio" +version = "0.23.8" +sdist = { url = "https://files.pythonhosted.org/packages/de/b4/0b378b7bf26a8ae161c3890c0b48a91a04106c5713ce81b4b080ea2f4f18/pytest_asyncio-0.23.8.tar.gz", upload-time = 2024-07-17T17:39:34Z, size = 46920, hashes = { sha256 = "759b10b33a6dc61cce40a8bd5205e302978bbbcc00e279a8b61d9a6a3c82e4d3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ee/82/62e2d63639ecb0fbe8a7ee59ef0bc69a4669ec50f6d3459f74ad4e4189a2/pytest_asyncio-0.23.8-py3-none-any.whl", upload-time = 2024-07-17T17:39:32Z, size = 17663, hashes = { sha256 = "50265d892689a5faefb84df80819d1ecef566eb3549cf915dfb33569359d1ce2" } }] + +[[packages]] +name = "pytest-cov" +version = "7.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz", upload-time = 2026-03-21T20:11:16Z, size = 55592, hashes = { sha256 = "30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl", upload-time = 2026-03-21T20:11:14Z, size = 22876, hashes = { sha256 = "a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678" } }] + +[[packages]] +name = "python-dateutil" +version = "2.9.0.post0" +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", upload-time = 2024-03-01T18:36:20Z, size = 342432, hashes = { sha256 = "37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", upload-time = 2024-03-01T18:36:18Z, size = 229892, hashes = { sha256 = "a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" } }] + +[[packages]] +name = "python-discovery" +version = "1.4.0" +sdist = { url = "https://files.pythonhosted.org/packages/a6/12/38c1a0b1e64806780c9563e3fc9f6e472251839662587cfbe9bfaf2ae10a/python_discovery-1.4.0.tar.gz", upload-time = 2026-05-28T01:15:37Z, size = 68455, hashes = { sha256 = "eb8bc7daad3c226c147e45bb4e970a1feb1bf4048ee178e6db59e197b8010ce3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c8/8d/3d316429f65029532bb1e28ff77b797d86b5ac3915bb44ca4e19aa283d43/python_discovery-1.4.0-py3-none-any.whl", upload-time = 2026-05-28T01:15:36Z, size = 33217, hashes = { sha256 = "26ed78d703e234879a66244c7d4114563fb13ec5cd30a2d1357e5fb4850782da" } }] + +[[packages]] +name = "python-dotenv" +version = "1.2.2" +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", upload-time = 2026-03-01T16:00:26Z, size = 50135, hashes = { sha256 = "2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", upload-time = 2026-03-01T16:00:25Z, size = 22101, hashes = { sha256 = "1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a" } }] + +[[packages]] +name = "pytokens" +version = "0.4.1" +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", upload-time = 2026-01-30T01:03:45Z, size = 23015, hashes = { sha256 = "292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", upload-time = 2026-01-30T01:03:12Z, size = 103552, hashes = { sha256 = "3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68" } }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", upload-time = 2026-01-30T01:03:45Z, size = 13729, hashes = { sha256 = "26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de" } }, +] + +[[packages]] +name = "pytz" +version = "2026.2" +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", upload-time = 2026-05-04T01:35:29Z, size = 320861, hashes = { sha256 = "0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", upload-time = 2026-05-04T01:35:27Z, size = 510141, hashes = { sha256 = "04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126" } }] + +[[packages]] +name = "pywin32" +version = "312" +marker = "sys_platform == 'win32'" +wheels = [{ url = "https://files.pythonhosted.org/packages/03/d9/77040d3b43df3f3be32ea289433d660d2727f5ba327bc73be835127d9d60/pywin32-312-cp312-cp312-win_amd64.whl", upload-time = 2026-06-04T07:49:31Z, size = 6914841, hashes = { sha256 = "b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc" } }] + +[[packages]] +name = "pywin32-ctypes" +version = "0.2.3" +marker = "sys_platform == 'win32'" +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", upload-time = 2024-08-14T10:15:34Z, size = 29471, hashes = { sha256 = "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", upload-time = 2024-08-14T10:15:33Z, size = 30756, hashes = { sha256 = "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" } }] + +[[packages]] +name = "pyyaml" +version = "6.0.3" +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", upload-time = 2025-09-25T21:33:16Z, size = 130960, hashes = { sha256 = "d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", upload-time = 2025-09-25T21:32:21Z, size = 154003, hashes = { sha256 = "5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b" } }] + +[[packages]] +name = "redis" +version = "8.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/53/ae/ed461cca5780b5fc8b9fe8ca0ed98d89508645fb9d880c24cc42c087678f/redis-8.0.0.tar.gz", upload-time = 2026-05-28T12:45:13Z, size = 5101591, hashes = { sha256 = "a00c5355432051ac14e593b8b197fc76c887ee12d55a0984f69328a1115fdc49" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/27/e3/b519734372d305bd547534a9f32e4ce9f98552af753dce72cf3483a0ff0b/redis-8.0.0-py3-none-any.whl", upload-time = 2026-05-28T12:45:11Z, size = 499870, hashes = { sha256 = "c938c18338585009f0bc310f4c7e4e4b4d37639356c4ac072cedf3af570c8dc7" } }] + +[[packages]] +name = "referencing" +version = "0.37.0" +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", upload-time = 2025-10-13T15:30:48Z, size = 78036, hashes = { sha256 = "44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", upload-time = 2025-10-13T15:30:47Z, size = 26766, hashes = { sha256 = "381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231" } }] + +[[packages]] +name = "requests" +version = "2.34.2" +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", upload-time = 2026-05-14T19:25:27Z, size = 142856, hashes = { sha256 = "f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", upload-time = 2026-05-14T19:25:26Z, size = 73075, hashes = { sha256 = "2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0" } }] + +[[packages]] +name = "rpds-py" +version = "2026.5.1" +sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", upload-time = 2026-05-28T12:02:13Z, size = 64459, hashes = { sha256 = "07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", upload-time = 2026-05-28T11:59:31Z, size = 229045, hashes = { sha256 = "0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870" } }] + +[[packages]] +name = "setuptools" +version = "82.0.1" +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", upload-time = 2026-03-09T12:47:17Z, size = 1152316, hashes = { sha256 = "7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", upload-time = 2026-03-09T12:47:15Z, size = 1006223, hashes = { sha256 = "a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb" } }] + +[[packages]] +name = "six" +version = "1.17.0" +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", upload-time = 2024-12-04T17:35:28Z, size = 34031, hashes = { sha256 = "ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", upload-time = 2024-12-04T17:35:26Z, size = 11050, hashes = { sha256 = "4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" } }] + +[[packages]] +name = "titlecase" +version = "2.4.1" +sdist = { url = "https://files.pythonhosted.org/packages/63/17/04d2d3e30e2bc5a3eefa1060b08e3fb628510440f938eaecabbe08976a26/titlecase-2.4.1.tar.gz", upload-time = 2023-09-23T05:03:46Z, size = 14434, hashes = { sha256 = "7d83a277ccbbda11a2944e78a63e5ccaf3d32f828c594312e4862f9a07f635f5" } } + +[[packages]] +name = "toolz" +version = "1.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", upload-time = 2025-10-17T04:03:21Z, size = 52613, hashes = { sha256 = "27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", upload-time = 2025-10-17T04:03:20Z, size = 58093, hashes = { sha256 = "15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8" } }] + +[[packages]] +name = "typing-extensions" +version = "4.15.0" +marker = "python_full_version < '3.13'" +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", upload-time = 2025-08-25T13:49:26Z, size = 109391, hashes = { sha256 = "0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", upload-time = 2025-08-25T13:49:24Z, size = 44614, hashes = { sha256 = "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" } }] + +[[packages]] +name = "tzdata" +version = "2026.2" +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", upload-time = 2026-04-24T15:22:08Z, size = 198254, hashes = { sha256 = "9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", upload-time = 2026-04-24T15:22:05Z, size = 349321, hashes = { sha256 = "bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7" } }] + +[[packages]] +name = "urllib3" +version = "2.7.0" +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", upload-time = 2026-05-07T16:13:18Z, size = 433602, hashes = { sha256 = "231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", upload-time = 2026-05-07T16:13:17Z, size = 131087, hashes = { sha256 = "9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897" } }] + +[[packages]] +name = "validators" +version = "0.35.0" +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", upload-time = 2025-05-01T05:42:06Z, size = 73399, hashes = { sha256 = "992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", upload-time = 2025-05-01T05:42:04Z, size = 44712, hashes = { sha256 = "e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd" } }] + +[[packages]] +name = "virtualenv" +version = "21.4.2" +sdist = { url = "https://files.pythonhosted.org/packages/e1/0d/4e93c8e6d1001a75763f87d8f5ecda8ebc7f4aa2153dddfaf4ae8892821a/virtualenv-21.4.2.tar.gz", upload-time = 2026-05-31T17:01:22Z, size = 7613326, hashes = { sha256 = "38e6ee0a555615c0ea9da2ac7e9998fe8dc3b911dd33ad8eaad2020957653b0c" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/bf/c4/557dc082be035381b85fdb2b74e21d3d21b57750b74f2b47a32f3a639ff9/virtualenv-21.4.2-py3-none-any.whl", upload-time = 2026-05-31T17:01:20Z, size = 7594079, hashes = { sha256 = "854210ca524a1a4d0d744734f4acbc721c3ffe163b85bbf5d56d14d5ae2f0fae" } }] + +[[packages]] +name = "xmlschema" +version = "4.3.1" +sdist = { url = "https://files.pythonhosted.org/packages/da/c4/ef78a231be72349fd6677b989ff80e276ef62e28054c36c4fea3b4db9611/xmlschema-4.3.1.tar.gz", upload-time = 2026-01-17T23:01:04Z, size = 646611, hashes = { sha256 = "853effdfaf127849d4724368c17bd669e7f1486e15a0376404ad7954ec31a338" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/dd/7b/3471405875d0b5fac642e9a879b2c7db63642370799b2e9eea8297ffbad0/xmlschema-4.3.1-py3-none-any.whl", upload-time = 2026-01-17T23:01:00Z, size = 469891, hashes = { sha256 = "9560314d70ae87be0aecb8712cfebed636f867707ccf9758d4b0645d607f64b9" } }] + +[[packages]] +name = "zipp" +version = "4.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", upload-time = 2026-05-18T20:08:57Z, size = 26214, hashes = { sha256 = "4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", upload-time = 2026-05-18T20:08:57Z, size = 10238, hashes = { sha256 = "25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f" } }] diff --git a/pylock.toml b/pylock.toml new file mode 100644 index 000000000..280a8a578 --- /dev/null +++ b/pylock.toml @@ -0,0 +1,371 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml -o pylock.toml +lock-version = "1.0" +created-by = "uv" +requires-python = ">=3.12.10" + +[[packages]] +name = "altgraph" +version = "0.17.5" +sdist = { url = "https://files.pythonhosted.org/packages/7e/f8/97fdf103f38fed6792a1601dbc16cc8aac56e7459a9fff08c812d8ae177a/altgraph-0.17.5.tar.gz", upload-time = 2025-11-21T20:35:50Z, size = 48428, hashes = { sha256 = "c87b395dd12fabde9c99573a9749d67da8d29ef9de0125c7f536699b4a9bc9e7" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a9/ba/000a1996d4308bc65120167c21241a3b205464a2e0b58deda26ae8ac21d1/altgraph-0.17.5-py2.py3-none-any.whl", upload-time = 2025-11-21T20:35:49Z, size = 21228, hashes = { sha256 = "f3a22400bce1b0c701683820ac4f3b159cd301acab067c51c653e06961600597" } }] + +[[packages]] +name = "attrs" +version = "26.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", upload-time = 2026-03-19T14:22:25Z, size = 952055, hashes = { sha256 = "d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", upload-time = 2026-03-19T14:22:23Z, size = 67548, hashes = { sha256 = "c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309" } }] + +[[packages]] +name = "business-rules-enhanced" +version = "1.4.8" +sdist = { url = "https://files.pythonhosted.org/packages/ad/d8/c77f91155c19822ca31f7bd273234485c46263631721a6dae9717543514a/business_rules_enhanced-1.4.8.tar.gz", upload-time = 2025-07-17T20:33:49Z, size = 14119, hashes = { sha256 = "9a5d37ad34efea59f725f33e6c4a983d5f90a7d845864223ce4a50b7c8c36254" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/6d/ac/faa00bef5f6f2e4c0b9e6a0cb821e30f3b1854184070313975ee38ed6999/business_rules_enhanced-1.4.8-py3-none-any.whl", upload-time = 2025-07-17T20:33:48Z, size = 12547, hashes = { sha256 = "b02c8cf919b40dcb6b8da22d5f4f499da635a96546ae01dac55d663325aa90f8" } }] + +[[packages]] +name = "cachetools" +version = "7.1.4" +sdist = { url = "https://files.pythonhosted.org/packages/f4/8b/0d3945a13955303b81272f759a0331e54c5c793da455e6f5706b89d2639c/cachetools-7.1.4.tar.gz", upload-time = 2026-05-21T22:40:43Z, size = 40085, hashes = { sha256 = "437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", upload-time = 2026-05-21T22:40:41Z, size = 16761, hashes = { sha256 = "323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54" } }] + +[[packages]] +name = "cdisc-library-client" +version = "0.1.6" +sdist = { url = "https://files.pythonhosted.org/packages/0c/17/d426b962cbe1d955922db868fea873b03109b46f80585e06660dd6a07d05/cdisc_library_client-0.1.6.tar.gz", upload-time = 2024-12-09T19:57:05Z, size = 4133, hashes = { sha256 = "d3e112d68f406a3d02d9e53c2981fd7cbceec4976ec41d0c5634c24ddf2558d4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1f/d3/1e1dfccb4c3fcf4ccbfcd566b9b71c060fba4ba06d33ea9742aa1e2440fb/cdisc_library_client-0.1.6-py3-none-any.whl", upload-time = 2024-12-09T19:57:04Z, size = 4847, hashes = { sha256 = "701fd27c29b3255ccadf3db717b2e68ec2d8edc9992782b7eeb130fe09175e09" } }] + +[[packages]] +name = "cerberus" +version = "1.3.8" +sdist = { url = "https://files.pythonhosted.org/packages/7a/cf/845d32e330e49e34f1a22dc44868750e75485d7c08c07d37795bcf0a780e/cerberus-1.3.8.tar.gz", upload-time = 2025-11-06T18:29:40Z, size = 29660, hashes = { sha256 = "579554887ffd189226774b87570f4a76db75cf0efcbaffcacd5e98b8ee877f61" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a1/00/ff53f3a4d51e64e9137ce2408a43edf18fec96eebb61f87a6598578fa563/cerberus-1.3.8-py3-none-any.whl", upload-time = 2025-11-06T18:29:38Z, size = 30567, hashes = { sha256 = "46c029e3e2a4735408ed36bec14ef2cbf3e50d8ebe47fb34ee1e54b2da814df2" } }] + +[[packages]] +name = "certifi" +version = "2026.5.20" +sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", upload-time = 2026-05-20T11:46:50Z, size = 135422, hashes = { sha256 = "69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", upload-time = 2026-05-20T11:46:48Z, size = 134134, hashes = { sha256 = "3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897" } }] + +[[packages]] +name = "charset-normalizer" +version = "3.4.7" +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", upload-time = 2026-04-02T09:28:39Z, size = 144271, hashes = { sha256 = "ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5" } } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", upload-time = 2026-04-02T09:26:42Z, size = 159330, hashes = { sha256 = "5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6" } }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", upload-time = 2026-04-02T09:28:37Z, size = 61958, hashes = { sha256 = "3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d" } }, +] + +[[packages]] +name = "click" +version = "8.4.1" +sdist = { url = "https://files.pythonhosted.org/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", upload-time = 2026-05-22T04:08:37Z, size = 353007, hashes = { sha256 = "918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", upload-time = 2026-05-22T04:08:35Z, size = 116639, hashes = { sha256 = "482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2" } }] + +[[packages]] +name = "cloudpickle" +version = "3.1.2" +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", upload-time = 2025-11-03T09:25:26Z, size = 22330, hashes = { sha256 = "7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", upload-time = 2025-11-03T09:25:25Z, size = 22228, hashes = { sha256 = "9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a" } }] + +[[packages]] +name = "colorama" +version = "0.4.6" +marker = "sys_platform == 'win32'" +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", upload-time = 2022-10-25T02:36:22Z, size = 27697, hashes = { sha256 = "08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", upload-time = 2022-10-25T02:36:20Z, size = 25335, hashes = { sha256 = "4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" } }] + +[[packages]] +name = "cramjam" +version = "2.11.0" +sdist = { url = "https://files.pythonhosted.org/packages/14/12/34bf6e840a79130dfd0da7badfb6f7810b8fcfd60e75b0539372667b41b6/cramjam-2.11.0.tar.gz", upload-time = 2025-07-27T21:25:07Z, size = 99100, hashes = { sha256 = "5c82500ed91605c2d9781380b378397012e25127e89d64f460fea6aeac4389b4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/75/b1/d53002729cfd94c5844ddfaf1233c86d29f2dbfc1b764a6562c41c044199/cramjam-2.11.0-cp312-cp312-win_amd64.whl", upload-time = 2025-07-27T21:22:51Z, size = 1709287, hashes = { sha256 = "53fed080476d5f6ad7505883ec5d1ec28ba36c2273db3b3e92d7224fe5e463db" } }] + +[[packages]] +name = "dask" +version = "2026.3.0" +sdist = { url = "https://files.pythonhosted.org/packages/d7/2a/5d8cc1579590af86576dde890254440e478c7174b93a02095ecfc2e6ba38/dask-2026.3.0.tar.gz", upload-time = 2026-03-18T07:10:14Z, size = 11000710, hashes = { sha256 = "f7d96c8274e8a900d217c1ff6ea8d1bbf0b4c2c21e74a409644498d925eb8f85" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/4a/f3/00bb1e867fba351e2d784170955713bee200c43ea306c59f30bd7e748192/dask-2026.3.0-py3-none-any.whl", upload-time = 2026-03-18T07:10:12Z, size = 1485630, hashes = { sha256 = "be614b9242b0b38288060fb2d7696125946469c98a1c30e174883fd199e0428d" } }] + +[[packages]] +name = "elementpath" +version = "5.1.1" +sdist = { url = "https://files.pythonhosted.org/packages/94/95/eeb61a2a917bf506d1402748e71c62399d8dcdd8cdccd64c81962832c260/elementpath-5.1.1.tar.gz", upload-time = 2026-01-20T21:42:27Z, size = 375378, hashes = { sha256 = "c4d1bd6aed987258354d0ea004d965eb0a6818213326bd4fd9bde5dacdb20277" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/14/5a/4ddfd9aeecdc75a78b5d85d882abc2b822115caae2c00a4d0eb23cc101fc/elementpath-5.1.1-py3-none-any.whl", upload-time = 2026-01-20T21:42:24Z, size = 259962, hashes = { sha256 = "57637359065e60654422d8474c1749b09bb21348012b7197f868027e3c09c9b9" } }] + +[[packages]] +name = "et-xmlfile" +version = "2.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", upload-time = 2024-10-25T17:25:40Z, size = 17234, hashes = { sha256 = "dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", upload-time = 2024-10-25T17:25:39Z, size = 18059, hashes = { sha256 = "7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa" } }] + +[[packages]] +name = "fastparquet" +version = "2026.5.0" +sdist = { url = "https://files.pythonhosted.org/packages/1e/82/2de205357ce01bd86b9955910b7bf2bbcc29f7aa5cfbc1f0fadc299fc2b3/fastparquet-2026.5.0.tar.gz", upload-time = 2026-05-15T13:16:46Z, size = 498405, hashes = { sha256 = "12a813d1c91b9d316a8d43860074daf4566849f776f9cd549742aa71d907e4f6" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/08/fe/ba47bfa67868c42f3203e6738b90b80e25f3ecdf1f85e253b27ef2135cf2/fastparquet-2026.5.0-cp312-cp312-win_amd64.whl", upload-time = 2026-05-15T13:19:39Z, size = 695697, hashes = { sha256 = "76f5e7df0fbeb50c694023bf0d77afeb0a33982d30e827d473abd7caf5462a9d" } }] + +[[packages]] +name = "fsspec" +version = "2026.4.0" +sdist = { url = "https://files.pythonhosted.org/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", upload-time = 2026-04-29T20:42:38Z, size = 312760, hashes = { sha256 = "301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", upload-time = 2026-04-29T20:42:36Z, size = 203402, hashes = { sha256 = "11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2" } }] + +[[packages]] +name = "idna" +version = "3.18" +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", upload-time = 2026-06-02T14:34:07Z, size = 196711, hashes = { sha256 = "ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", upload-time = 2026-06-02T14:34:06Z, size = 65455, hashes = { sha256 = "7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2" } }] + +[[packages]] +name = "importlib-metadata" +version = "9.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", upload-time = 2026-03-20T06:42:56Z, size = 56405, hashes = { sha256 = "a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", upload-time = 2026-03-20T06:42:55Z, size = 27789, hashes = { sha256 = "2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7" } }] + +[[packages]] +name = "jsonata-python" +version = "0.6.2" +sdist = { url = "https://files.pythonhosted.org/packages/f4/cc/16f20b1e9466a9904601df339a6b2b31d82eeba6ae97610076ffc9fec9a2/jsonata_python-0.6.2.tar.gz", upload-time = 2026-03-21T07:02:20Z, size = 363452, hashes = { sha256 = "6d553563f0d2cbfd64842d6b35fcec18615acbcf0859061be04bacce3a83b418" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/b6/fb/8ba2f1354718839087cb83b138d710026a05a05e3780c9afa8e43d0a9b86/jsonata_python-0.6.2-py3-none-any.whl", upload-time = 2026-03-21T07:02:19Z, size = 83798, hashes = { sha256 = "86c61632f23587d945cf1693fe966f023593c7ebfe2615814db8756c67e7c776" } }] + +[[packages]] +name = "jsonpath-ng" +version = "1.8.0" +sdist = { url = "https://files.pythonhosted.org/packages/32/58/250751940d75c8019659e15482d548a4aa3b6ce122c515102a4bfdac50e3/jsonpath_ng-1.8.0.tar.gz", upload-time = 2026-02-24T14:42:06Z, size = 74513, hashes = { sha256 = "54252968134b5e549ea5b872f1df1168bd7defe1a52fed5a358c194e1943ddc3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/03/99/33c7d78a3fb70d545fd5411ac67a651c81602cc09c9cf0df383733f068c5/jsonpath_ng-1.8.0-py3-none-any.whl", upload-time = 2026-02-28T00:53:19Z, size = 67844, hashes = { sha256 = "b8dde192f8af58d646fc031fac9c99fe4d00326afc4148f1f043c601a8cfe138" } }] + +[[packages]] +name = "jsonschema" +version = "4.26.0" +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", upload-time = 2026-01-07T13:41:07Z, size = 366583, hashes = { sha256 = "0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", upload-time = 2026-01-07T13:41:05Z, size = 90630, hashes = { sha256 = "d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce" } }] + +[[packages]] +name = "jsonschema-specifications" +version = "2025.9.1" +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", upload-time = 2025-09-08T01:34:59Z, size = 32855, hashes = { sha256 = "b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", upload-time = 2025-09-08T01:34:57Z, size = 18437, hashes = { sha256 = "98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe" } }] + +[[packages]] +name = "locket" +version = "1.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/2f/83/97b29fe05cb6ae28d2dbd30b81e2e402a3eed5f460c26e9eaa5895ceacf5/locket-1.0.0.tar.gz", upload-time = 2022-04-20T22:04:44Z, size = 4350, hashes = { sha256 = "5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", upload-time = 2022-04-20T22:04:42Z, size = 4398, hashes = { sha256 = "b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" } }] + +[[packages]] +name = "lxml" +version = "6.1.1" +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", upload-time = 2026-05-18T19:19:06Z, size = 4197430, hashes = { sha256 = "ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", upload-time = 2026-05-18T19:17:56Z, size = 3997255, hashes = { sha256 = "26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77" } }] + +[[packages]] +name = "narwhals" +version = "2.22.1" +sdist = { url = "https://files.pythonhosted.org/packages/62/3c/c4ef2164a71c1a63d7f1ae411c4082c5fa872405106db60a4b7114989ad7/narwhals-2.22.1.tar.gz", upload-time = 2026-06-05T12:34:34Z, size = 647493, hashes = { sha256 = "d62920805a0a43b7ff8b54b0c0d3142d796f8a9301836ada37e573d6a33cbcd9" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/48/ca/36339329c4604adbcc99c899b7eb1ce1a555c499b6a6860757dc9bfed36d/narwhals-2.22.1-py3-none-any.whl", upload-time = 2026-06-05T12:34:32Z, size = 454815, hashes = { sha256 = "60567d774edf77db53906f89d9fbd164e66e56d66d388e1e6990f17ac33cfb53" } }] + +[[packages]] +name = "numpy" +version = "2.4.6" +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", upload-time = 2026-05-18T23:37:14Z, size = 20735807, hashes = { sha256 = "f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", upload-time = 2026-05-18T23:34:23Z, size = 12321687, hashes = { sha256 = "d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751" } }] + +[[packages]] +name = "odmlib" +version = "0.1.4" +sdist = { url = "https://files.pythonhosted.org/packages/25/7b/60a82f027eaf462e3da3b7daa31f903cee93aaf1a0e26c4a747d5303fe6f/odmlib-0.1.4.tar.gz", upload-time = 2022-03-20T17:21:22Z, size = 257481, hashes = { sha256 = "3b4c31ccf4b68a2c5f1cbe0265a44fe40556f9b3e650efe5846662ae31b96a51" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/f0/ce/15da461c1b996144b459882a6affd097a21737b19077a3a5f064b40bd4e1/odmlib-0.1.4-py3-none-any.whl", upload-time = 2022-03-20T17:21:20Z, size = 311107, hashes = { sha256 = "712e9204013a80923607f453ec5266fd05a0b7cae2a3b96ba35d2e1bcb57624d" } }] + +[[packages]] +name = "openpyxl" +version = "3.1.5" +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", upload-time = 2024-06-28T14:03:44Z, size = 186464, hashes = { sha256 = "cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", upload-time = 2024-06-28T14:03:41Z, size = 250910, hashes = { sha256 = "5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2" } }] + +[[packages]] +name = "packaging" +version = "26.2" +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", upload-time = 2026-04-24T20:15:23Z, size = 228134, hashes = { sha256 = "ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", upload-time = 2026-04-24T20:15:22Z, size = 100195, hashes = { sha256 = "5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e" } }] + +[[packages]] +name = "pandas" +version = "2.3.3" +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", upload-time = 2025-09-29T23:34:51Z, size = 4495223, hashes = { sha256 = "e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", upload-time = 2025-09-29T23:20:54Z, size = 10992722, hashes = { sha256 = "a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b" } }] + +[[packages]] +name = "partd" +version = "1.4.2" +sdist = { url = "https://files.pythonhosted.org/packages/b2/3a/3f06f34820a31257ddcabdfafc2672c5816be79c7e353b02c1f318daa7d4/partd-1.4.2.tar.gz", upload-time = 2024-05-06T19:51:41Z, size = 21029, hashes = { sha256 = "d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/71/e7/40fb618334dcdf7c5a316c0e7343c5cd82d3d866edc100d98e29bc945ecd/partd-1.4.2-py3-none-any.whl", upload-time = 2024-05-06T19:51:39Z, size = 18905, hashes = { sha256 = "978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f" } }] + +[[packages]] +name = "pathvalidate" +version = "3.3.1" +sdist = { url = "https://files.pythonhosted.org/packages/fa/2a/52a8da6fe965dea6192eb716b357558e103aea0a1e9a8352ad575a8406ca/pathvalidate-3.3.1.tar.gz", upload-time = 2025-06-15T09:07:20Z, size = 63262, hashes = { sha256 = "b18c07212bfead624345bb8e1d6141cdcf15a39736994ea0b94035ad2b1ba177" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/9a/70/875f4a23bfc4731703a5835487d0d2fb999031bd415e7d17c0ae615c18b7/pathvalidate-3.3.1-py3-none-any.whl", upload-time = 2025-06-15T09:07:19Z, size = 24305, hashes = { sha256 = "5263baab691f8e1af96092fa5137ee17df5bdfbd6cff1fcac4d6ef4bc2e1735f" } }] + +[[packages]] +name = "pefile" +version = "2024.8.26" +marker = "sys_platform == 'win32'" +sdist = { url = "https://files.pythonhosted.org/packages/03/4f/2750f7f6f025a1507cd3b7218691671eecfd0bbebebe8b39aa0fe1d360b8/pefile-2024.8.26.tar.gz", upload-time = 2024-08-26T20:58:38Z, size = 76008, hashes = { sha256 = "3ff6c5d8b43e8c37bb6e6dd5085658d658a7a0bdcd20b6a07b1fcfc1c4e9d632" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/54/16/12b82f791c7f50ddec566873d5bdd245baa1491bac11d15ffb98aecc8f8b/pefile-2024.8.26-py3-none-any.whl", upload-time = 2024-08-26T21:01:02Z, size = 74766, hashes = { sha256 = "76f8b485dcd3b1bb8166f1128d395fa3d87af26360c2358fb75b80019b957c6f" } }] + +[[packages]] +name = "psutil" +version = "7.2.2" +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", upload-time = 2026-01-28T18:14:54Z, size = 493740, hashes = { sha256 = "0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", upload-time = 2026-01-28T18:15:33Z, size = 137737, hashes = { sha256 = "eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988" } }] + +[[packages]] +name = "pyarrow" +version = "24.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/91/13/13e1069b351bdc3881266e11147ffccf687505dbb0ea74036237f5d454a5/pyarrow-24.0.0.tar.gz", upload-time = 2026-04-21T10:51:25Z, size = 1180261, hashes = { sha256 = "85fe721a14dd823aca09127acbb06c3ca723efbd436c004f16bca601b04dcc83" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/66/1c/e3e72c8014ad2743ca64a701652c733cc5cbcee15c0463a32a8c55518d9e/pyarrow-24.0.0-cp312-cp312-win_amd64.whl", upload-time = 2026-04-21T10:48:01Z, size = 27355660, hashes = { sha256 = "295f0a7f2e242dabd513737cf076007dc5b2d59237e3eca37b05c0c6446f3826" } }] + +[[packages]] +name = "pyinstaller" +version = "6.20.0" +sdist = { url = "https://files.pythonhosted.org/packages/46/60/d03d52e6690d4e9caf333dcd14550cde634ce6c118b3bc8fa3112c3186fd/pyinstaller-6.20.0.tar.gz", upload-time = 2026-04-22T20:59:36Z, size = 4048728, hashes = { sha256 = "95c5c7e03d5d61e9dfb8ef259c699cf492bb1041beb6dbe83696608cec07347a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/76/8c/300f57578882cce259bfb5ae56fda3b69caa3fe9df40a176c719920ea6e2/pyinstaller-6.20.0-py3-none-win_amd64.whl", upload-time = 2026-04-22T20:59:14Z, size = 1391851, hashes = { sha256 = "d588844e890ee80c4365867f98146636e1849bbca8e4284bbf0c809aff0f161a" } }] + +[[packages]] +name = "pyinstaller-hooks-contrib" +version = "2026.5" +sdist = { url = "https://files.pythonhosted.org/packages/1a/67/f4452d68793fb15beba4f19ef39a38a8822f0da7452b503c400d5a21f5c1/pyinstaller_hooks_contrib-2026.5.tar.gz", upload-time = 2026-05-04T22:36:55Z, size = 173689, hashes = { sha256 = "f066dfca8f7c45ff6336c9cf9fe25b4e48bfeb322a1aa24faaedfb8a8d1b0b08" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/f6/5c/fd465d11da4d12b50d7eb5d2ee2ceb780d8d049dbb489f3828d131e387af/pyinstaller_hooks_contrib-2026.5-py3-none-any.whl", upload-time = 2026-05-04T22:36:53Z, size = 457314, hashes = { sha256 = "ea1535783fbdac4626351709e83f3ea80b681d3a4745763ebb407b5e27342eb9" } }] + +[[packages]] +name = "pympler" +version = "1.1" +sdist = { url = "https://files.pythonhosted.org/packages/dd/37/c384631908029676d8e7213dd956bb686af303a80db7afbc9be36bc49495/pympler-1.1.tar.gz", upload-time = 2024-06-28T19:56:06Z, size = 179954, hashes = { sha256 = "1eaa867cb8992c218430f1708fdaccda53df064144d1c5656b1e6f1ee6000424" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/79/4f/a6a2e2b202d7fd97eadfe90979845b8706676b41cbd3b42ba75adf329d1f/Pympler-1.1-py3-none-any.whl", upload-time = 2024-06-28T19:56:05Z, size = 165766, hashes = { sha256 = "5b223d6027d0619584116a0cbc28e8d2e378f7a79c1e5e024f9ff3b673c58506" } }] + +[[packages]] +name = "pyreadstat" +version = "1.3.5" +sdist = { url = "https://files.pythonhosted.org/packages/4a/5d/0dce5f7c8570afd3a2595f95c5fa8f814adfcdcd5b248470e3b6f132eb33/pyreadstat-1.3.5.tar.gz", upload-time = 2026-05-19T12:22:09Z, size = 514802, hashes = { sha256 = "c7332a764b221193522cbf942ed07898aac48180fe1a4435a5dc9a2fdd81c1e1" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/e2/1c/21ce077750fdeadad800289f0a8c648b4a8165b6da6908b287994ce1e3d6/pyreadstat-1.3.5-cp312-cp312-win_amd64.whl", upload-time = 2026-05-19T12:21:47Z, size = 2024486, hashes = { sha256 = "a7a32414c93dcfac36b3d525c3d16f91b8f86bc4ed7cac13ad29ab05a9204e34" } }] + +[[packages]] +name = "python-dateutil" +version = "2.9.0.post0" +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", upload-time = 2024-03-01T18:36:20Z, size = 342432, hashes = { sha256 = "37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", upload-time = 2024-03-01T18:36:18Z, size = 229892, hashes = { sha256 = "a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" } }] + +[[packages]] +name = "python-dotenv" +version = "1.2.2" +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", upload-time = 2026-03-01T16:00:26Z, size = 50135, hashes = { sha256 = "2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", upload-time = 2026-03-01T16:00:25Z, size = 22101, hashes = { sha256 = "1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a" } }] + +[[packages]] +name = "pytz" +version = "2026.2" +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", upload-time = 2026-05-04T01:35:29Z, size = 320861, hashes = { sha256 = "0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", upload-time = 2026-05-04T01:35:27Z, size = 510141, hashes = { sha256 = "04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126" } }] + +[[packages]] +name = "pywin32" +version = "312" +marker = "sys_platform == 'win32'" +wheels = [{ url = "https://files.pythonhosted.org/packages/03/d9/77040d3b43df3f3be32ea289433d660d2727f5ba327bc73be835127d9d60/pywin32-312-cp312-cp312-win_amd64.whl", upload-time = 2026-06-04T07:49:31Z, size = 6914841, hashes = { sha256 = "b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc" } }] + +[[packages]] +name = "pywin32-ctypes" +version = "0.2.3" +marker = "sys_platform == 'win32'" +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", upload-time = 2024-08-14T10:15:34Z, size = 29471, hashes = { sha256 = "d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", upload-time = 2024-08-14T10:15:33Z, size = 30756, hashes = { sha256 = "8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" } }] + +[[packages]] +name = "pyyaml" +version = "6.0.3" +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", upload-time = 2025-09-25T21:33:16Z, size = 130960, hashes = { sha256 = "d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", upload-time = 2025-09-25T21:32:21Z, size = 154003, hashes = { sha256 = "5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b" } }] + +[[packages]] +name = "redis" +version = "8.0.0" +sdist = { url = "https://files.pythonhosted.org/packages/53/ae/ed461cca5780b5fc8b9fe8ca0ed98d89508645fb9d880c24cc42c087678f/redis-8.0.0.tar.gz", upload-time = 2026-05-28T12:45:13Z, size = 5101591, hashes = { sha256 = "a00c5355432051ac14e593b8b197fc76c887ee12d55a0984f69328a1115fdc49" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/27/e3/b519734372d305bd547534a9f32e4ce9f98552af753dce72cf3483a0ff0b/redis-8.0.0-py3-none-any.whl", upload-time = 2026-05-28T12:45:11Z, size = 499870, hashes = { sha256 = "c938c18338585009f0bc310f4c7e4e4b4d37639356c4ac072cedf3af570c8dc7" } }] + +[[packages]] +name = "referencing" +version = "0.37.0" +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", upload-time = 2025-10-13T15:30:48Z, size = 78036, hashes = { sha256 = "44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", upload-time = 2025-10-13T15:30:47Z, size = 26766, hashes = { sha256 = "381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231" } }] + +[[packages]] +name = "requests" +version = "2.34.2" +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", upload-time = 2026-05-14T19:25:27Z, size = 142856, hashes = { sha256 = "f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", upload-time = 2026-05-14T19:25:26Z, size = 73075, hashes = { sha256 = "2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0" } }] + +[[packages]] +name = "rpds-py" +version = "2026.5.1" +sdist = { url = "https://files.pythonhosted.org/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", upload-time = 2026-05-28T12:02:13Z, size = 64459, hashes = { sha256 = "07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", upload-time = 2026-05-28T11:59:31Z, size = 229045, hashes = { sha256 = "0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870" } }] + +[[packages]] +name = "setuptools" +version = "82.0.1" +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", upload-time = 2026-03-09T12:47:17Z, size = 1152316, hashes = { sha256 = "7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", upload-time = 2026-03-09T12:47:15Z, size = 1006223, hashes = { sha256 = "a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb" } }] + +[[packages]] +name = "six" +version = "1.17.0" +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", upload-time = 2024-12-04T17:35:28Z, size = 34031, hashes = { sha256 = "ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", upload-time = 2024-12-04T17:35:26Z, size = 11050, hashes = { sha256 = "4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274" } }] + +[[packages]] +name = "titlecase" +version = "2.4.1" +sdist = { url = "https://files.pythonhosted.org/packages/63/17/04d2d3e30e2bc5a3eefa1060b08e3fb628510440f938eaecabbe08976a26/titlecase-2.4.1.tar.gz", upload-time = 2023-09-23T05:03:46Z, size = 14434, hashes = { sha256 = "7d83a277ccbbda11a2944e78a63e5ccaf3d32f828c594312e4862f9a07f635f5" } } + +[[packages]] +name = "toolz" +version = "1.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/11/d6/114b492226588d6ff54579d95847662fc69196bdeec318eb45393b24c192/toolz-1.1.0.tar.gz", upload-time = 2025-10-17T04:03:21Z, size = 52613, hashes = { sha256 = "27a5c770d068c110d9ed9323f24f1543e83b2f300a687b7891c1a6d56b697b5b" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/fb/12/5911ae3eeec47800503a238d971e51722ccea5feb8569b735184d5fcdbc0/toolz-1.1.0-py3-none-any.whl", upload-time = 2025-10-17T04:03:20Z, size = 58093, hashes = { sha256 = "15ccc861ac51c53696de0a5d6d4607f99c210739caf987b5d2054f3efed429d8" } }] + +[[packages]] +name = "typing-extensions" +version = "4.15.0" +marker = "python_full_version < '3.13'" +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", upload-time = 2025-08-25T13:49:26Z, size = 109391, hashes = { sha256 = "0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", upload-time = 2025-08-25T13:49:24Z, size = 44614, hashes = { sha256 = "f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548" } }] + +[[packages]] +name = "tzdata" +version = "2026.2" +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", upload-time = 2026-04-24T15:22:08Z, size = 198254, hashes = { sha256 = "9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", upload-time = 2026-04-24T15:22:05Z, size = 349321, hashes = { sha256 = "bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7" } }] + +[[packages]] +name = "urllib3" +version = "2.7.0" +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", upload-time = 2026-05-07T16:13:18Z, size = 433602, hashes = { sha256 = "231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", upload-time = 2026-05-07T16:13:17Z, size = 131087, hashes = { sha256 = "9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897" } }] + +[[packages]] +name = "validators" +version = "0.35.0" +sdist = { url = "https://files.pythonhosted.org/packages/53/66/a435d9ae49850b2f071f7ebd8119dd4e84872b01630d6736761e6e7fd847/validators-0.35.0.tar.gz", upload-time = 2025-05-01T05:42:06Z, size = 73399, hashes = { sha256 = "992d6c48a4e77c81f1b4daba10d16c3a9bb0dbb79b3a19ea847ff0928e70497a" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/fa/6e/3e955517e22cbdd565f2f8b2e73d52528b14b8bcfdb04f62466b071de847/validators-0.35.0-py3-none-any.whl", upload-time = 2025-05-01T05:42:04Z, size = 44712, hashes = { sha256 = "e8c947097eae7892cb3d26868d637f79f47b4a0554bc6b80065dfe5aac3705dd" } }] + +[[packages]] +name = "xmlschema" +version = "4.3.1" +sdist = { url = "https://files.pythonhosted.org/packages/da/c4/ef78a231be72349fd6677b989ff80e276ef62e28054c36c4fea3b4db9611/xmlschema-4.3.1.tar.gz", upload-time = 2026-01-17T23:01:04Z, size = 646611, hashes = { sha256 = "853effdfaf127849d4724368c17bd669e7f1486e15a0376404ad7954ec31a338" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/dd/7b/3471405875d0b5fac642e9a879b2c7db63642370799b2e9eea8297ffbad0/xmlschema-4.3.1-py3-none-any.whl", upload-time = 2026-01-17T23:01:00Z, size = 469891, hashes = { sha256 = "9560314d70ae87be0aecb8712cfebed636f867707ccf9758d4b0645d607f64b9" } }] + +[[packages]] +name = "zipp" +version = "4.1.0" +sdist = { url = "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", upload-time = 2026-05-18T20:08:57Z, size = 26214, hashes = { sha256 = "4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602" } } +wheels = [{ url = "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", upload-time = 2026-05-18T20:08:57Z, size = 10238, hashes = { sha256 = "25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f" } }] From 322da53bd17b99fdb1224977834473efc095b887 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Mon, 8 Jun 2026 16:39:58 -0400 Subject: [PATCH 15/17] sync changes, and remove requirements --- .github/workflows/test-unit.yml | 2 +- docs/development.md | 6 ++---- requirements.txt | 28 ---------------------------- 3 files changed, 3 insertions(+), 33 deletions(-) delete mode 100644 requirements.txt diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index 41f139346..ee9f1952a 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -17,7 +17,7 @@ jobs: - name: Install requirements run: | pip install uv - uv pip sync pylock.toml pylock.dev.toml + uv pip sync pylock.dev.toml pip install -e . - name: Running Tests env: diff --git a/docs/development.md b/docs/development.md index eb859f186..9caa6573f 100644 --- a/docs/development.md +++ b/docs/development.md @@ -42,8 +42,6 @@ python -m venv venv # Activate (Linux/Mac) source venv/bin/activate -# Install dependencies (Linux/Mac) -pip install -e . && pip install --group dev # Activate (Windows) .\venv\Scripts\Activate @@ -52,10 +50,10 @@ pip install -e . && pip install --group dev pip install uv # Install pinned dependencies from the primary & dev lockfiles -uv pip sync pylock.toml pylock.dev.toml +uv pip sync pylock.dev.toml # Install the package itself in editable mode -pip install -e . +pip install -e. ``` > **Note:** `pylock.toml` and `pylock.dev.toml` are standard lockfiles (PEP 751) and can be used diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 61556482d..000000000 --- a/requirements.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Lockfile: exact pinned versions for reproducible installs. -# Dependency constraints are defined in pyproject.toml. -business_rules_enhanced==1.4.8 -cachetools==6.1.0 -cdisc-library-client==0.1.6 -click==8.1.7 -dask[dataframe]==2024.6.0 -dask[array]==2024.6.0 -fastparquet==2024.2.0 -importlib-metadata==8.5.0 -jsonata-python==0.6.0 -jsonpath-ng==1.6.1 -jsonschema==4.18.5 -lxml==5.2.1 -numpy~=1.26.0 -odmlib==0.1.4 -openpyxl==3.1.5 -pandas==2.1.4 -psutil==6.1.1 -pyinstaller==6.11.0 -Pympler==1.1 -pyreadstat==1.2.7 -python-dotenv==1.0.0 -pyyaml==6.0.2 -redis==4.5.0 -requests~=2.32.3 -setuptools~=75.6.0 -titlecase==2.4.1 \ No newline at end of file From 750ec6801cc15c53202c57e23ecffa08da2f6498 Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Mon, 8 Jun 2026 16:54:56 -0400 Subject: [PATCH 16/17] system flag --- .github/workflows/build-binary.yml | 4 ++-- .github/workflows/build-version.yml | 12 ++++++------ .github/workflows/prerelease-update-cache.yml | 2 +- .github/workflows/release.yml | 4 ++-- .github/workflows/test-release.yml | 5 +++-- .github/workflows/test-suite.yml | 4 ++-- .github/workflows/test-unit.yml | 4 ++-- docs/development.md | 2 +- 8 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.github/workflows/build-binary.yml b/.github/workflows/build-binary.yml index e811c12ad..33ad2ae4f 100644 --- a/.github/workflows/build-binary.yml +++ b/.github/workflows/build-binary.yml @@ -22,8 +22,8 @@ jobs: run: | python -m pip install --upgrade pip pip install uv - uv pip sync pylock.toml - pip install -e . + uv pip sync --system pylock.toml + uv pip install --system -e . - name: Build Binary (Linux) if: runner.os == 'Linux' diff --git a/.github/workflows/build-version.yml b/.github/workflows/build-version.yml index 370553c5f..4de316b02 100644 --- a/.github/workflows/build-version.yml +++ b/.github/workflows/build-version.yml @@ -20,8 +20,8 @@ jobs: run: | python -m pip install --upgrade pip pip install uv - uv pip sync pylock.toml - pip install -e . + uv pip sync --system pylock.toml + uv pip install --system -e . - name: Update CDISC standards cache env: CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} @@ -74,8 +74,8 @@ jobs: # run: | # python -m pip install --upgrade pip # pip install uv -# uv pip sync pylock.toml -# pip install -e . +# uv pip sync --system pylock.toml +# uv pip install --system -e . # - name: Update CDISC standards cache # env: # CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} @@ -118,8 +118,8 @@ jobs: # run: | # python -m pip install --upgrade pip # pip install uv -# uv pip sync pylock.toml -# pip install -e . +# uv pip sync --system pylock.toml +# uv pip install --system -e . # - name: Update CDISC standards cache # env: # CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} diff --git a/.github/workflows/prerelease-update-cache.yml b/.github/workflows/prerelease-update-cache.yml index d10256fd4..13dd871c7 100644 --- a/.github/workflows/prerelease-update-cache.yml +++ b/.github/workflows/prerelease-update-cache.yml @@ -25,7 +25,7 @@ jobs: - name: Install requirements run: | pip install uv - uv pip sync pylock.toml + uv pip sync --system pylock.toml pip install -e . - name: Run Update Cache Script diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d0e0e38ea..630db885a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,8 +103,8 @@ jobs: run: | python -m pip install --upgrade pip pip install uv build twine - uv pip sync pylock.toml - pip install -e . + uv pip sync --system pylock.toml + uv pip install --system -e . - name: Build package run: | python -m build diff --git a/.github/workflows/test-release.yml b/.github/workflows/test-release.yml index 41628c7e4..cb4f3af50 100644 --- a/.github/workflows/test-release.yml +++ b/.github/workflows/test-release.yml @@ -82,8 +82,9 @@ jobs: run: | python -m pip install --upgrade pip pip install uv build twine - uv pip sync pylock.toml - pip install -e . + uv pip sync --system pylock.toml + uv pip install --system -e . + - name: Build package run: | diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index 813681909..3ec0a3e44 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -29,8 +29,8 @@ jobs: - name: Install dependencies run: | pip install uv - uv pip sync pylock.toml - pip install -e . + uv pip sync --system pylock.toml + uv pip install --system -e . - name: Update rules cache env: CDISC_LIBRARY_API_KEY: ${{ secrets.CDISC_LIBRARY_API_KEY }} diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index ee9f1952a..788d22e67 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -17,8 +17,8 @@ jobs: - name: Install requirements run: | pip install uv - uv pip sync pylock.dev.toml - pip install -e . + uv pip sync --system pylock.dev.toml + uv pip install --system -e . - name: Running Tests env: CDISC_LIBRARY_API_KEY: fakekey12341234 diff --git a/docs/development.md b/docs/development.md index 9caa6573f..fb920f0d8 100644 --- a/docs/development.md +++ b/docs/development.md @@ -53,7 +53,7 @@ pip install uv uv pip sync pylock.dev.toml # Install the package itself in editable mode -pip install -e. +pip install -e. ``` > **Note:** `pylock.toml` and `pylock.dev.toml` are standard lockfiles (PEP 751) and can be used From 1aac47cc149ea107115f960aeeec707e29f7e89d Mon Sep 17 00:00:00 2001 From: Samuel Johnson Date: Mon, 8 Jun 2026 17:20:47 -0400 Subject: [PATCH 17/17] no build --- .github/workflows/build-binary.yml | 2 +- .github/workflows/build-version.yml | 2 +- .github/workflows/prerelease-update-cache.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/test-release.yml | 2 +- .github/workflows/test-suite.yml | 2 +- .github/workflows/test-unit.yml | 2 +- .github/workflows/validate-published-rules.yml | 7 +++---- 8 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-binary.yml b/.github/workflows/build-binary.yml index 33ad2ae4f..ff97480e9 100644 --- a/.github/workflows/build-binary.yml +++ b/.github/workflows/build-binary.yml @@ -22,7 +22,7 @@ jobs: run: | python -m pip install --upgrade pip pip install uv - uv pip sync --system pylock.toml + uv pip sync --system --no-build pylock.toml uv pip install --system -e . - name: Build Binary (Linux) diff --git a/.github/workflows/build-version.yml b/.github/workflows/build-version.yml index 4de316b02..f1cd1cbe2 100644 --- a/.github/workflows/build-version.yml +++ b/.github/workflows/build-version.yml @@ -20,7 +20,7 @@ jobs: run: | python -m pip install --upgrade pip pip install uv - uv pip sync --system pylock.toml + uv pip sync --system --no-build pylock.toml uv pip install --system -e . - name: Update CDISC standards cache env: diff --git a/.github/workflows/prerelease-update-cache.yml b/.github/workflows/prerelease-update-cache.yml index 13dd871c7..4012e0c7a 100644 --- a/.github/workflows/prerelease-update-cache.yml +++ b/.github/workflows/prerelease-update-cache.yml @@ -25,7 +25,7 @@ jobs: - name: Install requirements run: | pip install uv - uv pip sync --system pylock.toml + uv pip sync --system --no-build pylock.toml pip install -e . - name: Run Update Cache Script diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 630db885a..aaa027692 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -103,7 +103,7 @@ jobs: run: | python -m pip install --upgrade pip pip install uv build twine - uv pip sync --system pylock.toml + uv pip sync --system --no-build pylock.toml uv pip install --system -e . - name: Build package run: | diff --git a/.github/workflows/test-release.yml b/.github/workflows/test-release.yml index cb4f3af50..2441c2fcb 100644 --- a/.github/workflows/test-release.yml +++ b/.github/workflows/test-release.yml @@ -82,7 +82,7 @@ jobs: run: | python -m pip install --upgrade pip pip install uv build twine - uv pip sync --system pylock.toml + uv pip sync --system --no-build pylock.toml uv pip install --system -e . diff --git a/.github/workflows/test-suite.yml b/.github/workflows/test-suite.yml index 3ec0a3e44..2d32d1577 100644 --- a/.github/workflows/test-suite.yml +++ b/.github/workflows/test-suite.yml @@ -29,7 +29,7 @@ jobs: - name: Install dependencies run: | pip install uv - uv pip sync --system pylock.toml + uv pip sync --system --no-build pylock.toml uv pip install --system -e . - name: Update rules cache env: diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index 788d22e67..507a6d70e 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -17,7 +17,7 @@ jobs: - name: Install requirements run: | pip install uv - uv pip sync --system pylock.dev.toml + uv pip sync --system --no-build pylock.dev.toml uv pip install --system -e . - name: Running Tests env: diff --git a/.github/workflows/validate-published-rules.yml b/.github/workflows/validate-published-rules.yml index 383effe9a..814c57820 100644 --- a/.github/workflows/validate-published-rules.yml +++ b/.github/workflows/validate-published-rules.yml @@ -80,10 +80,9 @@ jobs: - name: Install engine dependencies run: | python -m venv venv - ./venv/bin/pip install --upgrade pip - ./venv/bin/pip install uv - ./venv/bin/uv pip sync engine/pylock.toml - ./venv/bin/pip install -e engine/. + venv/bin/pip install uv + venv/bin/uv pip sync --no-build pylock.dev.toml + venv/bin/uv pip install -e . # ----------------------------------------------------------------------- # 5. Run validation for every Published rule # -----------------------------------------------------------------------