policyengine-core 3.34.4__tar.gz → 3.34.5__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_core-3.34.4 → policyengine_core-3.34.5}/CHANGELOG.md +7 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/PKG-INFO +1 -1
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/pyproject.toml +1 -1
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_release_tagging.py +276 -30
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/ISSUE_TEMPLATE.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/actionlint.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/bump_version.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/changelog_template.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/get-changelog-diff.sh +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/has-functional-changes.sh +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/is-version-number-acceptable.sh +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/publish-git-tag.sh +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/requirements/legacy-country-smoke.txt +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/workflows/pr.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/workflows/push.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.gitignore +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/.python-version +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/AGENTS.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/CLAUDE.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/CONTRIBUTING.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/LICENSE +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/MANIFEST.in +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/Makefile +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/README.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/_build/logs/myst.build.json +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/changelog.d/.gitkeep +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/_config.yml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/_static/style.css +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/_toc.yml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/add_plotly_to_book.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/contributing/intro.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/engineering/skills/README.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/engineering/skills/documentation_review.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/engineering/skills/github-prs.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/engineering/skills/testing.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/intro.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/logo.png +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/commons.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/country_template.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/data.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/data_storage.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/entities.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/enums.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/errors.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/experimental.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/extension_template.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/holders.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/parameters.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/periods.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/populations.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/projectors.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/reforms.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/scripts.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/simulations.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/taxbenefitsystems.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/taxscales.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/tools.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/tracers.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/types.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/variables.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/python_api/warnings.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/usage/branches.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/usage/country.ipynb +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/usage/datasets.ipynb +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/usage/parameters.md +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/usage/reforms.ipynb +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/docs/usage/simulation.ipynb +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/mypy.ini +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/build_metadata.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/charts/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/charts/bar.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/charts/formatting.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/commons/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/commons/formulas.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/commons/misc.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/commons/rates.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/constants.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/data/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/data/datasets/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/data/datasets/country_template_dataset.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/entities.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/modelled_policies.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/benefits/basic_income.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/benefits/housing_allowance.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/benefits/index.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/benefits/parenting_allowance/amount.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/benefits/parenting_allowance/income_threshold.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/general/age_of_majority.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/general/age_of_retirement.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/taxes/housing_tax.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/taxes/income_tax_rate.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/parameters/taxes/social_security_contribution.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/reforms/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/reforms/add_dynamic_variable.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/reforms/add_new_tax.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/reforms/flat_social_security_contribution.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/reforms/modify_social_security_taxation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/reforms/removal_basic_income.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/situation_examples/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/situation_examples/couple.json +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/situation_examples/housing.json +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/situation_examples/single.json +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/age.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/basic_income.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/disposable_income.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/housing_allowance.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/housing_tax.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/income_tax.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/reforms/add_dynamic_variable.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/reforms/add_new_tax.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/reforms/modify_social_security_taxation.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/situations/income_tax.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/situations/parenting_allowance.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/social_security_contribution.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/tests/test_microsimulation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/benefits.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/demographics.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/housing.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/ids.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/income.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/stats.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/variables/taxes.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data/dataset.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_storage/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_storage/in_memory_storage.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_storage/on_disk_storage.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_storage/storage_directory.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_storage/store_history.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_structures/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_structures/parameter_metadata.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_structures/parameter_node_metadata.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_structures/reference.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/data_structures/unit.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/entities/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/entities/entity.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/entities/group_entity.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/entities/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/entities/role.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/enums/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/enums/config.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/enums/enum.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/enums/enum_array.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/cycle_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/empty_argument_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/nan_creation_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/non_deterministic_formula_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/parameter_not_found_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/parameter_parsing_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/period_mismatch_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/situation_parsing_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/spiral_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/variable_name_conflict_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/errors/variable_not_found_error.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/experimental/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/experimental/memory_config.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/extension_template/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/extension_template/local_benefit.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/extension_template/parameters/local_town/child_allowance/amount.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/extension_template/parameters/local_town/child_allowance/index.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/extension_template/parameters/local_town/index.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/extension_template/tests/local_benefit.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/holders/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/holders/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/holders/holder.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/model_api.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/at_instant_like.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/config.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/operations/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/operations/get_parameter.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/operations/homogenize_parameters.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/operations/interpolate_parameters.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/operations/propagate_parameter_metadata.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/operations/uprate_parameters.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/parameter.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/parameter_at_instant.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/parameter_node.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/parameter_node_at_instant.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/parameter_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/parameter_scale_bracket.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/parameters/vectorial_parameter_node_at_instant.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/periods/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/periods/config.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/periods/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/periods/instant_.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/periods/period_.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/populations/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/populations/config.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/populations/group_population.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/populations/population.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/projectors/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/projectors/entity_to_person_projector.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/projectors/first_person_to_entity_projector.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/projectors/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/projectors/projector.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/projectors/unique_role_to_entity_projector.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/reforms/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/reforms/reform.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/assets/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/assets/index.html +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/policyengine_command.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/run_data.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/run_test.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/scripts/simulation_generator.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/individual_sim.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/microsimulation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/simulation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/simulation_builder.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/simulations/simulation_macro_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxbenefitsystems/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxbenefitsystems/tax_benefit_system.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/abstract_rate_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/abstract_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/amount_tax_scale_like.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/linear_average_rate_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/marginal_amount_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/marginal_rate_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/rate_tax_scale_like.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/single_amount_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/taxscales/tax_scale_like.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/google_cloud.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/hugging_face.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/simulation_dumper.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/test_from_situation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/test_runner.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tools/win_file_manager.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/computation_log.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/flat_trace.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/full_tracer.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/performance_log.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/simple_tracer.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/trace_node.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/tracing_parameter_node_at_instant.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/tracers/variable_graph.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/types/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/types/data_types/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/types/data_types/arrays.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/config.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/defined_for.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/formula_randomness.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/helpers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/typing.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/variables/variable.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/warnings/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/warnings/libyaml_warning.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/warnings/memory_config_warning.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/warnings/parameter_key_warning.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/warnings/tempfile_warning.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/pytest.ini +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/conftest.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/commons/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/commons/test_between_function.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/commons/test_formulas.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/commons/test_is_in_function.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/commons/test_random_seed.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/commons/test_rates.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/data/test_dataset.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/enums/test_enum.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/model_api/test_index_.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/array_type.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/duplicate_key.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/filesystem_hierarchy/empty_index_file/index.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/filesystem_hierarchy/node1/param.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/indentation.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/missing_value.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/parameter_for_unit_propagation.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/test_parameter_clone.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/test_parameter_validation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/test_propagate_units.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/test_unknown_keys.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/unexpected_key_in_parameter.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/unexpected_key_in_scale.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/unexpected_key_in_value_at_instant.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/unexpected_key_in_value_history.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/unknown_key_beside_values.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/uprating_under_metadata.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_date.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_scale.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_type_in_bracket.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_type_in_brackets.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_type_in_parameter.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_type_in_scale.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_type_in_value_history.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/wrong_value.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameter_validation/yaml_hierarchy/node1.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/operations/test_interpolation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/operations/test_nesting.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/operations/test_propagation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/operations/test_scale_threshold_uprating.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/operations/test_uprating.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/test_numpy2_structured_arrays.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/test_parameter_metadata_clone.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/test_parameter_metadata_clone_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/test_vectorial_parameter_node_copy.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters/test_vectorial_parameter_node_copy_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters_fancy_indexing/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters_fancy_indexing/bareme.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters_fancy_indexing/local_tax.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters_fancy_indexing/rate.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters_fancy_indexing/test_fancy_indexing.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/parameters_fancy_indexing/test_fancy_indexing_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/simulations/test_formula_randomness_concurrency.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_abstract_rate_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_abstract_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_linear_average_rate_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_linear_average_rate_tax_scale_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_marginal_amount_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_marginal_rate_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_rate_scale_conversion_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_rate_tax_scale_like.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_single_amount_tax_scale.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tax_scales/test_tax_scales_commons.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_apply_reform_invalidates_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_apply_reform_preserves_user_inputs.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_assert_near_precision.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_axes.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_bincount_minlength.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_helper_invalidation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_input_fixed_point.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_input_fixed_point_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_input_invalidation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_input_invalidation_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_scoped_delete_arrays.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_shared_arrays.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_branch_shared_arrays_differential.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_build_metadata.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_calculate_output.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_carry_over_order.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_carry_over_order_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_clone_invalidated_caches.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_clone_rebinding.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_clone_rebinding_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_clone_reform_baseline.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_clone_reform_baseline_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_countries.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_cycles.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_data_storage_dir.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_data_storage_dir_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_dataset_default_role.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_dataset_default_role_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_dataset_getattr.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_dataset_unknown_column_warning.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_default_simulation_count_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_disk_period_filenames.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_disk_storage_differential.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_disk_storage_ownership.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_docs_deployment.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_dump_restore.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_dump_restore_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_entities.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_eternity_subperiods.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_extensions.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_fast_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_fast_cache_contained_periods.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_fast_cache_contained_periods_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_fast_cache_guards.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_formulas.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_group_population_empty.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_group_population_reductions_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_holder_branch_fallback.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_holder_write_fast_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_holder_write_fast_cache_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_holders.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_input_tier_invalidation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_join_with_persons_identity.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_join_with_persons_identity_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_macro_cache_not_singleton.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_medium_fixes.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_microsimulation_person_accessor.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_microsimulation_weights.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_on_disk_storage_clones.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_opt_out_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_option_result_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_option_result_cache_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_option_result_input_provenance.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_own_period_input_overlapping_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_pandas3_compatibility.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_parameter_security.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_parameters.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_periods.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_projectors.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_reform_baseline_system.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_reform_parameter_isolation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_reform_period_keys.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_reforms.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_registered_input_deletion.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_rerun_fixture_isolation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_restore_input_provenance.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_restore_input_registry.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_restore_input_registry_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_set_input_helper_order.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_set_input_helper_order_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_simulation_builder.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_simulation_copy_pickle.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_simulation_copy_pickle_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_simulations.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_stable_hash_seed.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_stale_frame_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_storage_anchored_periods.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_storage_delete_branch.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_storage_input_index.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_storage_shared_index.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_storage_shared_index_differential.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_baseline_branch.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_computed_values.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_computed_values_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_deleted_inputs.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_entity_weight_totals.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_inputs_only.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_inputs_only_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_invalidates_cache.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_membership_ids.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_restore_inputs.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_sampling_period.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_sampling_period_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_structural_ids.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_subsample_weight_fallback.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_tax_benefit_system_cache_identity.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_tracers.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_tracing_parameter_isolation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_tracing_parameter_isolation_properties.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_uprating_order.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_uprating_order_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_user_input_keys.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_user_input_keys_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_user_input_keys_soundness.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_variable_code_sharing.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_variable_code_sharing_property.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/test_yaml.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tools/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tools/test_assert_near.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tools/test_google_cloud.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tools/test_hugging_face.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tools/test_runner/test_gc_pause.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/tools/test_runner/test_yaml_runner.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_adds.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_annualize.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_bounds.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_defined_for.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_formula_randomness.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_non_numeric_uprating_and_defined_for.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_subtracts.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_subtracts_sign.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_variable_clone.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_variable_formula_determinism.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_variable_uprating.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/core/variables/test_variables.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/appclient.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/branch_input_invalidation.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/branch_shared_arrays.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/carry_over.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/data_storage_dir.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/disk_storage.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/entities.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/fast_cache_contained_periods.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/option_caches.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/parameter_metadata_clones.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/set_input_helper_order.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/simulation_copy.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/simulations.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/subsample_inputs.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/taxbenefitsystems.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/tracing.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/uprated_inputs.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/uprating_order.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/variables.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/vectorial_parameter_nodes.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/__init__.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/directory/subdirectory/test_4.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/directory/test_1.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/directory/test_2.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/failing_test_absolute_error_margin.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/failing_test_relative_error_margin.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_absolute_error_margin.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_failure.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_name_filter.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_relative_error_margin.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_success.yml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_with_anchors.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_with_extension.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_with_reform.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/fixtures/yaml_tests/test_with_reform_2.yaml +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/smoke/test_country_init.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/tests/smoke/test_us.py +0 -0
- {policyengine_core-3.34.4 → policyengine_core-3.34.5}/uv.lock +0 -0
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [3.34.5] - 2026-11-03
|
|
2
|
+
|
|
3
|
+
### Changed
|
|
4
|
+
|
|
5
|
+
- The release tests now also recognise `poetry`, `flit`, `hatch`, `pdm` and `maturin publish` as PyPI uploads alongside the PyPI publish action, `twine upload` and `uv publish`, and fail if a recipe in the root `Makefile` or a step of a composite action under `.github/actions/` runs one of those commands or the action, if a workflow job calls a reusable workflow from another repository, if the push workflow's test step runs under a `shell` set on the step or in the Test job's or the workflow's `defaults.run`, if the workflow, the Test job or its test step sets `PYTEST_ADDOPTS` in `env`, or if a recipe line of `make test` or of its prerequisites has a `-` prefix.
|
|
6
|
+
|
|
7
|
+
|
|
1
8
|
## [3.34.4] - 2026-11-03
|
|
2
9
|
|
|
3
10
|
### Changed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: policyengine-core
|
|
3
|
-
Version: 3.34.
|
|
3
|
+
Version: 3.34.5
|
|
4
4
|
Summary: Core microsimulation engine enabling country-specific policy models.
|
|
5
5
|
Project-URL: Homepage, https://github.com/policyengine/policyengine-core
|
|
6
6
|
Author-email: PolicyEngine <hello@policyengine.org>
|
|
@@ -342,7 +342,13 @@ def test_publish_workflow_publishes_only_after_tests_pass():
|
|
|
342
342
|
|
|
343
343
|
|
|
344
344
|
WORKFLOWS = ROOT / ".github" / "workflows"
|
|
345
|
-
|
|
345
|
+
ACTIONS = ROOT / ".github" / "actions"
|
|
346
|
+
MAKEFILE = ROOT / "Makefile"
|
|
347
|
+
PYPI_UPLOAD_COMMAND = re.compile(
|
|
348
|
+
r"\b(twine\s+upload|(uv|poetry|flit|hatch|pdm|maturin)\s+publish)\b"
|
|
349
|
+
)
|
|
350
|
+
# A rule line such as `test: test-country-template`, but not `X := y`.
|
|
351
|
+
MAKE_RULE = re.compile(r"^([^\s:=#][^:=#]*?)\s*:(?![:=])(.*)$")
|
|
346
352
|
|
|
347
353
|
|
|
348
354
|
def uploads_to_pypi(step: dict) -> bool:
|
|
@@ -351,19 +357,107 @@ def uploads_to_pypi(step: dict) -> bool:
|
|
|
351
357
|
)
|
|
352
358
|
|
|
353
359
|
|
|
354
|
-
def
|
|
360
|
+
def load_workflows(workflows: Path) -> list[tuple[str, dict]]:
|
|
355
361
|
return [
|
|
356
|
-
(path.name,
|
|
362
|
+
(path.name, yaml.safe_load(path.read_text()))
|
|
357
363
|
for path in sorted([*workflows.glob("*.yaml"), *workflows.glob("*.yml")])
|
|
358
|
-
|
|
364
|
+
]
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
def pypi_publishing_jobs(workflows: Path) -> list[tuple[str, str]]:
|
|
368
|
+
return [
|
|
369
|
+
(file_name, name)
|
|
370
|
+
for file_name, workflow in load_workflows(workflows)
|
|
371
|
+
for name, job in (workflow.get("jobs") or {}).items()
|
|
359
372
|
if any(uploads_to_pypi(step) for step in job.get("steps", []))
|
|
360
373
|
]
|
|
361
374
|
|
|
362
375
|
|
|
376
|
+
def remote_reusable_workflow_jobs(workflows: Path) -> list[tuple[str, str]]:
|
|
377
|
+
# A job-level `uses:` that does not start with ./ calls a workflow in
|
|
378
|
+
# another repository, such as owner/repo/.github/workflows/x.yml@ref, whose
|
|
379
|
+
# steps this scan cannot read. A local reusable workflow lives in
|
|
380
|
+
# .github/workflows/ and is scanned as a file of its own.
|
|
381
|
+
return [
|
|
382
|
+
(file_name, name)
|
|
383
|
+
for file_name, workflow in load_workflows(workflows)
|
|
384
|
+
for name, job in (workflow.get("jobs") or {}).items()
|
|
385
|
+
if "uses" in job and not str(job["uses"]).startswith("./")
|
|
386
|
+
]
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
def pypi_publishing_actions(actions: Path) -> list[str]:
|
|
390
|
+
if not actions.is_dir():
|
|
391
|
+
return []
|
|
392
|
+
paths = sorted([*actions.rglob("action.yml"), *actions.rglob("action.yaml")])
|
|
393
|
+
return [
|
|
394
|
+
path.relative_to(actions).as_posix()
|
|
395
|
+
for path in paths
|
|
396
|
+
if any(
|
|
397
|
+
uploads_to_pypi(step)
|
|
398
|
+
for step in (
|
|
399
|
+
((yaml.safe_load(path.read_text()) or {}).get("runs") or {}).get(
|
|
400
|
+
"steps"
|
|
401
|
+
)
|
|
402
|
+
or []
|
|
403
|
+
)
|
|
404
|
+
)
|
|
405
|
+
]
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def make_rules(makefile: Path) -> dict[str, tuple[list[str], list[str]]]:
|
|
409
|
+
"""Each target's prerequisites and recipe lines (without the tab).
|
|
410
|
+
|
|
411
|
+
Enough for this Makefile: it has no line continuations, includes or
|
|
412
|
+
pattern rules.
|
|
413
|
+
"""
|
|
414
|
+
rules = {}
|
|
415
|
+
recipe = []
|
|
416
|
+
for line in makefile.read_text().splitlines():
|
|
417
|
+
if line.startswith("\t"):
|
|
418
|
+
recipe.append(line[1:])
|
|
419
|
+
elif rule := MAKE_RULE.match(line):
|
|
420
|
+
recipe = []
|
|
421
|
+
for target in rule.group(1).split():
|
|
422
|
+
rules[target] = (rule.group(2).split(), recipe)
|
|
423
|
+
elif line.strip():
|
|
424
|
+
recipe = []
|
|
425
|
+
return rules
|
|
426
|
+
|
|
427
|
+
|
|
428
|
+
def pypi_uploading_recipe_lines(makefile: Path) -> list[str]:
|
|
429
|
+
return [
|
|
430
|
+
f"{target}: {line}"
|
|
431
|
+
for target, (_, recipe) in make_rules(makefile).items()
|
|
432
|
+
for line in recipe
|
|
433
|
+
if PYPI_UPLOAD_COMMAND.search(line)
|
|
434
|
+
]
|
|
435
|
+
|
|
436
|
+
|
|
363
437
|
def test_only_push_publish_job_uploads_to_pypi():
|
|
364
438
|
# The checks above cover push.yaml's Publish job alone, so an upload in
|
|
365
439
|
# any other job or workflow file would reach PyPI without them.
|
|
440
|
+
# Recognises the pypa publish action, twine upload and
|
|
441
|
+
# uv/poetry/flit/hatch/pdm/maturin publish in workflow steps, local
|
|
442
|
+
# composite action steps and Makefile recipes, and rejects reusable
|
|
443
|
+
# workflows from other repositories; not uploads inside scripts or remote
|
|
444
|
+
# actions.
|
|
366
445
|
assert pypi_publishing_jobs(WORKFLOWS) == [("push.yaml", "Publish")]
|
|
446
|
+
assert remote_reusable_workflow_jobs(WORKFLOWS) == [], (
|
|
447
|
+
"a job calls a reusable workflow from another repository"
|
|
448
|
+
)
|
|
449
|
+
assert pypi_publishing_actions(ACTIONS) == [], "a composite action uploads to PyPI"
|
|
450
|
+
assert pypi_uploading_recipe_lines(MAKEFILE) == [], (
|
|
451
|
+
"a Makefile recipe uploads to PyPI"
|
|
452
|
+
)
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
def copy_workflows_with_pr_test_job_change(tmp_path: Path, change) -> None:
|
|
456
|
+
shutil.copytree(WORKFLOWS, tmp_path, dirs_exist_ok=True)
|
|
457
|
+
pr_workflow = tmp_path / "pr.yaml"
|
|
458
|
+
workflow = yaml.safe_load(pr_workflow.read_text())
|
|
459
|
+
change(workflow["jobs"])
|
|
460
|
+
pr_workflow.write_text(yaml.safe_dump(workflow))
|
|
367
461
|
|
|
368
462
|
|
|
369
463
|
@pytest.mark.parametrize(
|
|
@@ -372,16 +466,21 @@ def test_only_push_publish_job_uploads_to_pypi():
|
|
|
372
466
|
{"uses": "pypa/gh-action-pypi-publish@release/v1"},
|
|
373
467
|
{"run": "python -m twine upload dist/*"},
|
|
374
468
|
{"run": "make build\nuv publish"},
|
|
469
|
+
{"run": "poetry publish --build"},
|
|
470
|
+
{"run": "maturin publish"},
|
|
471
|
+
],
|
|
472
|
+
ids=[
|
|
473
|
+
"pypi-publish-action",
|
|
474
|
+
"twine-upload",
|
|
475
|
+
"uv-publish",
|
|
476
|
+
"poetry-publish",
|
|
477
|
+
"maturin-publish",
|
|
375
478
|
],
|
|
376
|
-
ids=["pypi-publish-action", "twine-upload", "uv-publish"],
|
|
377
479
|
)
|
|
378
480
|
def test_pypi_upload_check_finds_upload_in_another_workflow(tmp_path, upload):
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
workflow = yaml.safe_load(pr_workflow.read_text())
|
|
383
|
-
workflow["jobs"]["Test"]["steps"].append(upload)
|
|
384
|
-
pr_workflow.write_text(yaml.safe_dump(workflow))
|
|
481
|
+
copy_workflows_with_pr_test_job_change(
|
|
482
|
+
tmp_path, lambda jobs: jobs["Test"]["steps"].append(upload)
|
|
483
|
+
)
|
|
385
484
|
|
|
386
485
|
assert pypi_publishing_jobs(tmp_path) == [
|
|
387
486
|
("pr.yaml", "Test"),
|
|
@@ -389,47 +488,158 @@ def test_pypi_upload_check_finds_upload_in_another_workflow(tmp_path, upload):
|
|
|
389
488
|
]
|
|
390
489
|
|
|
391
490
|
|
|
392
|
-
def
|
|
491
|
+
def test_reusable_workflow_check_finds_only_remote_workflows(tmp_path):
|
|
492
|
+
def call_reusable_workflows(jobs: dict) -> None:
|
|
493
|
+
jobs["Remote"] = {"uses": "some-org/some-repo/.github/workflows/publish.yml@v1"}
|
|
494
|
+
jobs["Local"] = {"uses": "./.github/workflows/push.yaml"}
|
|
495
|
+
|
|
496
|
+
copy_workflows_with_pr_test_job_change(tmp_path, call_reusable_workflows)
|
|
497
|
+
|
|
498
|
+
assert remote_reusable_workflow_jobs(tmp_path) == [("pr.yaml", "Remote")]
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
@pytest.mark.parametrize("file_name", ["action.yml", "action.yaml"])
|
|
502
|
+
def test_pypi_upload_check_finds_upload_in_composite_action(tmp_path, file_name):
|
|
503
|
+
action = tmp_path / "publish" / file_name
|
|
504
|
+
action.parent.mkdir()
|
|
505
|
+
action.write_text(
|
|
506
|
+
yaml.safe_dump(
|
|
507
|
+
{
|
|
508
|
+
"name": "Publish",
|
|
509
|
+
"runs": {
|
|
510
|
+
"using": "composite",
|
|
511
|
+
"steps": [{"run": "uv publish", "shell": "bash"}],
|
|
512
|
+
},
|
|
513
|
+
}
|
|
514
|
+
)
|
|
515
|
+
)
|
|
516
|
+
|
|
517
|
+
assert pypi_publishing_actions(tmp_path) == [f"publish/{file_name}"]
|
|
518
|
+
assert pypi_publishing_actions(tmp_path / "missing") == []
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
def test_pypi_upload_check_finds_upload_in_makefile_recipe(tmp_path):
|
|
522
|
+
makefile = tmp_path / "Makefile"
|
|
523
|
+
makefile.write_text(
|
|
524
|
+
MAKEFILE.read_text().replace(
|
|
525
|
+
"build:\n\tpython -m build\n",
|
|
526
|
+
"build:\n\tpython -m build\n\ttwine upload dist/*\n",
|
|
527
|
+
)
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
assert pypi_uploading_recipe_lines(makefile) == ["build: twine upload dist/*"]
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def assert_test_job_fails_when_tests_fail(workflow: dict) -> None:
|
|
534
|
+
test_job = workflow["jobs"]["Test"]
|
|
393
535
|
steps = test_job["steps"]
|
|
394
536
|
# continue-on-error on Test or one of its steps lets the job succeed
|
|
395
537
|
# after a step fails, and Publish would then run.
|
|
396
538
|
assert not any("continue-on-error" in item for item in [test_job, *steps]), (
|
|
397
539
|
"Test continues on error"
|
|
398
540
|
)
|
|
541
|
+
# Match the command's words, so that a separate
|
|
542
|
+
# `make test-country-template` step is not taken for the test step.
|
|
399
543
|
test_step = steps[
|
|
400
|
-
only_step(
|
|
544
|
+
only_step(
|
|
545
|
+
steps,
|
|
546
|
+
lambda step: step.get("run", "").split()[:2] == ["make", "test"],
|
|
547
|
+
"test",
|
|
548
|
+
)
|
|
401
549
|
]
|
|
402
550
|
# A skipped step does not fail the job, so a condition on the step that
|
|
403
551
|
# runs the tests could let Test succeed without running them.
|
|
404
552
|
assert "if" not in test_step, "test step has a condition"
|
|
405
|
-
|
|
406
|
-
|
|
553
|
+
assert test_step["run"].strip() == "make test", (
|
|
554
|
+
"test step runs more than make test: anything after it (|| true, | tee, "
|
|
555
|
+
"|| exit 0) can hide a failure; if the command changed on purpose, update "
|
|
556
|
+
"this check to the new exact command instead of removing it"
|
|
557
|
+
)
|
|
558
|
+
# A shell template inserts the script's file name at {0}, so
|
|
559
|
+
# `bash -c true {0}` runs `true` and ignores the script. A default shell
|
|
560
|
+
# can come from the job's or the workflow's defaults.run as well as the
|
|
561
|
+
# step.
|
|
562
|
+
assert not any(
|
|
563
|
+
"shell" in item
|
|
564
|
+
for item in [
|
|
565
|
+
test_step,
|
|
566
|
+
(test_job.get("defaults") or {}).get("run") or {},
|
|
567
|
+
(workflow.get("defaults") or {}).get("run") or {},
|
|
568
|
+
]
|
|
569
|
+
), "test step sets a shell"
|
|
570
|
+
# pytest adds the options in PYTEST_ADDOPTS to its command line, so a
|
|
571
|
+
# value such as --collect-only lets make test pass without running tests.
|
|
572
|
+
assert not any(
|
|
573
|
+
"PYTEST_ADDOPTS" in (item.get("env") or {})
|
|
574
|
+
for item in [workflow, test_job, test_step]
|
|
575
|
+
), "Test sets PYTEST_ADDOPTS"
|
|
576
|
+
|
|
577
|
+
|
|
578
|
+
def assert_make_test_fails_when_tests_fail(
|
|
579
|
+
rules: dict[str, tuple[list[str], list[str]]],
|
|
580
|
+
) -> None:
|
|
581
|
+
prerequisites, _ = rules["test"]
|
|
582
|
+
# make ignores a failing recipe line whose prefix (any mix of @, + and -
|
|
583
|
+
# after the tab) includes -, so make test could pass after tests fail.
|
|
584
|
+
for target in ["test", *prerequisites]:
|
|
585
|
+
for line in rules.get(target, ([], []))[1]:
|
|
586
|
+
prefix = line[: len(line) - len(line.lstrip("@+- \t"))]
|
|
587
|
+
assert "-" not in prefix, f"make {target} ignores a failing recipe line"
|
|
407
588
|
|
|
408
589
|
|
|
409
590
|
def test_test_job_cannot_pass_with_failing_tests():
|
|
410
|
-
|
|
591
|
+
workflow = yaml.safe_load(PUSH_WORKFLOW.read_text())
|
|
411
592
|
|
|
412
|
-
assert_test_job_fails_when_tests_fail(
|
|
593
|
+
assert_test_job_fails_when_tests_fail(workflow)
|
|
594
|
+
assert_make_test_fails_when_tests_fail(make_rules(MAKEFILE))
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
def find_test_step(workflow: dict) -> dict:
|
|
598
|
+
return next(
|
|
599
|
+
step
|
|
600
|
+
for step in workflow["jobs"]["Test"]["steps"]
|
|
601
|
+
if step.get("run") == "make test"
|
|
602
|
+
)
|
|
413
603
|
|
|
414
604
|
|
|
415
|
-
def
|
|
416
|
-
|
|
605
|
+
def continue_test_job_on_error(workflow: dict) -> None:
|
|
606
|
+
workflow["jobs"]["Test"]["continue-on-error"] = True
|
|
417
607
|
|
|
418
608
|
|
|
419
|
-
def
|
|
420
|
-
|
|
609
|
+
def continue_after_test_failure(workflow: dict) -> None:
|
|
610
|
+
find_test_step(workflow)["continue-on-error"] = True
|
|
421
611
|
|
|
422
612
|
|
|
423
|
-
def
|
|
424
|
-
find_test_step(
|
|
613
|
+
def ignore_test_failure(workflow: dict) -> None:
|
|
614
|
+
find_test_step(workflow)["run"] += " || true"
|
|
425
615
|
|
|
426
616
|
|
|
427
|
-
def
|
|
428
|
-
find_test_step(
|
|
617
|
+
def skip_tests(workflow: dict) -> None:
|
|
618
|
+
find_test_step(workflow)["if"] = False
|
|
429
619
|
|
|
430
620
|
|
|
431
|
-
def
|
|
432
|
-
find_test_step(
|
|
621
|
+
def run_test_step_in_ignoring_shell(workflow: dict) -> None:
|
|
622
|
+
find_test_step(workflow)["shell"] = "bash -c true {0}"
|
|
623
|
+
|
|
624
|
+
|
|
625
|
+
def set_test_job_default_shell(workflow: dict) -> None:
|
|
626
|
+
workflow["jobs"]["Test"]["defaults"] = {"run": {"shell": "bash -c true {0}"}}
|
|
627
|
+
|
|
628
|
+
|
|
629
|
+
def set_workflow_default_shell(workflow: dict) -> None:
|
|
630
|
+
workflow["defaults"] = {"run": {"shell": "bash -c true {0}"}}
|
|
631
|
+
|
|
632
|
+
|
|
633
|
+
def collect_tests_only_in_test_step(workflow: dict) -> None:
|
|
634
|
+
find_test_step(workflow)["env"] = {"PYTEST_ADDOPTS": "--collect-only"}
|
|
635
|
+
|
|
636
|
+
|
|
637
|
+
def collect_tests_only_in_test_job(workflow: dict) -> None:
|
|
638
|
+
workflow["jobs"]["Test"]["env"] = {"PYTEST_ADDOPTS": "--collect-only"}
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
def collect_tests_only_in_workflow(workflow: dict) -> None:
|
|
642
|
+
workflow["env"] = {"PYTEST_ADDOPTS": "--collect-only"}
|
|
433
643
|
|
|
434
644
|
|
|
435
645
|
@pytest.mark.parametrize(
|
|
@@ -441,12 +651,48 @@ def skip_tests(test_job: dict) -> None:
|
|
|
441
651
|
(continue_after_test_failure, "Test continues on error"),
|
|
442
652
|
(ignore_test_failure, "test step runs more than make test"),
|
|
443
653
|
(skip_tests, "test step has a condition"),
|
|
654
|
+
(run_test_step_in_ignoring_shell, "test step sets a shell"),
|
|
655
|
+
(set_test_job_default_shell, "test step sets a shell"),
|
|
656
|
+
(set_workflow_default_shell, "test step sets a shell"),
|
|
657
|
+
(collect_tests_only_in_test_step, "Test sets PYTEST_ADDOPTS"),
|
|
658
|
+
(collect_tests_only_in_test_job, "Test sets PYTEST_ADDOPTS"),
|
|
659
|
+
(collect_tests_only_in_workflow, "Test sets PYTEST_ADDOPTS"),
|
|
444
660
|
]
|
|
445
661
|
],
|
|
446
662
|
)
|
|
447
663
|
def test_test_job_check_rejects_masked_test_failure(mutate, violation):
|
|
448
|
-
|
|
449
|
-
mutate(
|
|
664
|
+
workflow = yaml.safe_load(PUSH_WORKFLOW.read_text())
|
|
665
|
+
mutate(workflow)
|
|
450
666
|
|
|
451
667
|
with pytest.raises(AssertionError, match=violation):
|
|
452
|
-
assert_test_job_fails_when_tests_fail(
|
|
668
|
+
assert_test_job_fails_when_tests_fail(workflow)
|
|
669
|
+
|
|
670
|
+
|
|
671
|
+
def test_test_job_check_accepts_separate_template_test_step():
|
|
672
|
+
workflow = yaml.safe_load(PUSH_WORKFLOW.read_text())
|
|
673
|
+
steps = workflow["jobs"]["Test"]["steps"]
|
|
674
|
+
steps.insert(
|
|
675
|
+
steps.index(find_test_step(workflow)),
|
|
676
|
+
{"run": "make test-country-template"},
|
|
677
|
+
)
|
|
678
|
+
|
|
679
|
+
assert_test_job_fails_when_tests_fail(workflow)
|
|
680
|
+
|
|
681
|
+
|
|
682
|
+
@pytest.mark.parametrize(
|
|
683
|
+
("target", "prefix"),
|
|
684
|
+
[("test", "-"), ("test", "@-"), ("test", "+-"), ("test-country-template", "-")],
|
|
685
|
+
)
|
|
686
|
+
def test_make_test_check_rejects_ignored_recipe_failure(tmp_path, target, prefix):
|
|
687
|
+
lines = MAKEFILE.read_text().splitlines()
|
|
688
|
+
recipe_start = next(
|
|
689
|
+
index for index, line in enumerate(lines) if line.startswith(f"{target}:")
|
|
690
|
+
)
|
|
691
|
+
lines[recipe_start + 1] = "\t" + prefix + lines[recipe_start + 1][1:]
|
|
692
|
+
makefile = tmp_path / "Makefile"
|
|
693
|
+
makefile.write_text("\n".join(lines) + "\n")
|
|
694
|
+
|
|
695
|
+
with pytest.raises(
|
|
696
|
+
AssertionError, match=f"make {target} ignores a failing recipe line"
|
|
697
|
+
):
|
|
698
|
+
assert_make_test_fails_when_tests_fail(make_rules(makefile))
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/is-version-number-acceptable.sh
RENAMED
|
File without changes
|
|
File without changes
|
{policyengine_core-3.34.4 → policyengine_core-3.34.5}/.github/requirements/legacy-country-smoke.txt
RENAMED
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/charts/formatting.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{policyengine_core-3.34.4 → policyengine_core-3.34.5}/policyengine_core/country_template/entities.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|