policyengine 6.2.0__tar.gz → 6.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/workflows/draft-pdf.yml +4 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/workflows/pr_code_changes.yaml +19 -11
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/workflows/pr_docs_changes.yaml +4 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/workflows/push.yaml +1 -1
- {policyengine-6.2.0 → policyengine-6.2.1}/CHANGELOG.md +12 -0
- {policyengine-6.2.0/src/policyengine.egg-info → policyengine-6.2.1}/PKG-INFO +5 -5
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/households.md +1 -1
- {policyengine-6.2.0 → policyengine-6.2.1}/pyproject.toml +5 -5
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/data/bundle/manifest.json +12 -12
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/data/bundle/uk.trace.tro.jsonld +5 -5
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/data/bundle/us.trace.tro.jsonld +5 -5
- {policyengine-6.2.0 → policyengine-6.2.1/src/policyengine.egg-info}/PKG-INFO +5 -5
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine.egg-info/requires.txt +4 -4
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_release_tro_generation.py +30 -5
- {policyengine-6.2.0 → policyengine-6.2.1}/uv.lock +15 -14
- {policyengine-6.2.0 → policyengine-6.2.1}/.claude/policyengine-guide.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.claude/quick-reference.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/CONTRIBUTING.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/bump_version.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/capture-version.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/changelog_template.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/check-changelog.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/copilot-instructions.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/dispatch-policyengine-release.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/fetch_version.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/get-changelog-diff.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/has-functional-changes.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/is-version-number-acceptable.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/publish-git-tag.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.github/wait-for-pypi.sh +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.gitignore +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/.python-version +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/AGENTS.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/CITATION.cff +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/CLAUDE.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/CODE_OF_CONDUCT.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/CONTRIBUTING.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/LICENSE +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/Makefile +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/README.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/architecture.png +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/architecture.svg +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/changelog.d/.gitkeep +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/.gitignore +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/_generator/README.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/_generator/build_reference.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/_quarto.yml +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/bundles.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/countries.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/data-publishing-design.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/decile-impact-spec.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/dev.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/engineering/runbooks/build-m-us-populace-certification.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/engineering/runbooks/canonical-spm-development.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/engineering/skills/README.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/engineering/skills/data-certification.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/engineering/skills/github-prs.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/engineering/skills/repository-guidance.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/examples.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/getting-started.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/impact-analysis.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/index.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/methodology/index.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/methodology/model-architecture.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/methodology/us-health-costs.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/microsim.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/outputs.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/programs/index.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/programs/us-chip.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/reference/index.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/reforms.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/regions.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/release-bundles.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/run-records.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/trace-case-study.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/docs/visualisation.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/belgium_axiom_pilot.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/employment_income_variation_uk.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/employment_income_variation_us.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/household_impact_example.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/income_bands_uk.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/income_distribution_us.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/paper_repro_uk.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/policy_change_uk.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/speedtest_us_simulation.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/examples/us_budgetary_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/paper-preview.html +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/paper.bib +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/paper.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/bundle.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/certify_data_release.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/check_data_staleness.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/check_native_spm_loading.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/check_release_credentials.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/export_bundle_release_assets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/generate_bundle_artifacts.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/generate_trace_tros.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/prepare_package_bundle_update.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/release_lock.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/scripts/spm_bundle.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/setup.cfg +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/bundle.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/cli.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/cache.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/dataset.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/dynamic.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/output.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/parameter.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/parameter_node.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/parameter_value.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/policy.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/region.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/run_record.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/scoping_strategy.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/simulation.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/spm.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/tax_benefit_model.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/tax_benefit_model_version.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/core/variable.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/uk/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/uk/regions.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/us/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/us/data/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/us/data/districts.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/us/data/places.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/us/data/states.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/countries/us/regions.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/data/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/data/schemas/trace_tro.schema.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/data/uk_geography_assets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/derivations/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/derivations/narrate.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/derivations/trace.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/graph/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/graph/extractor.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/graph/graph.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/aggregate.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/change_aggregate.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/cliff_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/congressional_district_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/constituency_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/decile_analysis.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/decile_grouping.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/decile_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/extra_variables.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/inequality.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/intra_decile_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/labor_supply_response.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/local_authority_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/poverty.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/program_statistics.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/uk_geography_assets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/outputs/uk_geography_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/bundle_validation.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/certification.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/dataset_materialization.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/manifest.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/pyproject_pins.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/spm_configuration.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/trace.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/verify.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/provenance/zenodo.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/results/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/results/schema.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/results/trace_tro.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/results/tracking.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/be/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/be/datasets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/be/model.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/axes.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/extra_variables.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/household.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/model_version.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/reform.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/common/result.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/uk/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/uk/analysis.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/uk/datasets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/uk/household.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/uk/model.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/analysis.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/datasets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/household.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/legacy_inputs.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/model.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/tax_benefit_models/us/spm.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/dates.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/design.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/entity_utils.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/errors.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/hashing.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/household_validation.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/parameter_labels.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/parametric_reforms.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine/utils/plotting.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine.egg-info/SOURCES.txt +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine.egg-info/dependency_links.txt +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine.egg-info/entry_points.txt +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/src/policyengine.egg-info/top_level.txt +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/conftest.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/filtering_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/uk_couple_two_kids.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/uk_model_surface.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/uk_single_adult_employment_income.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/uk_single_adult_no_income.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/uk_single_parent_one_child.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/us_married_two_kids_high_income.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/us_model_surface.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/us_single_adult_employment_income.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/us_single_adult_no_income.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/household_calculator_snapshots/us_single_parent_one_child.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/parameter_labels_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/parametric_reforms_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/poverty_by_demographics_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/region_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/release_tros/README.md +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/release_tros/country-models.lock.toml +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/release_tros/manifest.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/release_tros/us-release_manifest.json +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/release_tros/us.trace.tro.jsonld +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/spm_development.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/us_reform_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/fixtures/variable_label_fixtures.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_aggregate.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_be_axiom_pilot.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_budgetary_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_bump_version.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_bundle.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_bundle_metadata.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_cache.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_certify_data_release.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_change_aggregate.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_cliff_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_cliff_impact_analysis.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_congressional_district_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_constituency_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_dataset_materialization.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_dataset_persistence.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_dataset_runtime.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_dataset_source.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_decile_grouping.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_derivations.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_dict_reforms_on_simulation.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_entity_mapping.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_entity_utils.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_entity_utils_characterization.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_errors.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_extra_variables.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_filtering.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_generate_trace_tros.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_graph/__init__.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_graph/conftest.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_graph/test_extractor.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_household_calculator_snapshot.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_household_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_inequality.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_intra_decile_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_labor_supply_response.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_local_authority_impact.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_manifest_version_mismatch.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_models.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_pandas3_compatibility.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_parameter_labels.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_parameter_nodes.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_parameter_values.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_parametric_reforms.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_poverty.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_poverty_by_demographics.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_poverty_run.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_preservation_mirror.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_program_statistics.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_pyproject_pins.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_region.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_region_group_strategy.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_release_credentials.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_release_lock.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_release_manifests.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_results.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_run_record.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_scoping_strategy.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_small_follow_ups.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_bundle_bootstrap.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_bundle_tooling.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_decile.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_development_authentication.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_household.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_model.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_selection.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_spm_selection_schema.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_trace_tro.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_trace_tro_verify.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_uk_analysis.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_uk_geography_assets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_uk_program_statistics.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_uk_regions.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_legacy_inputs.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_legacy_inputs_integration.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_long_term_datasets.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_microsim_structural_reforms.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_native_alignment.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_native_hdf_weights.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_program_statistics.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_reform_application.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_us_regions.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_variable_labels.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_variable_metadata.py +0 -0
- {policyengine-6.2.0 → policyengine-6.2.1}/tests/test_zenodo_mirror.py +0 -0
|
@@ -10,6 +10,10 @@ on:
|
|
|
10
10
|
- paper.bib
|
|
11
11
|
- architecture.png
|
|
12
12
|
|
|
13
|
+
concurrency:
|
|
14
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
|
15
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
16
|
+
|
|
13
17
|
jobs:
|
|
14
18
|
paper:
|
|
15
19
|
runs-on: ubuntu-latest
|
|
@@ -14,6 +14,10 @@ on:
|
|
|
14
14
|
- src/policyengine/data/bundle/manifest.json
|
|
15
15
|
workflow_dispatch:
|
|
16
16
|
|
|
17
|
+
concurrency:
|
|
18
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
|
19
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
20
|
+
|
|
17
21
|
jobs:
|
|
18
22
|
check-changelog:
|
|
19
23
|
name: Check changelog fragment
|
|
@@ -77,7 +81,7 @@ jobs:
|
|
|
77
81
|
- name: Smoke-import core modules
|
|
78
82
|
run: python -c "import policyengine; from policyengine.core import Dataset, Policy, Simulation; from policyengine.outputs import aggregate, poverty, inequality; print('import OK')"
|
|
79
83
|
BundleVerification:
|
|
80
|
-
name: Verify bundle
|
|
84
|
+
name: Verify release inputs and bundle packages
|
|
81
85
|
# Private manifest credentials are available only to trusted repository PRs.
|
|
82
86
|
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
|
|
83
87
|
runs-on: ubuntu-latest
|
|
@@ -93,8 +97,19 @@ jobs:
|
|
|
93
97
|
uses: actions/setup-python@v6
|
|
94
98
|
with:
|
|
95
99
|
python-version: '3.13'
|
|
96
|
-
- name:
|
|
97
|
-
run:
|
|
100
|
+
- name: Install package for TRACE verification
|
|
101
|
+
run: uv pip install -e . h5py --system
|
|
102
|
+
- name: Check reviewed release inputs
|
|
103
|
+
env:
|
|
104
|
+
HUGGING_FACE_TOKEN: ${{ secrets.HUGGING_FACE_TOKEN }}
|
|
105
|
+
run: |
|
|
106
|
+
if [[ -z "${HUGGING_FACE_TOKEN:-}" ]]; then
|
|
107
|
+
echo "::error::Full private release verification requires HUGGING_FACE_TOKEN"
|
|
108
|
+
exit 1
|
|
109
|
+
fi
|
|
110
|
+
python scripts/check_release_credentials.py
|
|
111
|
+
python scripts/bundle.py check --published-spm --include-tros --strict-tros
|
|
112
|
+
python scripts/release_lock.py
|
|
98
113
|
- name: Install bundle package scaffold
|
|
99
114
|
run: |
|
|
100
115
|
uv pip install -e ".[models]" --system
|
|
@@ -117,17 +132,10 @@ jobs:
|
|
|
117
132
|
PY
|
|
118
133
|
- name: Check installed package consistency
|
|
119
134
|
run: python -m pip check
|
|
120
|
-
# Only the reviewed registry lock is a pull-request concern. The
|
|
121
|
-
# read-only credential, published-measurement and TRACE sidecar gates
|
|
122
|
-
# are release gates: the release workflow regenerates the sidecars and
|
|
123
|
-
# publishes the wheels immediately before checking them, so they cannot
|
|
124
|
-
# be satisfied from a pull request. They run in push.yaml instead.
|
|
125
|
-
- name: Check the reviewed registry lock
|
|
126
|
-
run: python scripts/release_lock.py
|
|
127
135
|
- name: Verify bundle packages
|
|
128
136
|
run: policyengine bundle verify --country us --country uk --packages-only --json
|
|
129
137
|
Test:
|
|
130
|
-
runs-on:
|
|
138
|
+
runs-on: ubuntu-latest
|
|
131
139
|
strategy:
|
|
132
140
|
fail-fast: false
|
|
133
141
|
matrix:
|
|
@@ -11,6 +11,10 @@ on:
|
|
|
11
11
|
- .github/**
|
|
12
12
|
workflow_dispatch:
|
|
13
13
|
|
|
14
|
+
concurrency:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
|
|
16
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
17
|
+
|
|
14
18
|
jobs:
|
|
15
19
|
Test:
|
|
16
20
|
runs-on: ubuntu-latest
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [6.2.1] - 2026-09-30
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
|
|
5
|
+
- Update the certified PolicyEngine bundle to PolicyEngine Core 3.32.10.
|
|
6
|
+
- Run the full Python test matrices on GitHub-hosted Ubuntu machines and cancel earlier workflow runs when a pull request receives a new commit.
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
|
|
10
|
+
- Correct the US and UK TRACE composition fingerprints after the PolicyEngine Core 3.32.10 bundle update, and run the authenticated TRACE comparison on same-repository pull requests.
|
|
11
|
+
|
|
12
|
+
|
|
1
13
|
## [6.2.0] - 2026-09-29
|
|
2
14
|
|
|
3
15
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: policyengine
|
|
3
|
-
Version: 6.2.
|
|
3
|
+
Version: 6.2.1
|
|
4
4
|
Summary: A package to conduct policy analysis using PolicyEngine tax-benefit models.
|
|
5
5
|
Author-email: PolicyEngine <hello@policyengine.org>
|
|
6
6
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
|
@@ -685,15 +685,15 @@ Requires-Dist: plotly>=5.0.0; extra == "plotting"
|
|
|
685
685
|
Provides-Extra: graph
|
|
686
686
|
Requires-Dist: networkx>=3.0; extra == "graph"
|
|
687
687
|
Provides-Extra: models
|
|
688
|
-
Requires-Dist: policyengine-core==3.32.
|
|
688
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "models"
|
|
689
689
|
Requires-Dist: policyengine-us==2.2.1; extra == "models"
|
|
690
690
|
Requires-Dist: policyengine-uk==2.102.3; extra == "models"
|
|
691
691
|
Requires-Dist: spm-calculator==1.0.0; extra == "models"
|
|
692
692
|
Provides-Extra: uk
|
|
693
|
-
Requires-Dist: policyengine-core==3.32.
|
|
693
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "uk"
|
|
694
694
|
Requires-Dist: policyengine-uk==2.102.3; extra == "uk"
|
|
695
695
|
Provides-Extra: us
|
|
696
|
-
Requires-Dist: policyengine-core==3.32.
|
|
696
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "us"
|
|
697
697
|
Requires-Dist: policyengine-us==2.2.1; extra == "us"
|
|
698
698
|
Requires-Dist: spm-calculator==1.0.0; extra == "us"
|
|
699
699
|
Provides-Extra: dev
|
|
@@ -711,7 +711,7 @@ Requires-Dist: towncrier>=24.8.0; extra == "dev"
|
|
|
711
711
|
Requires-Dist: mypy>=1.11.0; extra == "dev"
|
|
712
712
|
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
713
713
|
Requires-Dist: hypothesis>=6.100.0; extra == "dev"
|
|
714
|
-
Requires-Dist: policyengine-core==3.32.
|
|
714
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "dev"
|
|
715
715
|
Requires-Dist: policyengine-us==2.2.1; extra == "dev"
|
|
716
716
|
Requires-Dist: policyengine-uk==2.102.3; extra == "dev"
|
|
717
717
|
Requires-Dist: spm-calculator==1.0.0; extra == "dev"
|
|
@@ -106,7 +106,7 @@ separate benefit inputs; they do not override SPM measurement composition.
|
|
|
106
106
|
|
|
107
107
|
These changes require the coordinated canonical country/calculator bundle, which
|
|
108
108
|
the packaged production manifest now pins and certifies: `policyengine-us`
|
|
109
|
-
2.2.1, `policyengine-core` 3.32.
|
|
109
|
+
2.2.1, `policyengine-core` 3.32.10, `spm-calculator` 1.0.0, and the US data
|
|
110
110
|
release `populace-us-2024-spm-20260915`. Local-wheel development manifest
|
|
111
111
|
fixtures remain explicitly uncertified. The measurement receipt identifies a
|
|
112
112
|
calculation; it does not certify a population dataset or establish publication
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "policyengine"
|
|
7
|
-
version = "6.2.
|
|
7
|
+
version = "6.2.1"
|
|
8
8
|
description = "A package to conduct policy analysis using PolicyEngine tax-benefit models."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [
|
|
@@ -40,17 +40,17 @@ graph = [
|
|
|
40
40
|
"networkx>=3.0",
|
|
41
41
|
]
|
|
42
42
|
models = [
|
|
43
|
-
"policyengine-core==3.32.
|
|
43
|
+
"policyengine-core==3.32.10",
|
|
44
44
|
"policyengine-us==2.2.1",
|
|
45
45
|
"policyengine-uk==2.102.3",
|
|
46
46
|
"spm-calculator==1.0.0",
|
|
47
47
|
]
|
|
48
48
|
uk = [
|
|
49
|
-
"policyengine-core==3.32.
|
|
49
|
+
"policyengine-core==3.32.10",
|
|
50
50
|
"policyengine-uk==2.102.3",
|
|
51
51
|
]
|
|
52
52
|
us = [
|
|
53
|
-
"policyengine-core==3.32.
|
|
53
|
+
"policyengine-core==3.32.10",
|
|
54
54
|
"policyengine-us==2.2.1",
|
|
55
55
|
"spm-calculator==1.0.0",
|
|
56
56
|
]
|
|
@@ -69,7 +69,7 @@ dev = [
|
|
|
69
69
|
"mypy>=1.11.0",
|
|
70
70
|
"pytest-cov>=5.0.0",
|
|
71
71
|
"hypothesis>=6.100.0",
|
|
72
|
-
"policyengine-core==3.32.
|
|
72
|
+
"policyengine-core==3.32.10",
|
|
73
73
|
"policyengine-us==2.2.1",
|
|
74
74
|
"policyengine-uk==2.102.3",
|
|
75
75
|
"spm-calculator==1.0.0",
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"bundle_version": "6.2.
|
|
2
|
+
"bundle_version": "6.2.1",
|
|
3
3
|
"citation": {
|
|
4
4
|
"publisher": "PolicyEngine",
|
|
5
|
-
"title": "PolicyEngine bundle 6.2.
|
|
5
|
+
"title": "PolicyEngine bundle 6.2.1",
|
|
6
6
|
"type": "software-bundle",
|
|
7
|
-
"version": "6.2.
|
|
7
|
+
"version": "6.2.1"
|
|
8
8
|
},
|
|
9
9
|
"countries": {
|
|
10
10
|
"uk": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"data_releases": {
|
|
18
18
|
"uk": {
|
|
19
19
|
"build_id": "policyengine-uk-data-1.56.16",
|
|
20
|
-
"bundle_id": "uk-6.2.
|
|
20
|
+
"bundle_id": "uk-6.2.1",
|
|
21
21
|
"certification": {
|
|
22
22
|
"built_with_model_git_sha": "12a1e028afeef08d8b2d74ee03fd9de3a78b2dd3",
|
|
23
23
|
"built_with_model_version": "2.89.2",
|
|
@@ -99,7 +99,7 @@
|
|
|
99
99
|
"version": "2.102.3",
|
|
100
100
|
"wheel_url": "https://files.pythonhosted.org/packages/37/e6/e8d9069d498f1510a1380f24a78e957902d01f00b10248c146d6710d5b37/policyengine_uk-2.102.3-py3-none-any.whl"
|
|
101
101
|
},
|
|
102
|
-
"policyengine_version": "6.2.
|
|
102
|
+
"policyengine_version": "6.2.1",
|
|
103
103
|
"region_datasets": {
|
|
104
104
|
"national": {
|
|
105
105
|
"path_template": "enhanced_frs_2024_25.h5"
|
|
@@ -112,7 +112,7 @@
|
|
|
112
112
|
},
|
|
113
113
|
"us": {
|
|
114
114
|
"build_id": "populace-us-2024-spm-20260915",
|
|
115
|
-
"bundle_id": "us-6.2.
|
|
115
|
+
"bundle_id": "us-6.2.1",
|
|
116
116
|
"certification": {
|
|
117
117
|
"built_with_model_version": "2.2.1",
|
|
118
118
|
"certified_by": "policyengine.py bundle certification",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
"version": "2.2.1",
|
|
211
211
|
"wheel_url": "https://files.pythonhosted.org/packages/5e/09/86ac3968d2a18e28fce3ba1186fc21728e9f299b96a806d6f204f1e0aaed/policyengine_us-2.2.1-py3-none-any.whl"
|
|
212
212
|
},
|
|
213
|
-
"policyengine_version": "6.2.
|
|
213
|
+
"policyengine_version": "6.2.1",
|
|
214
214
|
"region_datasets": {
|
|
215
215
|
"national": {
|
|
216
216
|
"path_template": "populace_us_2024.h5"
|
|
@@ -290,17 +290,17 @@
|
|
|
290
290
|
"packages": {
|
|
291
291
|
"policyengine": {
|
|
292
292
|
"import_name": "policyengine",
|
|
293
|
-
"install_requirement": "policyengine==6.2.
|
|
293
|
+
"install_requirement": "policyengine==6.2.1",
|
|
294
294
|
"name": "policyengine",
|
|
295
295
|
"role": "bundle_carrier",
|
|
296
|
-
"version": "6.2.
|
|
296
|
+
"version": "6.2.1"
|
|
297
297
|
},
|
|
298
298
|
"policyengine-core": {
|
|
299
299
|
"import_name": "policyengine_core",
|
|
300
|
-
"install_requirement": "policyengine-core==3.32.
|
|
300
|
+
"install_requirement": "policyengine-core==3.32.10",
|
|
301
301
|
"name": "policyengine-core",
|
|
302
302
|
"role": "runtime_dependency",
|
|
303
|
-
"version": "3.32.
|
|
303
|
+
"version": "3.32.10"
|
|
304
304
|
},
|
|
305
305
|
"policyengine-uk": {
|
|
306
306
|
"country": "uk",
|
|
@@ -329,6 +329,6 @@
|
|
|
329
329
|
"wheel_url": "https://files.pythonhosted.org/packages/19/a0/c484f69a0ebf88a9b9fd0ac28176f8df66550f46714f1b0c5ec0b360824e/spm_calculator-1.0.0-py3-none-any.whl"
|
|
330
330
|
}
|
|
331
331
|
},
|
|
332
|
-
"policyengine_version": "6.2.
|
|
332
|
+
"policyengine_version": "6.2.1",
|
|
333
333
|
"schema_version": 2
|
|
334
334
|
}
|
|
@@ -18,18 +18,18 @@
|
|
|
18
18
|
"schema:url": "https://policyengine.org"
|
|
19
19
|
},
|
|
20
20
|
"schema:dateCreated": "2026-08-18T14:20:32.100961Z",
|
|
21
|
-
"schema:description": "TRACE TRO for certified runtime bundle uk-6.2.
|
|
21
|
+
"schema:description": "TRACE TRO for certified runtime bundle uk-6.2.1 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
|
|
22
22
|
"schema:name": "policyengine uk certified bundle TRO",
|
|
23
23
|
"trov:createdWith": {
|
|
24
24
|
"@type": "schema:SoftwareApplication",
|
|
25
25
|
"schema:name": "policyengine",
|
|
26
|
-
"schema:softwareVersion": "6.2.
|
|
26
|
+
"schema:softwareVersion": "6.2.1"
|
|
27
27
|
},
|
|
28
28
|
"trov:hasArrangement": [
|
|
29
29
|
{
|
|
30
30
|
"@id": "arrangement/1",
|
|
31
31
|
"@type": "trov:ArtifactArrangement",
|
|
32
|
-
"rdfs:comment": "Certified arrangement for bundle uk-6.2.
|
|
32
|
+
"rdfs:comment": "Certified arrangement for bundle uk-6.2.1.",
|
|
33
33
|
"trov:hasArtifactLocation": [
|
|
34
34
|
{
|
|
35
35
|
"@id": "arrangement/1/location/bundle_manifest",
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"@type": "trov:ResearchArtifact",
|
|
76
76
|
"schema:name": "policyengine.py bundle manifest for uk",
|
|
77
77
|
"trov:mimeType": "application/json",
|
|
78
|
-
"trov:sha256": "
|
|
78
|
+
"trov:sha256": "0b80f402511f5cec0cfbe018b7f8b42e83b54a7bdfc5c9c210a2f77bb63bd21b"
|
|
79
79
|
},
|
|
80
80
|
{
|
|
81
81
|
"@id": "composition/1/artifact/data_release_manifest",
|
|
@@ -102,7 +102,7 @@
|
|
|
102
102
|
"trov:hasFingerprint": {
|
|
103
103
|
"@id": "composition/1/fingerprint",
|
|
104
104
|
"@type": "trov:CompositionFingerprint",
|
|
105
|
-
"trov:sha256": "
|
|
105
|
+
"trov:sha256": "a318203a1ff8cf141dfe8b138902e445ae1ab7bcce6e3d714e87661a4bb6deaa"
|
|
106
106
|
}
|
|
107
107
|
},
|
|
108
108
|
"trov:hasPerformance": {
|
|
@@ -17,18 +17,18 @@
|
|
|
17
17
|
"schema:name": "PolicyEngine",
|
|
18
18
|
"schema:url": "https://policyengine.org"
|
|
19
19
|
},
|
|
20
|
-
"schema:description": "TRACE TRO for certified runtime bundle us-6.2.
|
|
20
|
+
"schema:description": "TRACE TRO for certified runtime bundle us-6.2.1 covering the bundle manifest, the certified dataset artifact, the country model wheel, and the country data release manifest when it is available.",
|
|
21
21
|
"schema:name": "policyengine us certified bundle TRO",
|
|
22
22
|
"trov:createdWith": {
|
|
23
23
|
"@type": "schema:SoftwareApplication",
|
|
24
24
|
"schema:name": "policyengine",
|
|
25
|
-
"schema:softwareVersion": "6.2.
|
|
25
|
+
"schema:softwareVersion": "6.2.1"
|
|
26
26
|
},
|
|
27
27
|
"trov:hasArrangement": [
|
|
28
28
|
{
|
|
29
29
|
"@id": "arrangement/1",
|
|
30
30
|
"@type": "trov:ArtifactArrangement",
|
|
31
|
-
"rdfs:comment": "Certified arrangement for bundle us-6.2.
|
|
31
|
+
"rdfs:comment": "Certified arrangement for bundle us-6.2.1.",
|
|
32
32
|
"trov:hasArtifactLocation": [
|
|
33
33
|
{
|
|
34
34
|
"@id": "arrangement/1/location/bundle_manifest",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
"@type": "trov:ResearchArtifact",
|
|
75
75
|
"schema:name": "policyengine.py bundle manifest for us",
|
|
76
76
|
"trov:mimeType": "application/json",
|
|
77
|
-
"trov:sha256": "
|
|
77
|
+
"trov:sha256": "0b80f402511f5cec0cfbe018b7f8b42e83b54a7bdfc5c9c210a2f77bb63bd21b"
|
|
78
78
|
},
|
|
79
79
|
{
|
|
80
80
|
"@id": "composition/1/artifact/data_release_manifest",
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"trov:hasFingerprint": {
|
|
102
102
|
"@id": "composition/1/fingerprint",
|
|
103
103
|
"@type": "trov:CompositionFingerprint",
|
|
104
|
-
"trov:sha256": "
|
|
104
|
+
"trov:sha256": "7f7f19f41f2cfd707098768565562f6509b454b48c79bcd0558dab061b5b40a6"
|
|
105
105
|
}
|
|
106
106
|
},
|
|
107
107
|
"trov:hasPerformance": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: policyengine
|
|
3
|
-
Version: 6.2.
|
|
3
|
+
Version: 6.2.1
|
|
4
4
|
Summary: A package to conduct policy analysis using PolicyEngine tax-benefit models.
|
|
5
5
|
Author-email: PolicyEngine <hello@policyengine.org>
|
|
6
6
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
|
@@ -685,15 +685,15 @@ Requires-Dist: plotly>=5.0.0; extra == "plotting"
|
|
|
685
685
|
Provides-Extra: graph
|
|
686
686
|
Requires-Dist: networkx>=3.0; extra == "graph"
|
|
687
687
|
Provides-Extra: models
|
|
688
|
-
Requires-Dist: policyengine-core==3.32.
|
|
688
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "models"
|
|
689
689
|
Requires-Dist: policyengine-us==2.2.1; extra == "models"
|
|
690
690
|
Requires-Dist: policyengine-uk==2.102.3; extra == "models"
|
|
691
691
|
Requires-Dist: spm-calculator==1.0.0; extra == "models"
|
|
692
692
|
Provides-Extra: uk
|
|
693
|
-
Requires-Dist: policyengine-core==3.32.
|
|
693
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "uk"
|
|
694
694
|
Requires-Dist: policyengine-uk==2.102.3; extra == "uk"
|
|
695
695
|
Provides-Extra: us
|
|
696
|
-
Requires-Dist: policyengine-core==3.32.
|
|
696
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "us"
|
|
697
697
|
Requires-Dist: policyengine-us==2.2.1; extra == "us"
|
|
698
698
|
Requires-Dist: spm-calculator==1.0.0; extra == "us"
|
|
699
699
|
Provides-Extra: dev
|
|
@@ -711,7 +711,7 @@ Requires-Dist: towncrier>=24.8.0; extra == "dev"
|
|
|
711
711
|
Requires-Dist: mypy>=1.11.0; extra == "dev"
|
|
712
712
|
Requires-Dist: pytest-cov>=5.0.0; extra == "dev"
|
|
713
713
|
Requires-Dist: hypothesis>=6.100.0; extra == "dev"
|
|
714
|
-
Requires-Dist: policyengine-core==3.32.
|
|
714
|
+
Requires-Dist: policyengine-core==3.32.10; extra == "dev"
|
|
715
715
|
Requires-Dist: policyengine-us==2.2.1; extra == "dev"
|
|
716
716
|
Requires-Dist: policyengine-uk==2.102.3; extra == "dev"
|
|
717
717
|
Requires-Dist: spm-calculator==1.0.0; extra == "dev"
|
|
@@ -22,7 +22,7 @@ towncrier>=24.8.0
|
|
|
22
22
|
mypy>=1.11.0
|
|
23
23
|
pytest-cov>=5.0.0
|
|
24
24
|
hypothesis>=6.100.0
|
|
25
|
-
policyengine-core==3.32.
|
|
25
|
+
policyengine-core==3.32.10
|
|
26
26
|
policyengine-us==2.2.1
|
|
27
27
|
policyengine-uk==2.102.3
|
|
28
28
|
spm-calculator==1.0.0
|
|
@@ -31,7 +31,7 @@ spm-calculator==1.0.0
|
|
|
31
31
|
networkx>=3.0
|
|
32
32
|
|
|
33
33
|
[models]
|
|
34
|
-
policyengine-core==3.32.
|
|
34
|
+
policyengine-core==3.32.10
|
|
35
35
|
policyengine-us==2.2.1
|
|
36
36
|
policyengine-uk==2.102.3
|
|
37
37
|
spm-calculator==1.0.0
|
|
@@ -40,10 +40,10 @@ spm-calculator==1.0.0
|
|
|
40
40
|
plotly>=5.0.0
|
|
41
41
|
|
|
42
42
|
[uk]
|
|
43
|
-
policyengine-core==3.32.
|
|
43
|
+
policyengine-core==3.32.10
|
|
44
44
|
policyengine-uk==2.102.3
|
|
45
45
|
|
|
46
46
|
[us]
|
|
47
|
-
policyengine-core==3.32.
|
|
47
|
+
policyengine-core==3.32.10
|
|
48
48
|
policyengine-us==2.2.1
|
|
49
49
|
spm-calculator==1.0.0
|
|
@@ -13,6 +13,7 @@ import pytest
|
|
|
13
13
|
import requests
|
|
14
14
|
|
|
15
15
|
from policyengine.provenance import manifest
|
|
16
|
+
from policyengine.provenance.trace import compute_trace_composition_fingerprint
|
|
16
17
|
|
|
17
18
|
ROOT = Path(__file__).resolve().parents[1]
|
|
18
19
|
FIXTURES = ROOT / "tests" / "fixtures" / "release_tros"
|
|
@@ -21,6 +22,27 @@ import bundle as maintenance # noqa: E402
|
|
|
21
22
|
import generate_trace_tros as generator # noqa: E402
|
|
22
23
|
|
|
23
24
|
|
|
25
|
+
@pytest.mark.parametrize("country", ["us", "uk"])
|
|
26
|
+
def test_bundled_tro_composition_fingerprint_matches_artifacts(country):
|
|
27
|
+
tro_path = (
|
|
28
|
+
ROOT
|
|
29
|
+
/ "src"
|
|
30
|
+
/ "policyengine"
|
|
31
|
+
/ "data"
|
|
32
|
+
/ "bundle"
|
|
33
|
+
/ f"{country}.trace.tro.jsonld"
|
|
34
|
+
)
|
|
35
|
+
tro = json.loads(tro_path.read_text())["@graph"][0]
|
|
36
|
+
composition = tro["trov:hasComposition"]
|
|
37
|
+
artifact_hashes = [
|
|
38
|
+
artifact["trov:sha256"] for artifact in composition["trov:hasArtifact"]
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
assert composition["trov:hasFingerprint"]["trov:sha256"] == (
|
|
42
|
+
compute_trace_composition_fingerprint(artifact_hashes)
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
|
|
24
46
|
@pytest.fixture
|
|
25
47
|
def release(monkeypatch, tmp_path):
|
|
26
48
|
package = tmp_path / "policyengine"
|
|
@@ -300,15 +322,18 @@ def test_release_workflows_gate_complete_inputs_and_lock():
|
|
|
300
322
|
assert commands.index(
|
|
301
323
|
"python scripts/check_release_credentials.py"
|
|
302
324
|
) < commands.index("check --published-spm")
|
|
303
|
-
#
|
|
304
|
-
#
|
|
305
|
-
# depend on the release workflow regenerating sidecars and publishing
|
|
306
|
-
# wheels first, so a pull request can never satisfy them.
|
|
325
|
+
# Same-repository pull requests have the read-only credential required to
|
|
326
|
+
# run the exact pre-versioning release check before merge.
|
|
307
327
|
pr_commands = "\n".join(
|
|
308
328
|
step.get("run", "") for step in pr["jobs"]["BundleVerification"]["steps"]
|
|
309
329
|
)
|
|
310
330
|
assert "python scripts/release_lock.py" in pr_commands
|
|
311
|
-
assert "--published-spm"
|
|
331
|
+
assert "check --published-spm --include-tros --strict-tros" in pr_commands
|
|
332
|
+
assert 'if [[ -z "${HUGGING_FACE_TOKEN:-}" ]]' in pr_commands
|
|
333
|
+
assert "python scripts/check_release_credentials.py" in pr_commands
|
|
334
|
+
assert pr_commands.index(
|
|
335
|
+
"python scripts/check_release_credentials.py"
|
|
336
|
+
) < pr_commands.index("check --published-spm")
|
|
312
337
|
commands = "\n".join(
|
|
313
338
|
step.get("run", "") for step in push["jobs"]["Versioning"]["steps"]
|
|
314
339
|
)
|
|
@@ -1807,7 +1807,7 @@ wheels = [
|
|
|
1807
1807
|
|
|
1808
1808
|
[[package]]
|
|
1809
1809
|
name = "policyengine"
|
|
1810
|
-
version = "6.2.
|
|
1810
|
+
version = "6.2.1"
|
|
1811
1811
|
source = { editable = "." }
|
|
1812
1812
|
dependencies = [
|
|
1813
1813
|
{ name = "h5py" },
|
|
@@ -1880,10 +1880,10 @@ requires-dist = [
|
|
|
1880
1880
|
{ name = "pandas", specifier = ">=2.0.0" },
|
|
1881
1881
|
{ name = "plotly", marker = "extra == 'dev'", specifier = ">=5.0.0" },
|
|
1882
1882
|
{ name = "plotly", marker = "extra == 'plotting'", specifier = ">=5.0.0" },
|
|
1883
|
-
{ name = "policyengine-core", marker = "extra == 'dev'", specifier = "==3.32.
|
|
1884
|
-
{ name = "policyengine-core", marker = "extra == 'models'", specifier = "==3.32.
|
|
1885
|
-
{ name = "policyengine-core", marker = "extra == 'uk'", specifier = "==3.32.
|
|
1886
|
-
{ name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.
|
|
1883
|
+
{ name = "policyengine-core", marker = "extra == 'dev'", specifier = "==3.32.10" },
|
|
1884
|
+
{ name = "policyengine-core", marker = "extra == 'models'", specifier = "==3.32.10" },
|
|
1885
|
+
{ name = "policyengine-core", marker = "extra == 'uk'", specifier = "==3.32.10" },
|
|
1886
|
+
{ name = "policyengine-core", marker = "extra == 'us'", specifier = "==3.32.10" },
|
|
1887
1887
|
{ name = "policyengine-uk", marker = "extra == 'dev'", specifier = "==2.102.3" },
|
|
1888
1888
|
{ name = "policyengine-uk", marker = "extra == 'models'", specifier = "==2.102.3" },
|
|
1889
1889
|
{ name = "policyengine-uk", marker = "extra == 'uk'", specifier = "==2.102.3" },
|
|
@@ -1907,7 +1907,7 @@ provides-extras = ["plotting", "graph", "models", "uk", "us", "dev"]
|
|
|
1907
1907
|
|
|
1908
1908
|
[[package]]
|
|
1909
1909
|
name = "policyengine-core"
|
|
1910
|
-
version = "3.32.
|
|
1910
|
+
version = "3.32.10"
|
|
1911
1911
|
source = { registry = "https://pypi.org/simple" }
|
|
1912
1912
|
dependencies = [
|
|
1913
1913
|
{ name = "dpath" },
|
|
@@ -1928,9 +1928,9 @@ dependencies = [
|
|
|
1928
1928
|
{ name = "standard-imghdr" },
|
|
1929
1929
|
{ name = "wheel" },
|
|
1930
1930
|
]
|
|
1931
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
1931
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d6/cd/9fc967c5b787baa5f9d83461773ba0982a8e22ae83c40155a7ee55edd11a/policyengine_core-3.32.10.tar.gz", hash = "sha256:0f51e8abfa8f172c69d03ba8f4304632a348fc6dca780e41021b2fd0cec04fde", size = 427479, upload-time = "2026-09-29T17:56:43.582Z" }
|
|
1932
1932
|
wheels = [
|
|
1933
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
1933
|
+
{ url = "https://files.pythonhosted.org/packages/58/50/291d73da16f39a3c4f05dffb6d40b1142fc400ec39b5a2ca7481e6fe9d90/policyengine_core-3.32.10-py3-none-any.whl", hash = "sha256:124afc555fe7c848ae8237b820fed0b6ea0ea1280e8850ad8bf356937ee10e5b", size = 247410, upload-time = "2026-09-29T17:56:42.218Z" },
|
|
1934
1934
|
]
|
|
1935
1935
|
|
|
1936
1936
|
[[package]]
|
|
@@ -2219,7 +2219,7 @@ wheels = [
|
|
|
2219
2219
|
|
|
2220
2220
|
[[package]]
|
|
2221
2221
|
name = "pytest"
|
|
2222
|
-
version = "
|
|
2222
|
+
version = "9.1.1"
|
|
2223
2223
|
source = { registry = "https://pypi.org/simple" }
|
|
2224
2224
|
dependencies = [
|
|
2225
2225
|
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
@@ -2228,21 +2228,22 @@ dependencies = [
|
|
|
2228
2228
|
{ name = "pluggy" },
|
|
2229
2229
|
{ name = "pygments" },
|
|
2230
2230
|
]
|
|
2231
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2231
|
+
sdist = { url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz", hash = "sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313", size = 1636369, upload-time = "2026-06-19T10:58:32.857Z" }
|
|
2232
2232
|
wheels = [
|
|
2233
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2233
|
+
{ url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl", hash = "sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c", size = 386536, upload-time = "2026-06-19T10:58:31.347Z" },
|
|
2234
2234
|
]
|
|
2235
2235
|
|
|
2236
2236
|
[[package]]
|
|
2237
2237
|
name = "pytest-asyncio"
|
|
2238
|
-
version = "1.
|
|
2238
|
+
version = "1.4.0"
|
|
2239
2239
|
source = { registry = "https://pypi.org/simple" }
|
|
2240
2240
|
dependencies = [
|
|
2241
2241
|
{ name = "pytest" },
|
|
2242
|
+
{ name = "typing-extensions", marker = "python_full_version < '3.13'" },
|
|
2242
2243
|
]
|
|
2243
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
2244
|
+
sdist = { url = "https://files.pythonhosted.org/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", size = 58514, upload-time = "2026-05-26T09:56:04.083Z" }
|
|
2244
2245
|
wheels = [
|
|
2245
|
-
{ url = "https://files.pythonhosted.org/packages/
|
|
2246
|
+
{ url = "https://files.pythonhosted.org/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", size = 16930, upload-time = "2026-05-26T09:56:02.576Z" },
|
|
2246
2247
|
]
|
|
2247
2248
|
|
|
2248
2249
|
[[package]]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|