From 03227fa15bda3b0b66c764d5099464b6a14dff3a Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 9 May 2026 01:05:55 -0400 Subject: [PATCH 1/2] Update UK reproducibility bundle --- .github/workflows/push.yaml | 2 ++ .../update-policyengine-uk-28814.changed.md | 1 + pyproject.toml | 10 +++---- .../data/release_manifests/uk.json | 23 +++++++------- tests/test_models.py | 6 ++-- tests/test_release_manifests.py | 30 +++++++++++-------- tests/test_uk_regions.py | 2 +- uv.lock | 22 +++++--------- 8 files changed, 49 insertions(+), 47 deletions(-) create mode 100644 changelog.d/update-policyengine-uk-28814.changed.md diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml index a5f20391..642901af 100644 --- a/.github/workflows/push.yaml +++ b/.github/workflows/push.yaml @@ -81,6 +81,8 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 18.x + - name: Set up Quarto + uses: quarto-dev/quarto-actions/setup@v2 - name: Build HTML Assets run: make docs - name: Upload artifact diff --git a/changelog.d/update-policyengine-uk-28814.changed.md b/changelog.d/update-policyengine-uk-28814.changed.md new file mode 100644 index 00000000..42fef047 --- /dev/null +++ b/changelog.d/update-policyengine-uk-28814.changed.md @@ -0,0 +1 @@ +Updated the bundled UK release to policyengine-uk 2.88.14 and policyengine-uk-data 1.55.5. diff --git a/pyproject.toml b/pyproject.toml index 57ce102e..a6bec2cc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,11 +41,11 @@ graph = [ "networkx>=3.0", ] uk = [ - "policyengine_core>=3.25.0", - "policyengine-uk==2.88.0", + "policyengine_core>=3.26.0", + "policyengine-uk==2.88.14", ] us = [ - "policyengine_core>=3.25.0", + "policyengine_core>=3.26.0", "policyengine-us==1.687.0", ] dev = [ @@ -59,8 +59,8 @@ dev = [ "plotly>=5.0.0", "pytest-asyncio>=0.26.0", "ruff>=0.9.0", - "policyengine_core>=3.25.0", - "policyengine-uk==2.88.0", + "policyengine_core>=3.26.0", + "policyengine-uk==2.88.14", "policyengine-us==1.687.0", "towncrier>=24.8.0", "mypy>=1.11.0", diff --git a/src/policyengine/data/release_manifests/uk.json b/src/policyengine/data/release_manifests/uk.json index 10c0eec3..09b96720 100644 --- a/src/policyengine/data/release_manifests/uk.json +++ b/src/policyengine/data/release_manifests/uk.json @@ -5,29 +5,30 @@ "policyengine_version": "4.3.1", "model_package": { "name": "policyengine-uk", - "version": "2.88.0", - "sha256": "46a3ba443b43ec810c5efaccd4645edb63c8dc90ef5acf9b0cdf5ace86b9334d", - "wheel_url": "https://files.pythonhosted.org/packages/23/7e/8a2a42eac1da63730a865964aa17e7fd4420ce4db4c80001c1b5ca6011e8/policyengine_uk-2.88.0-py3-none-any.whl" + "version": "2.88.14", + "sha256": "ed10005ba7d0c973c0966ebbf7672853fb3caaa0456b8bf485fb13f8c323d975", + "wheel_url": "https://files.pythonhosted.org/packages/a3/fc/276fb639a46bda35523329d8968bcc4089fde9e97fab82722c0ec853c6cc/policyengine_uk-2.88.14-py3-none-any.whl" }, "data_package": { "name": "policyengine-uk-data", - "version": "1.40.4", + "version": "1.55.5", "repo_id": "policyengine/policyengine-uk-data-private" }, "certified_data_artifact": { "data_package": { "name": "policyengine-uk-data", - "version": "1.40.4" + "version": "1.55.5" }, - "build_id": "policyengine-uk-data-1.40.4", + "build_id": "policyengine-uk-data-1.55.5", "dataset": "enhanced_frs_2023_24", - "uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.40.4" + "uri": "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.55.5" }, "certification": { - "compatibility_basis": "exact_build_model_version", - "data_build_id": "policyengine-uk-data-1.40.4", - "built_with_model_version": "2.88.0", - "certified_for_model_version": "2.88.0", + "compatibility_basis": "matching_data_build_fingerprint", + "data_build_id": "policyengine-uk-data-1.55.5", + "built_with_model_version": "2.88.14", + "certified_for_model_version": "2.88.14", + "data_build_fingerprint": "sha256:dff5c5bb976ce254fa965ecfce6a0d84859fe1629a714ae28a79b3075522a0ae", "certified_by": "policyengine.py bundled manifest" }, "default_dataset": "enhanced_frs_2023_24", diff --git a/tests/test_models.py b/tests/test_models.py index 3dd644c3..72597ad8 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -29,12 +29,12 @@ def test_has_release_manifest_metadata(self): assert uk_latest.release_manifest is not None assert uk_latest.release_manifest.country_id == "uk" assert uk_latest.model_package.name == "policyengine-uk" - assert uk_latest.model_package.version == "2.88.0" + assert uk_latest.model_package.version == "2.88.14" assert uk_latest.data_package.name == "policyengine-uk-data" - assert uk_latest.data_package.version == "1.40.4" + assert uk_latest.data_package.version == "1.55.5" assert ( uk_latest.default_dataset_uri - == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.40.4" + == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.55.5" ) def test_has_hundreds_of_parameters(self): diff --git a/tests/test_release_manifests.py b/tests/test_release_manifests.py index fa7f7582..613444ff 100644 --- a/tests/test_release_manifests.py +++ b/tests/test_release_manifests.py @@ -83,21 +83,25 @@ def test__given_uk_manifest__then_has_pinned_model_and_data_packages(self): assert manifest.country_id == "uk" assert manifest.policyengine_version == POLICYENGINE_VERSION assert manifest.model_package.name == "policyengine-uk" - assert manifest.model_package.version == "2.88.0" + assert manifest.model_package.version == "2.88.14" assert manifest.data_package.name == "policyengine-uk-data" - assert manifest.data_package.version == "1.40.4" + assert manifest.data_package.version == "1.55.5" assert ( manifest.data_package.repo_id == "policyengine/policyengine-uk-data-private" ) assert manifest.certified_data_artifact is not None assert ( - manifest.certified_data_artifact.build_id == "policyengine-uk-data-1.40.4" + manifest.certified_data_artifact.build_id == "policyengine-uk-data-1.55.5" ) assert manifest.certified_data_artifact.dataset == "enhanced_frs_2023_24" assert manifest.certification is not None - assert manifest.certification.data_build_id == "policyengine-uk-data-1.40.4" - assert manifest.certification.built_with_model_version == "2.88.0" - assert manifest.certification.certified_for_model_version == "2.88.0" + assert manifest.certification.data_build_id == "policyengine-uk-data-1.55.5" + assert manifest.certification.built_with_model_version == "2.88.14" + assert manifest.certification.certified_for_model_version == "2.88.14" + assert ( + manifest.certification.data_build_fingerprint + == "sha256:dff5c5bb976ce254fa965ecfce6a0d84859fe1629a714ae28a79b3075522a0ae" + ) def test__given_us_dataset_name__then_resolves_to_versioned_hf_url(self): resolved = resolve_dataset_reference("us", "enhanced_cps_2024") @@ -112,7 +116,7 @@ def test__given_uk_dataset_name__then_resolves_to_versioned_hf_url(self): assert ( resolved - == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.40.4" + == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.55.5" ) def test__given_explicit_url__then_resolution_is_noop(self): @@ -483,9 +487,9 @@ def test__given_manifest_certification__then_release_bundle_exposes_it(self): assert bundle["bundle_id"] == f"uk-{POLICYENGINE_VERSION}" assert bundle["default_dataset"] == "enhanced_frs_2023_24" assert bundle["default_dataset_uri"] == manifest.default_dataset_uri - assert bundle["certified_data_build_id"] == "policyengine-uk-data-1.40.4" - assert bundle["data_build_model_version"] == "2.88.0" - assert bundle["compatibility_basis"] == "exact_build_model_version" + assert bundle["certified_data_build_id"] == "policyengine-uk-data-1.55.5" + assert bundle["data_build_model_version"] == "2.88.14" + assert bundle["compatibility_basis"] == "matching_data_build_fingerprint" assert bundle["certified_by"] == "policyengine.py bundled manifest" def test__given_runtime_certification__then_release_bundle_prefers_runtime_value( @@ -565,19 +569,19 @@ def test__given_uk_managed_dataset_name__then_resolves_within_bundle(self): else: assert dataset == ( "hf://policyengine/policyengine-uk-data-private/" - "enhanced_frs_2023_24.h5@1.40.4" + "enhanced_frs_2023_24.h5@1.55.5" ) assert ( microsim.policyengine_bundle["policyengine_version"] == POLICYENGINE_VERSION ) assert microsim.policyengine_bundle["runtime_dataset"] == "enhanced_frs_2023_24" assert microsim.policyengine_bundle["runtime_dataset_uri"] == ( - "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.40.4" + "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.55.5" ) dataset_source = microsim.policyengine_bundle["runtime_dataset_source"] assert ( dataset_source - == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.40.4" + == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.55.5" or str(dataset_source).endswith( "policyengine_uk_data/storage/enhanced_frs_2023_24.h5" ) diff --git a/tests/test_uk_regions.py b/tests/test_uk_regions.py index 56f5a5fd..49fb1eb1 100644 --- a/tests/test_uk_regions.py +++ b/tests/test_uk_regions.py @@ -68,7 +68,7 @@ def test__given_uk_registry__then_has_national_region(self): assert national.region_type == "national" assert ( national.dataset_path - == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.40.4" + == "hf://policyengine/policyengine-uk-data-private/enhanced_frs_2023_24.h5@1.55.5" ) assert not national.requires_filter diff --git a/uv.lock b/uv.lock index 43a2498b..2babaddf 100644 --- a/uv.lock +++ b/uv.lock @@ -839,7 +839,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7d/ed/6bfa4109fcb23a58819600392564fea69cdc6551ffd5e69ccf1d52a40cbc/greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c", size = 271061, upload-time = "2025-08-07T13:17:15.373Z" }, { url = "https://files.pythonhosted.org/packages/2a/fc/102ec1a2fc015b3a7652abab7acf3541d58c04d3d17a8d3d6a44adae1eb1/greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590", size = 629475, upload-time = "2025-08-07T13:42:54.009Z" }, { url = "https://files.pythonhosted.org/packages/c5/26/80383131d55a4ac0fb08d71660fd77e7660b9db6bdb4e8884f46d9f2cc04/greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c", size = 640802, upload-time = "2025-08-07T13:45:25.52Z" }, - { url = "https://files.pythonhosted.org/packages/9f/7c/e7833dbcd8f376f3326bd728c845d31dcde4c84268d3921afcae77d90d08/greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b", size = 636703, upload-time = "2025-08-07T13:53:12.622Z" }, { url = "https://files.pythonhosted.org/packages/e9/49/547b93b7c0428ede7b3f309bc965986874759f7d89e4e04aeddbc9699acb/greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31", size = 635417, upload-time = "2025-08-07T13:18:25.189Z" }, { url = "https://files.pythonhosted.org/packages/7f/91/ae2eb6b7979e2f9b035a9f612cf70f1bf54aad4e1d125129bef1eae96f19/greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d", size = 584358, upload-time = "2025-08-07T13:18:23.708Z" }, { url = "https://files.pythonhosted.org/packages/f7/85/433de0c9c0252b22b16d413c9407e6cb3b41df7389afc366ca204dbc1393/greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5", size = 1113550, upload-time = "2025-08-07T13:42:37.467Z" }, @@ -850,7 +849,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/de/f28ced0a67749cac23fecb02b694f6473f47686dff6afaa211d186e2ef9c/greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2", size = 272305, upload-time = "2025-08-07T13:15:41.288Z" }, { url = "https://files.pythonhosted.org/packages/09/16/2c3792cba130000bf2a31c5272999113f4764fd9d874fb257ff588ac779a/greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246", size = 632472, upload-time = "2025-08-07T13:42:55.044Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/95d48d7e3d433e6dae5b1682e4292242a53f22df82e6d3dda81b1701a960/greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3", size = 644646, upload-time = "2025-08-07T13:45:26.523Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5e/405965351aef8c76b8ef7ad370e5da58d57ef6068df197548b015464001a/greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633", size = 640519, upload-time = "2025-08-07T13:53:13.928Z" }, { url = "https://files.pythonhosted.org/packages/25/5d/382753b52006ce0218297ec1b628e048c4e64b155379331f25a7316eb749/greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079", size = 639707, upload-time = "2025-08-07T13:18:27.146Z" }, { url = "https://files.pythonhosted.org/packages/1f/8e/abdd3f14d735b2929290a018ecf133c901be4874b858dd1c604b9319f064/greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8", size = 587684, upload-time = "2025-08-07T13:18:25.164Z" }, { url = "https://files.pythonhosted.org/packages/5d/65/deb2a69c3e5996439b0176f6651e0052542bb6c8f8ec2e3fba97c9768805/greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52", size = 1116647, upload-time = "2025-08-07T13:42:38.655Z" }, @@ -861,7 +859,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/44/69/9b804adb5fd0671f367781560eb5eb586c4d495277c93bde4307b9e28068/greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd", size = 274079, upload-time = "2025-08-07T13:15:45.033Z" }, { url = "https://files.pythonhosted.org/packages/46/e9/d2a80c99f19a153eff70bc451ab78615583b8dac0754cfb942223d2c1a0d/greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb", size = 640997, upload-time = "2025-08-07T13:42:56.234Z" }, { url = "https://files.pythonhosted.org/packages/3b/16/035dcfcc48715ccd345f3a93183267167cdd162ad123cd93067d86f27ce4/greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968", size = 655185, upload-time = "2025-08-07T13:45:27.624Z" }, - { url = "https://files.pythonhosted.org/packages/31/da/0386695eef69ffae1ad726881571dfe28b41970173947e7c558d9998de0f/greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9", size = 649926, upload-time = "2025-08-07T13:53:15.251Z" }, { url = "https://files.pythonhosted.org/packages/68/88/69bf19fd4dc19981928ceacbc5fd4bb6bc2215d53199e367832e98d1d8fe/greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6", size = 651839, upload-time = "2025-08-07T13:18:30.281Z" }, { url = "https://files.pythonhosted.org/packages/19/0d/6660d55f7373b2ff8152401a83e02084956da23ae58cddbfb0b330978fe9/greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0", size = 607586, upload-time = "2025-08-07T13:18:28.544Z" }, { url = "https://files.pythonhosted.org/packages/8e/1a/c953fdedd22d81ee4629afbb38d2f9d71e37d23caace44775a3a969147d4/greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0", size = 1123281, upload-time = "2025-08-07T13:42:39.858Z" }, @@ -872,7 +869,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/49/e8/58c7f85958bda41dafea50497cbd59738c5c43dbbea5ee83d651234398f4/greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31", size = 272814, upload-time = "2025-08-07T13:15:50.011Z" }, { url = "https://files.pythonhosted.org/packages/62/dd/b9f59862e9e257a16e4e610480cfffd29e3fae018a68c2332090b53aac3d/greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945", size = 641073, upload-time = "2025-08-07T13:42:57.23Z" }, { url = "https://files.pythonhosted.org/packages/f7/0b/bc13f787394920b23073ca3b6c4a7a21396301ed75a655bcb47196b50e6e/greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc", size = 655191, upload-time = "2025-08-07T13:45:29.752Z" }, - { url = "https://files.pythonhosted.org/packages/f2/d6/6adde57d1345a8d0f14d31e4ab9c23cfe8e2cd39c3baf7674b4b0338d266/greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a", size = 649516, upload-time = "2025-08-07T13:53:16.314Z" }, { url = "https://files.pythonhosted.org/packages/7f/3b/3a3328a788d4a473889a2d403199932be55b1b0060f4ddd96ee7cdfcad10/greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504", size = 652169, upload-time = "2025-08-07T13:18:32.861Z" }, { url = "https://files.pythonhosted.org/packages/ee/43/3cecdc0349359e1a527cbf2e3e28e5f8f06d3343aaf82ca13437a9aa290f/greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671", size = 610497, upload-time = "2025-08-07T13:18:31.636Z" }, { url = "https://files.pythonhosted.org/packages/b8/19/06b6cf5d604e2c382a6f31cafafd6f33d5dea706f4db7bdab184bad2b21d/greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b", size = 1121662, upload-time = "2025-08-07T13:42:41.117Z" }, @@ -883,7 +879,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/5c/85273fd7cc388285632b0498dbbab97596e04b154933dfe0f3e68156c68c/greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0", size = 273586, upload-time = "2025-08-07T13:16:08.004Z" }, { url = "https://files.pythonhosted.org/packages/d1/75/10aeeaa3da9332c2e761e4c50d4c3556c21113ee3f0afa2cf5769946f7a3/greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f", size = 686346, upload-time = "2025-08-07T13:42:59.944Z" }, { url = "https://files.pythonhosted.org/packages/c0/aa/687d6b12ffb505a4447567d1f3abea23bd20e73a5bed63871178e0831b7a/greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5", size = 699218, upload-time = "2025-08-07T13:45:30.969Z" }, - { url = "https://files.pythonhosted.org/packages/dc/8b/29aae55436521f1d6f8ff4e12fb676f3400de7fcf27fccd1d4d17fd8fecd/greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1", size = 694659, upload-time = "2025-08-07T13:53:17.759Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/ea25914b1ebfde93b6fc4ff46d6864564fba59024e928bdc7de475affc25/greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735", size = 695355, upload-time = "2025-08-07T13:18:34.517Z" }, { url = "https://files.pythonhosted.org/packages/72/60/fc56c62046ec17f6b0d3060564562c64c862948c9d4bc8aa807cf5bd74f4/greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337", size = 657512, upload-time = "2025-08-07T13:18:33.969Z" }, { url = "https://files.pythonhosted.org/packages/23/6e/74407aed965a4ab6ddd93a7ded3180b730d281c77b765788419484cdfeef/greenlet-3.2.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2917bdf657f5859fbf3386b12d68ede4cf1f04c90c3a6bc1f013dd68a22e2269", size = 1612508, upload-time = "2025-11-04T12:42:23.427Z" }, @@ -892,7 +887,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f7/c0/93885c4106d2626bf51fdec377d6aef740dfa5c4877461889a7cf8e565cc/greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c", size = 269859, upload-time = "2025-08-07T13:16:16.003Z" }, { url = "https://files.pythonhosted.org/packages/4d/f5/33f05dc3ba10a02dedb1485870cf81c109227d3d3aa280f0e48486cac248/greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d", size = 627610, upload-time = "2025-08-07T13:43:01.345Z" }, { url = "https://files.pythonhosted.org/packages/b2/a7/9476decef51a0844195f99ed5dc611d212e9b3515512ecdf7321543a7225/greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58", size = 639417, upload-time = "2025-08-07T13:45:32.094Z" }, - { url = "https://files.pythonhosted.org/packages/bd/e0/849b9159cbb176f8c0af5caaff1faffdece7a8417fcc6fe1869770e33e21/greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4", size = 634751, upload-time = "2025-08-07T13:53:18.848Z" }, { url = "https://files.pythonhosted.org/packages/5f/d3/844e714a9bbd39034144dca8b658dcd01839b72bb0ec7d8014e33e3705f0/greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433", size = 634020, upload-time = "2025-08-07T13:18:36.841Z" }, { url = "https://files.pythonhosted.org/packages/6b/4c/f3de2a8de0e840ecb0253ad0dc7e2bb3747348e798ec7e397d783a3cb380/greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df", size = 582817, upload-time = "2025-08-07T13:18:35.48Z" }, { url = "https://files.pythonhosted.org/packages/89/80/7332915adc766035c8980b161c2e5d50b2f941f453af232c164cff5e0aeb/greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594", size = 1111985, upload-time = "2025-08-07T13:42:42.425Z" }, @@ -2481,11 +2475,11 @@ requires-dist = [ { name = "pandas", specifier = ">=2.0.0" }, { name = "plotly", marker = "extra == 'dev'", specifier = ">=5.0.0" }, { name = "plotly", marker = "extra == 'plotting'", specifier = ">=5.0.0" }, - { name = "policyengine-core", marker = "extra == 'dev'", specifier = ">=3.25.0" }, - { name = "policyengine-core", marker = "extra == 'uk'", specifier = ">=3.25.0" }, - { name = "policyengine-core", marker = "extra == 'us'", specifier = ">=3.25.0" }, - { name = "policyengine-uk", marker = "extra == 'dev'", specifier = "==2.88.0" }, - { name = "policyengine-uk", marker = "extra == 'uk'", specifier = "==2.88.0" }, + { name = "policyengine-core", marker = "extra == 'dev'", specifier = ">=3.26.0" }, + { name = "policyengine-core", marker = "extra == 'uk'", specifier = ">=3.26.0" }, + { name = "policyengine-core", marker = "extra == 'us'", specifier = ">=3.26.0" }, + { name = "policyengine-uk", marker = "extra == 'dev'", specifier = "==2.88.14" }, + { name = "policyengine-uk", marker = "extra == 'uk'", specifier = "==2.88.14" }, { name = "policyengine-us", marker = "extra == 'dev'", specifier = "==1.687.0" }, { name = "policyengine-us", marker = "extra == 'us'", specifier = "==1.687.0" }, { name = "psutil", specifier = ">=5.9.0" }, @@ -2533,7 +2527,7 @@ wheels = [ [[package]] name = "policyengine-uk" -version = "2.88.0" +version = "2.88.14" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "microdf-python" }, @@ -2543,9 +2537,9 @@ dependencies = [ { name = "tables", version = "3.10.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, { name = "tables", version = "3.11.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/cf/749dea25c17210b5dc40098363e0b6a60b7fc5feb69ff77c74b88deb5cde/policyengine_uk-2.88.0.tar.gz", hash = "sha256:d157c7336b7aa3a321f317af1a4f111d7b857451ff43f4998abdc5a8c893e989", size = 1166666, upload-time = "2026-04-17T19:22:55.418Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/2b/ab82aa30c5d27176fd9d449ff5ed9708d0080b00912f7dc2efa0af0fd87e/policyengine_uk-2.88.14.tar.gz", hash = "sha256:21a4387ae52dcb5430b6d790edcc321816ed47147a3a0e21ffd482a36834d352", size = 1185947, upload-time = "2026-05-09T04:19:25.284Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/7e/8a2a42eac1da63730a865964aa17e7fd4420ce4db4c80001c1b5ca6011e8/policyengine_uk-2.88.0-py3-none-any.whl", hash = "sha256:46a3ba443b43ec810c5efaccd4645edb63c8dc90ef5acf9b0cdf5ace86b9334d", size = 1867764, upload-time = "2026-04-17T19:22:53.244Z" }, + { url = "https://files.pythonhosted.org/packages/a3/fc/276fb639a46bda35523329d8968bcc4089fde9e97fab82722c0ec853c6cc/policyengine_uk-2.88.14-py3-none-any.whl", hash = "sha256:ed10005ba7d0c973c0966ebbf7672853fb3caaa0456b8bf485fb13f8c323d975", size = 1913671, upload-time = "2026-05-09T04:19:23.364Z" }, ] [[package]] From 706b9c7043bc7f5d6e819a57f0e6be998e5913a4 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Sat, 9 May 2026 02:01:16 -0400 Subject: [PATCH 2/2] Pin US data release manifest commit --- .../data/release_manifests/us.json | 4 +- src/policyengine/provenance/manifest.py | 4 +- tests/test_release_manifests.py | 41 +++++++++++++++---- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/policyengine/data/release_manifests/us.json b/src/policyengine/data/release_manifests/us.json index 65457594..e938811f 100644 --- a/src/policyengine/data/release_manifests/us.json +++ b/src/policyengine/data/release_manifests/us.json @@ -12,7 +12,9 @@ "data_package": { "name": "policyengine-us-data", "version": "1.78.2", - "repo_id": "policyengine/policyengine-us-data" + "repo_id": "policyengine/policyengine-us-data", + "release_manifest_path": "releases/1.78.2/release_manifest.json", + "release_manifest_revision": "2f1ea16b152cd9db4a4d2f1aad4d42e7484d5999" }, "certified_data_artifact": { "data_package": { diff --git a/src/policyengine/provenance/manifest.py b/src/policyengine/provenance/manifest.py index 32120920..e2e2b343 100644 --- a/src/policyengine/provenance/manifest.py +++ b/src/policyengine/provenance/manifest.py @@ -31,6 +31,7 @@ class DataPackageVersion(PackageVersion): repo_id: str repo_type: str = "model" release_manifest_path: str = "release_manifest.json" + release_manifest_revision: Optional[str] = None class CompatibleModelPackage(BaseModel): @@ -178,9 +179,10 @@ def https_dataset_uri(repo_id: str, path_in_repo: str, revision: str) -> str: def https_release_manifest_uri(data_package: "DataPackageVersion") -> str: """Return a dereferenceable HTTPS URI for a data release manifest.""" + revision = data_package.release_manifest_revision or data_package.version return ( f"https://huggingface.co/{data_package.repo_id}/resolve/" - f"{data_package.version}/{data_package.release_manifest_path}" + f"{revision}/{data_package.release_manifest_path}" ) diff --git a/tests/test_release_manifests.py b/tests/test_release_manifests.py index 613444ff..a6df40c5 100644 --- a/tests/test_release_manifests.py +++ b/tests/test_release_manifests.py @@ -19,6 +19,7 @@ dataset_logical_name, get_data_release_manifest, get_release_manifest, + https_release_manifest_uri, resolve_dataset_reference, resolve_managed_dataset_reference, ) @@ -65,6 +66,14 @@ def test__given_us_manifest__then_has_pinned_model_and_data_packages(self): assert manifest.data_package.name == "policyengine-us-data" assert manifest.data_package.version == "1.78.2" assert manifest.data_package.repo_id == "policyengine/policyengine-us-data" + assert ( + manifest.data_package.release_manifest_path + == "releases/1.78.2/release_manifest.json" + ) + assert ( + manifest.data_package.release_manifest_revision + == "2f1ea16b152cd9db4a4d2f1aad4d42e7484d5999" + ) assert manifest.certified_data_artifact is not None assert ( manifest.certified_data_artifact.build_id == "policyengine-us-data-1.78.2" @@ -166,20 +175,20 @@ def test__given_country__then_can_fetch_data_release_manifest(self): "schema_version": 1, "data_package": { "name": "policyengine-us-data", - "version": "1.73.0", + "version": "1.78.2", }, "build": { - "build_id": "policyengine-us-data-1.73.0", + "build_id": "policyengine-us-data-1.78.2", "built_at": "2026-04-10T12:00:00Z", "built_with_model_package": { "name": "policyengine-us", - "version": "1.602.0", + "version": "1.687.0", "git_sha": "deadbeef", "data_build_fingerprint": "sha256:fingerprint", }, }, "compatible_model_packages": [ - {"name": "policyengine-us", "specifier": "==1.602.0"} + {"name": "policyengine-us", "specifier": "==1.687.0"} ], "default_datasets": {"national": "enhanced_cps_2024"}, "artifacts": { @@ -187,7 +196,7 @@ def test__given_country__then_can_fetch_data_release_manifest(self): "kind": "microdata", "path": "enhanced_cps_2024.h5", "repo_id": "policyengine/policyengine-us-data", - "revision": "1.73.0", + "revision": "1.78.2", "sha256": "abc", "size_bytes": 123, } @@ -204,15 +213,29 @@ def test__given_country__then_can_fetch_data_release_manifest(self): assert manifest.data_package.name == "policyengine-us-data" assert manifest.default_datasets["national"] == "enhanced_cps_2024" assert manifest.build is not None - assert manifest.build.build_id == "policyengine-us-data-1.73.0" + assert manifest.build.build_id == "policyengine-us-data-1.78.2" assert manifest.build.built_at == "2026-04-10T12:00:00Z" assert manifest.build.built_with_model_package is not None - assert manifest.build.built_with_model_package.version == "1.602.0" + assert manifest.build.built_with_model_package.version == "1.687.0" assert ( manifest.artifacts["enhanced_cps_2024"].uri - == "hf://policyengine/policyengine-us-data/enhanced_cps_2024.h5@1.73.0" + == "hf://policyengine/policyengine-us-data/enhanced_cps_2024.h5@1.78.2" + ) + mock_get.assert_called_once() + assert mock_get.call_args.args[0] == ( + "https://huggingface.co/policyengine/policyengine-us-data/resolve/" + "2f1ea16b152cd9db4a4d2f1aad4d42e7484d5999/" + "releases/1.78.2/release_manifest.json" + ) + + def test__given_explicit_manifest_revision__then_builds_manifest_url(self): + manifest = get_release_manifest("us") + + assert https_release_manifest_uri(manifest.data_package) == ( + "https://huggingface.co/policyengine/policyengine-us-data/resolve/" + "2f1ea16b152cd9db4a4d2f1aad4d42e7484d5999/" + "releases/1.78.2/release_manifest.json" ) - assert mock_get.call_count == 1 def test__given_missing_data_release_manifest__then_fetch_raises_unavailable(self): get_data_release_manifest.cache_clear()