diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 606699ed5..d8d1cb3e0 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,11 +1,63 @@ -## Updating data +# Contributing to policyengine-us-data -If your changes present a non-bugfix change to one or more datasets which are cloud-hosted (CPS, ECPS and PUF), then please change both the filename and URL (in both the class definition file and in `storage/upload_completed_datasets.py`. This enables us to store historical versions of datasets separately and reproducibly. +See the [shared PolicyEngine contribution guide](https://github.com/PolicyEngine/.github/blob/main/CONTRIBUTING.md) for cross-repo conventions (towncrier changelog fragments, `uv run`, PR description format, anti-patterns). This file covers policyengine-us-data specifics. + +## Commands + +```bash +make install # install deps (uv) +make format # format (required) +make test-unit # unit tests (synthetic / mocked, seconds) +make test-integration # integration tests (need built H5 datasets) +make test # both +make data # full dataset build (long) +make push-pr-branch # push to upstream with correct tracking (use before opening PRs) +uv run pytest tests/unit/datasets/ -v +``` + +Python 3.12–3.14. Default branch: `main`. + +## Test organisation + +- `tests/unit/` — self-contained (synthetic data, mocks, checked-in fixtures). Run in seconds with no external deps. + - `unit/datasets/` — dataset code + - `unit/calibration/` — calibration code +- `tests/integration/` — requires built H5 datasets, HuggingFace downloads, `Microsimulation` objects, or DB ETL. Named after the dataset under test (e.g. `test_cps.py` tests `cps_2024.h5`). + +**Placement rules:** + +- **Never** put tests that need H5 files or `Microsimulation` in `unit/`. +- **Never** put synthetic-only tests in `integration/`. +- Sanity checks (value ranges, population counts) go in the per-dataset integration file, not a separate sanity file. +- When adding an integration test, extend the existing per-dataset file if one exists. + +## Updating datasets + +If your change is a non-bugfix update to a cloud-hosted dataset (CPS, enhanced CPS, PUF), bump both the filename and URL in the class definition and in `storage/upload_completed_datasets.py`. That lets us store historical dataset versions separately and reproducibly. ## Opening PRs -Push PR branches to the upstream `PolicyEngine/policyengine-us-data` repository, not to a personal fork. From the repo root, run: +**Always create branches on the upstream repo, not a fork.** Fork PRs can't access workflow secrets and will fail on data-download steps. The convenience target: + +```bash +make push-pr-branch +``` + +pushes the current branch to `upstream` with the correct tracking so `gh pr create` just works. + +## Repo-specific anti-patterns + +- **Never fabricate data or results.** This is a research codebase; reproducible aggregates only. Use `[TO BE CALCULATED]` placeholders if a number isn't computed yet. +- **Don't** open PRs from personal forks (CI will fail on secrets). +- **Don't** add `[codex]` or other agent-label prefixes to PR titles. +- **Don't** skip full-build CI when touching the imputation or calibration pipeline. +- **Don't** commit large binary artefacts — HuggingFace storage only. + +## CI workflows -`make push-pr-branch` +Five workflow files in `.github/workflows/`: -This avoids the fork-only CI failure path and sets the upstream tracking branch correctly before opening the PR. +- `pr.yaml` — fork check, lint, uv.lock freshness, towncrier fragment check, unit tests, smoke test, docs build. Integration tests trigger when files in `policyengine_us_data/`, `modal_app/`, or `tests/integration/` change. ~2–3 min for the unit path. +- `push.yaml` — on push to main: either version-bump + PyPI publish (on `Update package version` commits), or a full Modal data build with integration tests (on everything else). +- `pipeline.yaml` — dispatch only, spawns the H5 generation pipeline on Modal with configurable GPU/epochs/workers. +- `local_area_publish.yaml` / `local_area_promote.yaml` — manual dispatch to build/stage and then promote local-area H5 files. diff --git a/changelog.d/migrate-to-towncrier.changed.md b/changelog.d/migrate-to-towncrier.changed.md new file mode 100644 index 000000000..6e46aec7c --- /dev/null +++ b/changelog.d/migrate-to-towncrier.changed.md @@ -0,0 +1 @@ +Migrate the changelog tooling from `yaml-changelog` (`changelog_entry.yaml` + `changelog.yaml` + `build-changelog`) to towncrier (`changelog.d/..md` fragments). The repo's CI already ran `towncrier check` in `pr.yaml` and `bump_version.py` already read fragments from `changelog.d/`; this drops the leftover yaml-changelog artefacts (unused dep, unused reusable workflow, zero-byte `changelog_entry.yaml`, and duplicated `changelog.yaml` whose contents are already in `CHANGELOG.md`) so the tooling story matches the rest of the org. diff --git a/changelog.yaml b/changelog.yaml deleted file mode 100644 index 4c4dda209..000000000 --- a/changelog.yaml +++ /dev/null @@ -1,954 +0,0 @@ -- changes: - added: - - Initialized changelogging - date: 2024-09-09 17:29:10 - version: 1.0.0 -- changes: - added: - - Improved changelog - date: 2024-09-09 17:29:10 -- bump: minor - changes: - changed: - - Improved logging - - Updated required Python version - - Removed setuptools_scm - date: 2024-09-11 13:48:15 -- bump: patch - changes: - fixed: - - Added GitHub Actions test job to PR and push - - Run publish to PyPI GitHub Actions job only on push - - Fix changelog GitHub Actions job - date: 2024-09-11 16:40:10 -- bump: minor - changes: - added: - - Added conditional deletion of existing resource - - Added downloading of existing resources for backup purposes - - Added tqdm to download script - changed: - - Fixed upload script's use of tqdm - date: 2024-09-12 19:47:01 -- bump: patch - changes: - fixed: - - Bug in docs where prerequisites wouldn't load in GCP. - date: 2024-09-16 08:04:08 -- bump: minor - changes: - fixed: - - Moved heavy dependencies to dev. - date: 2024-09-17 10:27:10 -- bump: patch - changes: - added: - - Jupyter Book documentation. - date: 2024-09-17 19:37:44 -- bump: minor - changes: - added: - - Geography generation module (previously in US package) - changed: - - Fixed export structure within __init__ files - date: 2024-09-18 03:05:11 -- bump: patch - changes: - fixed: - - Import errors in non-dev mode. - date: 2024-09-18 16:30:37 -- bump: patch - changes: - fixed: - - Corrected versioning issues - date: 2024-09-18 19:49:48 -- bump: patch - changes: - changed: - - Fixed CI/CD push script - date: 2024-09-18 20:57:03 -- bump: patch - changes: - changed: - - Split push actions into two separate files - - Made run of second portion of push conditional upon run of first - date: 2024-09-19 15:36:00 -- bump: patch - changes: - removed: - - Unnecessary info in CONTRIBUTING.md - date: 2024-09-22 21:15:27 -- bump: minor - changes: - added: - - Migrate the ACS from the US-repository. - changed: - - Enhanced CPS now uses a 3-year pooled CPS. - date: 2024-09-23 10:28:55 -- bump: patch - changes: - changed: - - Documentation updated. - - URLs for PUF data. - date: 2024-09-23 11:22:32 -- bump: minor - changes: - added: - - State and household size as predictors for rent and property taxes. - date: 2024-09-25 10:40:39 -- bump: minor - changes: - changed: - - Bump to policyengine-us 1.100.0. - date: 2024-09-29 15:03:05 -- bump: minor - changes: - fixed: - - Moved PolicyEngine US out of setup.py dependencies. - date: 2024-09-29 18:08:57 -- bump: minor - changes: - added: - - EITC calibration by child counts. - - 10% dropout during weight calibration. - date: 2024-10-07 11:45:52 -- bump: minor - changes: - fixed: - - EITC calibration. - date: 2024-10-08 15:48:46 -- bump: minor - changes: - changed: - - EITC targets improved by uprating 2020 rather than 2021 targets. - date: 2024-10-09 14:11:41 -- bump: patch - changes: - changed: - - Reverted to using standard version of microdf - date: 2024-10-29 19:15:42 -- bump: minor - changes: - added: - - Paper on methodology. - date: 2024-11-12 07:03:52 -- bump: patch - changes: - added: - - Metric comparisons by dataset to the documentation. - date: 2024-11-12 15:03:39 -- bump: minor - changes: - added: - - Metric comparisons by dataset to the documentation. - - Calibration of state populations. - date: 2024-11-19 12:29:11 -- bump: minor - changes: - added: - - Automatic upload behavior. - date: 2024-11-29 20:23:10 -- bump: minor - changes: - changed: - - Changed GitHub release URLs to Hugging Face URLs for Enhanced CPS 2024 and Pooled - 3-Year CPS 2023. - - Set minimum version for policyengine-core. - date: 2024-12-02 20:40:26 -- bump: patch - changes: - changed: - - Install order and requirements for policyengine-us - date: 2024-12-03 23:21:24 -- bump: minor - changes: - added: - - DC PTC takeup. - date: 2025-01-13 16:36:45 -- bump: patch - changes: - fixed: - - Minor bug with memory breaches. - date: 2025-01-22 04:02:27 -- bump: minor - changes: - added: - - Interest expenses. - date: 2025-01-24 11:18:33 -- bump: minor - changes: - fixed: - - Larger GH runner for data generation. - date: 2025-02-01 02:21:19 -- bump: patch - changes: - fixed: - - Apply the miscellaneous deduction imputation to the unreimbursed_business_employee_expenses - instead of the misc_deduction variable. - date: 2025-02-20 12:34:31 -- bump: minor - changes: - added: - - County FIPS dataset - date: 2025-03-27 22:58:46 -- bump: patch - changes: - changed: - - Explicitly specified encoding while building county FIPS dataset - removed: - - Unneeded build of county FIPS dataset to local folder - date: 2025-03-28 18:07:01 -- bump: patch - changes: - added: - - Non-downsampled versions of the 2021, 2022, and 2023 CPS datasets - changed: - - Modified downsampling method within CPS base dataset class - - Pooled 3-Year CPS generation uses the non-downsampled versions of the 2021, - 2022, and 2023 CPS datasets - - Downsampling method attempts to preserve original dtype values - date: 2025-04-22 18:24:44 -- bump: minor - changes: - added: - - Tip income. - date: 2025-05-13 12:48:06 -- bump: minor - changes: - added: - - Calibration of the QBID tax expenditure. - date: 2025-05-13 13:29:57 -- bump: patch - changes: - fixed: - - Data downloads for Census datasets disabled. - - Warning added for downsampling non-existent policyengine-[country] variables. - date: 2025-05-14 13:31:21 -- bump: minor - changes: - added: - - SSN card type implementation for CPS dataset. - - Calibration of undocumented population to 10.1 million based on Pew Research - data. - date: 2025-05-14 14:15:06 -- bump: minor - changes: - added: - - scf package loading module - - auto loan balance imputation notebook - date: 2025-05-14 14:29:32 -- bump: patch - changes: - fixed: - - Runtime for tests reduced. - date: 2025-05-19 07:52:35 -- bump: patch - changes: - fixed: - - Upload to GCP on dataset build. - date: 2025-05-19 15:34:43 -- bump: patch - changes: - fixed: - - GCP uploads use permissions correctly - date: 2025-05-20 10:37:41 -- bump: patch - changes: - changed: - - Methodology to directly impute auto loan interest instead of assuming a 2% interest - rate on auto loan balance. - date: 2025-05-22 10:56:32 -- bump: minor - changes: - added: - - Auto loan balance variable to cps. - date: 2025-05-23 15:00:34 -- bump: minor - changes: - added: - - Hours worked last week variable. - date: 2025-05-26 10:43:04 -- bump: patch - changes: - added: - - Versioning to dataset uploads. - date: 2025-05-26 21:57:26 -- bump: patch - changes: - fixed: - - Tests run after versioning. - date: 2025-05-26 22:01:07 -- bump: patch - changes: - fixed: - - Missing HF token. - date: 2025-05-26 22:11:20 -- bump: minor - changes: - added: - - Net worth variable to cps. - date: 2025-06-09 10:44:59 -- bump: minor - changes: - added: - - Source for net worth calibration. - date: 2025-06-09 11:46:29 -- bump: minor - changes: - added: - - Add ACA and Medicaid take-up rates. - date: 2025-06-11 22:28:55 -- bump: patch - changes: - fixed: - - Increase tolerance for auto loan interest and balance test. - date: 2025-06-12 16:59:41 -- bump: patch - changes: - added: - - Join wealth and auto loan interest imputations. - date: 2025-06-13 11:06:01 -- bump: patch - changes: - fixed: - - Adjust take-up seed variables. - date: 2025-06-13 14:46:04 -- bump: patch - changes: - fixed: - - Data length in the take-up variables. - date: 2025-06-13 16:30:39 -- bump: minor - changes: - added: - - Change ACA Marketplace variable to use current coverage instead of any coverage - within the last year. - date: 2025-06-14 20:36:59 -- bump: patch - changes: - added: - - ACA and Medicaid calibration targets. - date: 2025-06-18 10:07:41 -- bump: minor - changes: - added: - - Synthetic, small ECPS data file. - date: 2025-06-18 12:31:13 -- bump: patch - changes: - added: - - Add test for small ECPS. - date: 2025-06-19 10:09:37 -- bump: patch - changes: - fixed: - - Small CPS is now 1000 households. - date: 2025-06-19 13:59:12 -- bump: minor - changes: - added: - - Added automated checks for changelog entry - - New "would be qualified income" variables simulated - - REIT, PTP, and BDC dividend income variables simulated - - UBIA property is being simulated - - Farm Operations Income added - changed: - - W2 Wages from Qualified business is now being simulated with random variables - - qualified business income sources have been redefined based on IRS PUF inputs - date: 2025-06-19 21:34:31 -- bump: minor - changes: - added: - - SSN card type imputation algorithm. - - Family correlation adjustment to align parent-child SSN status. - date: 2025-06-23 14:48:18 -- bump: patch - changes: - added: - - State age targets. - date: 2025-07-01 13:28:38 -- bump: minor - changes: - added: - - State agi calibration targets. - date: 2025-07-01 14:51:09 -- bump: patch - changes: - fixed: - - Use full CPS by default. - date: 2025-07-01 16:54:09 -- bump: patch - changes: - fixed: - - Increased epochs back to 5k. - - Disabled hyperparameter tuning for imputation models. - date: 2025-07-01 19:02:50 -- bump: patch - changes: - fixed: - - Bug in hyperparameter tuning. - date: 2025-07-01 19:15:43 -- bump: minor - changes: - added: - - State real estate taxes calibration targets. - date: 2025-07-01 20:10:32 -- bump: patch - changes: - changed: - - Calibration epochs reduced to 500. - date: 2025-07-01 22:12:13 -- bump: minor - changes: - added: - - Normalisation of national and state targets. - date: 2025-07-01 23:42:47 -- bump: patch - changes: - fixed: - - Imputed non-CPS income variables from the PUF. - date: 2025-07-02 15:00:11 -- bump: patch - changes: - changed: - - Epochs increased to 1k. - date: 2025-07-02 15:31:46 -- bump: minor - changes: - added: - - State SNAP calibration targets. - date: 2025-07-03 03:03:06 -- bump: patch - changes: - changed: - - PR tests to be more similar to production builds. - date: 2025-07-03 09:21:06 -- bump: patch - changes: - fixed: - - Use SURVIVING_SPOUSE and is_surviving_spouse instead of WIDOW and is_widowed. - date: 2025-07-08 21:53:02 -- bump: minor - changes: - added: - - Medicaid state level calibration targets. - date: 2025-07-09 14:58:33 -- bump: patch - changes: - changed: - - bad targets (causing problems with estimation) removed - - lite mode now builds CPS_2023 in addition to CPS_2024 - - gave reweight an epochs argument and set it at 150 for optimization - - updating minimum versions on policyengine-us and pandas dependencies - - getting rid of non-working manual workflow code - date: 2025-07-14 15:33:11 -- bump: minor - changes: - changed: - - Removed github download capability - - Changed download option for soi.csv and np2023_d5_mid.csv to Hugging Face - date: 2025-07-16 01:01:25 -- bump: patch - changes: - fixed: - - Github pages deploy - date: 2025-07-17 20:07:31 -- bump: minor - changes: - added: - - l0 regularization as described in https://arxiv.org/abs/1712.01312 - date: 2025-07-18 12:46:15 -- bump: patch - changes: - fixed: - - Edit and create files that pull SOI agi, ACS age, hardcoded and SNAP targets - to follow the same clean csv format. - - Track all csv files used by loss.py for backwards compatibility. - date: 2025-07-18 17:01:51 -- bump: patch - changes: - changed: - - Update microdf_python dependency to >=1.0.0. - date: 2025-07-22 21:03:38 -- bump: minor - changes: - added: - - Added Immigration status from SSN algorithm. - date: 2025-07-24 13:44:42 -- bump: patch - changes: - fixed: - - Clean up immigration status PR. - date: 2025-07-26 13:35:10 -- bump: minor - changes: - added: - - Python 3.13 support - changed: - - Simplified CI test matrix to only test on Python 3.13 and Ubuntu - - Updated policyengine-us to >=1.350.0 for Python 3.13 support - - Updated policyengine-core to >=3.19.0 for Python 3.13 support - - Updated microimpute from 0.1.4 to 1.0.1 for numpy 2.x compatibility - - Updated scipy dependency from <1.13 to >=1.15.3 - - Updated pandas dependency from >=2.3.0 to >=2.3.1 - - Updated statsmodels dependency from >=0.14.0 to >=0.14.5 - - Added lower bounds to dependencies that were missing them - date: 2025-07-26 17:22:33 -- bump: patch - changes: - fixed: - - Increased Medicaid calibration tolerance to 100% to handle state-level noise - date: 2025-07-26 19:06:45 -- bump: patch - changes: - added: - - PyPI auto-publish workflow in GitHub Actions - fixed: - - README typo (installion -> installation) - date: 2025-07-26 20:53:26 -- bump: minor - changes: - added: - - Added creation script to build relational database for targets - - Refactored age targets load script to load the database - date: 2025-07-28 16:34:40 -- bump: patch - changes: - fixed: - - Removed leftover changelog entry from merged PR that was causing push CI failures - - Removed unused make_person function with undefined CURRENT_YEAR variable - date: 2025-07-30 18:19:07 -- bump: patch - changes: - fixed: - - Fixed push CI upload failure by using 'secrets: inherit' in reusable workflows - date: 2025-07-30 19:42:58 -- bump: patch - changes: - fixed: - - Made upload script more robust by only uploading files that exist - - Added logging to show which files are being uploaded vs skipped - date: 2025-07-30 20:28:05 -- bump: patch - changes: - added: - - Fork check in PR workflows to fail fast with clear error message - fixed: - - Fixed documentation deployment for MyST v2 by using timeout command - date: 2025-07-30 21:55:05 -- changes: - changed: - - New configuration for sparse solution (~20k non-zero households) - - added a seeding function to remove non-deterministic behavior in reweight - - Made np2023_d5_mid.csv a git ignorable file (it's in hugging face) - date: 2025-07-30 22:29:06 -- bump: patch - changes: - fixed: - - Fixed GitHub Pages documentation rendering by setting BASE_URL for MyST - date: 2025-07-30 22:43:44 -- bump: patch - changes: - fixed: - - Lite mode was used in production. - date: 2025-08-01 11:29:48 -- bump: minor - changes: - added: - - Pin -us to a version pre-OBBBA baseline changes were implemented. - date: 2025-08-04 18:52:21 -- bump: patch - changes: - fixed: - - Moved QRF implementation to microimpute package to avoid code duplication - date: 2025-08-05 10:23:02 -- bump: minor - changes: - added: - - Unpin -us. - date: 2025-08-06 19:01:03 -- bump: patch - changes: - changed: - - renamed "ucgid" to "ucgid_str" in age targets loading script and operation to - "in" - - removed [0.5] key access from imputation results as per microimpute's new output - format - date: 2025-08-08 10:19:16 -- bump: patch - changes: - fixed: - - Fixed GitHub Pages documentation by adding .nojekyll file to serve underscore-prefixed - directories - date: 2025-08-08 15:16:00 -- bump: minor - changes: - added: - - add SQLite database for calibration targets - date: 2025-08-20 18:44:07 -- bump: minor - changes: - added: - - Support for 2024 CPS ASEC data (March 2024 survey) - - CensusCPS_2024 class to download raw 2024 ASEC data - - CPS_2024 class using actual 2024 data instead of extrapolation - - CPS_2025 class with extrapolation from 2024 data - - DOCS_FOLDER constant to storage module for cleaner file paths - - Tests for CPS 2024 and 2025 datasets - changed: - - Fixed __file__ NameError in interactive Python environments - - Updated generate method to handle 2025 extrapolation from 2024 - date: 2025-09-10 20:30:41 -- bump: patch - changes: - changed: - - GitHub Actions workflow now uses self-hosted GCP runner to handle memory-intensive - dataset builds - date: 2025-11-12 20:08:59 -- bump: minor - changes: - added: - - Additional calibration based on SSA Trustees data that extends projections until - 2100 - - Manual trigger capability for documentation deployment workflow - - Documentation for SSA data sources in storage README - changed: - - Renamed long-term projections notebook to clarify PWBM comparison scope (2025-2100) - fixed: - - GitHub Pages documentation deployment path - - Corrected number of imputed variables from 72 to 67 in documentation - - Corrected calibration target count from 7,000+ to 2,813 across all docs - - Removed inaccurate "two-stage" terminology in methodology descriptions - date: 2025-11-20 02:54:32 -- bump: patch - changes: - added: - - Node.js 24 LTS setup to CI workflow for MyST builds - - H6 Social Security reform calibration for long-term projections (phases out - OASDI taxation 2045-2054) - - H6 threshold crossover handling when OASDI thresholds exceed HI thresholds - - start_year parameter to run_household_projection.py CLI - - docs/README.md documenting MyST build output pitfall - fixed: - - GitHub Pages documentation deployment (was deploying wrong directory causing - blank pages) - - Removed timeout and error suppression from documentation build - date: 2025-12-03 23:00:20 -- bump: minor - changes: - added: - - Sparse matrix builder for local area calibration with database-driven constraints - - Local area calibration data pipeline (make data-local-area) - - ExtendedCPS_2023 and PUF_2023 dataset classes - - Stratified CPS sampling to preserve high-income households - - Matrix verification tests for local area calibration - date: 2025-12-08 19:52:21 -- bump: minor - changes: - added: - - SPM threshold calculation using policyengine/spm-calculator package - - New utility module (policyengine_us_data/utils/spm.py) for SPM calculations - changed: - - CPS datasets now calculate SPM thresholds using spm-calculator with Census-provided - geographic adjustments - - ACS datasets now calculate SPM thresholds using spm-calculator with national-level - thresholds - date: 2025-12-19 17:56:53 -- bump: minor - changes: - added: - - Added --use-tob flag for TOB (Taxation of Benefits) revenue calibration targeting - OASDI and HI trust fund revenue - date: 2025-12-23 15:15:35 -- bump: minor - changes: - added: - - Sparse matrix builder for local area calibration with database-driven constraints - - Local area calibration data pipeline (make data-local-area) - - ExtendedCPS_2023 and PUF_2023 dataset classes - - Stratified CPS sampling to preserve high-income households - - Matrix verification tests for local area calibration - - Population-weighted P(county|CD) distributions from Census block data - - County assignment module for stacked dataset builder - date: 2026-01-01 17:39:26 -- bump: patch - changes: - fixed: - - Fixed Publish workflow by migrating dev dependencies to PEP 735 dependency-groups - date: 2026-01-07 01:05:49 -- bump: minor - changes: - added: - - tests to verify SparseMatrixBuilder correctly calculates variables and constraints - into the calibration matrix. - date: 2026-01-22 20:50:13 -- bump: minor - changes: - changed: - - Added policyengine-claude plugin auto-install configuration. - date: 2026-01-23 20:51:58 -- bump: patch - changes: - changed: - - Bumped policyengine-core minimum version to 3.23.5 for pandas 3.0 compatibility - date: 2026-01-25 15:48:00 -- bump: minor - changes: - added: - - partnership_se_income variable from Schedule K-1 Box 14 (k1bx14p + k1bx14s), - representing partnership income subject to self-employment tax. - date: 2026-01-25 17:43:38 -- bump: patch - changes: - fixed: - - Derive partnership_se_income from PUF source columns using Yale Budget Lab's - gross-up approach instead of looking for non-existent k1bx14 columns. - date: 2026-01-26 02:49:11 -- bump: minor - changes: - added: - - Support for health_insurance_premiums_without_medicare_part_b in local area - calibration - changed: - - Removed dense reweighting path from enhanced CPS; only sparse (L0) weights are - produced - - Eliminated TEST_LITE and LOCAL_AREA_CALIBRATION flags; all datasets generated - unconditionally - - Merged data-local-area Makefile target into data target - fixed: - - Versioning workflow now runs uv lock after version bump to keep uv.lock in sync - removed: - - Redundant test_sparse_matrix_builder.py (tests consolidated in test_matrix_national_variation.py) - - Redundant build_calibration_matrix.py (functionality in fit_calibration_weights.py) - date: 2026-01-26 16:45:05 -- bump: minor - changes: - added: - - Census block-level geographic assignment for households in CD-stacked datasets - - Comprehensive geography variables in output (block_geoid, tract_geoid, cbsa_code, - sldu, sldl, place_fips, vtd, puma, zcta) - - Block crosswalk file mapping 8.1M blocks to all Census geographies - - Block-to-CD distribution file for population-weighted assignment - - ZCTA (ZIP Code Tabulation Area) lookup from census block - date: 2026-01-26 22:41:56 -- bump: minor - changes: - added: - - Added CPS_2024_Full class for full-sample 2024 CPS generation - - Added raw_cache utility for Census data caching - - Added atomic parallel local area H5 publishing with Modal Volume staging - - Added manifest validation with SHA256 checksums - - Added HuggingFace retry logic with exponential backoff to fix timeout errors - - Added staging folder approach for atomic HuggingFace deployments - - Added national targets ETL for CBO projections and tax expenditure data - - Added database hierarchy validation script - - Added stratum_group_id migration utilities - - Added db_metadata utilities for source and variable group management - - Added DATABASE_GUIDE.md with comprehensive calibration database documentation - changed: - - Migrated data pipeline from CPS 2023 to CPS 2024 (March 2025 ASEC) - - Updated ExtendedCPS_2024 to use new CPS_2024_Full (full sample) - - Updated local area calibration to use 2024 extended CPS data - - Updated database ETL scripts for strata, IRS SOI, Medicaid, and SNAP - - Expanded IRS SOI ETL with detailed income brackets and filing status breakdowns - fixed: - - Fixed cross-state recalculation in sparse matrix builder by adding time_period - to calculate() calls - removed: - - Removed CPS_2021_Full, CPS_2022_Full, CPS_2023_Full classes - - Removed PooledCPS and Pooled_3_Year_CPS_2023 - - Removed ExtendedCPS_2023 - - Removed dead train_previous_year_income_model function - - Removed unused dataset exports from __init__.py - date: 2026-01-31 03:18:20 -- bump: minor - changes: - added: - - weeks_unemployed variable from CPS ASEC LKWEEKS - - QRF-based imputation of weeks_unemployed for Extended CPS PUF copy - date: 2026-01-31 19:53:18 -- bump: minor - changes: - added: - - SSA benefit-type calibration targets for social_security_retirement, social_security_disability, - social_security_survivors, and social_security_dependents - - IRA contribution calibration targets for traditional_ira_contributions and roth_ira_contributions - from IRS SOI data - changed: - - Use CPS ASEC RESNSS1/RESNSS2 source codes to classify Social Security income - into retirement, disability, survivors, and dependents (replacing age-62 heuristic) - - Parameterize retirement contribution limits by year (2020-2025) instead of hardcoded - 2022 values - - Update taxable pension fraction from 1.0 to 0.590 based on SOI 2015 Table 1.4 - - Add age and is_male as QRF predictors for pension contribution imputation - date: 2026-01-31 19:54:59 -- bump: minor - changes: - changed: - - Use income_tax_positive instead of income_tax for CBO calibration target - date: 2026-01-31 19:57:29 -- bump: minor - changes: - added: - - Add state income tax calibration targets from Census STC FY2023 data - date: 2026-01-31 20:18:58 -- bump: patch - changes: - added: - - cps_2024.h5 to HuggingFace upload list so the raw (unenhanced) 2024 CPS dataset - is published - date: 2026-02-01 04:24:23 -- bump: patch - changes: - fixed: - - Fix etl_state_income_tax.py API mismatches with db_metadata utility functions - date: 2026-02-01 20:58:21 -- bump: minor - changes: - added: - - Name-based seeding (seeded_rng) for order-independent reproducibility - - State-specific Medicaid takeup rates (53%-99% range, 51 jurisdictions) - - SSI resource test pass rate parameter (0.4) - - WIC takeup and nutritional risk draw variables (float) - - meets_ssi_resource_test boolean generation - changed: - - Replaced shared RNG (seed=100) with per-variable name-based seeding - - Medicaid takeup now uses state-specific rates instead of uniform 93% - date: 2026-02-07 00:24:23 -- bump: minor - changes: - added: - - Add liquid asset imputation from SIPP (bank accounts, stocks, bonds) for SSI - and means-tested program modeling - - Add SSI takeup rate parameter and takes_up_ssi_if_eligible draw - removed: - - Remove random SSI resource test placeholder (now calculated from imputed assets - in policyengine-us) - - Remove ssi_pass_rate parameter (replaced by ssi takeup rate) - date: 2026-02-07 19:46:46 -- bump: patch - changes: - fixed: - - Immigration status mapping. - date: 2026-02-08 02:59:10 -- bump: minor - changes: - added: - - Add voluntary tax filer variable and filer count calibration targets by AGI - band. - date: 2026-02-08 04:15:49 -- bump: patch - changes: - added: - - promote-dataset Makefile target - - Year-mismatch warning in national targets ETL - - Congress-session constants and warning in SOI district puller - changed: - - Switch DEFAULT_DATASET to local storage path for database ETL scripts - - Extract shared etl_argparser() to reduce boilerplate across 7 ETL scripts - - Delete dead get_pseudo_input_variables() function - date: 2026-02-09 17:47:49 -- bump: minor - changes: - added: - - Entity aware target calculations for correct entity counts. - - Selection of targets closest to calibration time period and uprating logic for - cohesive and comprehensive time-period coverage. - - Hierarchical state-level uprating with CD reconciliation via hierarchy inconsistency - factors (HIFs) and state-specific uprating factors (e.g., CMS/KFF ACA PTC multipliers). - - stratum_domain and target_overview views for easier target inspection and debugging. - - test_schema_views_and_lookups.py for testing the new views and lookups. - - Calibration matrix diagnostic notebook (docs/calibration_matrix.ipynb). - removed: - - Redundant database fields and tables (variable_groups, variable_metadata,sources, - source_id, stratum_group_id). - date: 2026-02-12 04:48:34 -- bump: minor - changes: - added: - - Parallelization of data building steps. - - Checkpointing mechanism to resume data builds and testing modules from last - successful step in Modal runs. - changed: - - Removed duplicate run of test_local_area_calibration tests. - - Baked correct defaults into create_stratified_cps.py, removing hardcoded args - from Makefile and Modal build. - - DRYed up sequential build path to iterate SCRIPT_OUTPUTS instead of a redundant - list. - - Added thread-safe locking around volume.commit() for parallel checkpoint safety. - date: 2026-02-12 16:29:45 -- bump: minor - changes: - added: - - field_valid_values table in database as a source of truth for fields that have - semantic meaning external to the database hierarchy (variable, constraint_variable, - period, operation, active). - - Event listeners that raise an error if inconsistent operations or parent-child - relationships are attempted to be inserted into the database. - - Source field in target table. - date: 2026-02-12 18:56:57 -- bump: minor - changes: - added: - - Census-block-first calibration pipeline (calibration/ package) ported from PR - - Clone-and-assign module for population-weighted census block sampling - - Unified matrix builder with clone-by-clone simulation, COO caching, and target_overview-based - querying - - Unified calibration CLI with L0 optimization and seeded takeup re-randomization - - 28 new tests for the calibration pipeline - - Integration test for build_matrix geographic masking (national/state/CD) - - Tests for drop_target_groups utility - - voluntary_filing.yaml takeup rate parameter - changed: - - Rewrote local_area_calibration_setup.ipynb for clone-based pipeline - - Renamed _get_geo_level to get_geo_level (now cross-module public API) - fixed: - - Fix Jupyter import error in unified_calibration.py (OutStream.reconfigure moved - to main) - - Fix modal_app/remote_calibration_runner.py referencing deleted fit_calibration_weights.py - - Fix _coo_parts stale state bug on build_matrix re-call after failure - - Remove hardcoded voluntary_filing rate in favor of YAML parameter - removed: - - SparseMatrixBuilder, MatrixTracer, and fit_calibration_weights (replaced by - unified pipeline) - - 8 old SparseMatrixBuilder-dependent tests (replaced by new test_calibration - suite) - date: 2026-02-17 15:26:04 -- bump: minor - changes: - added: - - PUF clone + QRF imputation module (puf_impute.py) with state_fips predictor - and stratified subsample preserving top 0.5% by AGI - - ACS re-imputation module (source_impute.py) with state predictor; SIPP/SCF imputation - without state (surveys lack state identifiers) - - PUF and source impute integration into unified calibration pipeline (--puf-dataset, - --skip-puf, --skip-source-impute flags) - - 21 new tests for puf_impute and source_impute modules - - DC_STATEHOOD=1 environment variable set in storage/__init__.py to ensure DC - is included in state-based processing - changed: - - Refactored extended_cps.py to delegate to puf_impute.puf_clone_dataset() (443 - -> 75 lines) - - PUF QRF training uses stratified subsample (20K target) instead of random subsample(10_000), - force-including high-income tail - - unified_calibration.py pipeline now supports optional source imputation and - PUF cloning steps - date: 2026-02-18 21:11:01 -- bump: patch - changes: - added: - - Add TANF takeup rate parameter (22%) and register takes_up_tanf_if_eligible - in the calibration pipeline's SIMPLE_TAKEUP_VARS. - date: 2026-02-19 06:08:37 -- bump: patch - changes: - changed: - - Bump policyengine-us to 1.570.7 to include TANF formula fixes and takes_up_tanf_if_eligible - variable for calibration. - date: 2026-02-19 13:41:26 -- bump: patch - changes: - fixed: - - Add TANF takeup (22%) assignment to CPS data pipeline so takes_up_tanf_if_eligible - is persisted in the dataset. - date: 2026-02-19 16:34:50 diff --git a/pyproject.toml b/pyproject.toml index b2cef0f13..9e1fa5320 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,7 +63,6 @@ dev = [ "furo", "jupyter-book", "mystmd>=1.7.0", - "yaml-changelog>=0.1.7", "build", "tomli", "itables", diff --git a/uv.lock b/uv.lock index e498fd74b..65df79762 100644 --- a/uv.lock +++ b/uv.lock @@ -116,15 +116,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94", size = 27149, upload-time = "2025-07-30T10:01:59.329Z" }, ] -[[package]] -name = "argparse" -version = "1.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/dd/e617cfc3f6210ae183374cd9f6a26b20514bbb5a792af97949c5aacddf0f/argparse-1.4.0.tar.gz", hash = "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", size = 70508, upload-time = "2015-09-12T20:22:16.217Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl", hash = "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314", size = 23000, upload-time = "2015-09-14T16:03:16.137Z" }, -] - [[package]] name = "arrow" version = "1.4.0" @@ -507,19 +498,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/ee/a4cf96b8ce1e566ed238f0659ac2d3f007ed1d14b181bcb684e19561a69a/coverage-7.13.5-py3-none-any.whl", hash = "sha256:34b02417cf070e173989b3db962f7ed56d2f644307b2cf9d5a0f258e13084a61", size = 211346, upload-time = "2026-03-17T10:33:15.691Z" }, ] -[[package]] -name = "datetime" -version = "6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pytz" }, - { name = "zope-interface" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/77/32/decbfd165e9985ba9d8c2d34a39afe5aeba2fc3fe390eb6e9ef1aab98fa8/datetime-6.0.tar.gz", hash = "sha256:c1514936d2f901e10c8e08d83bf04e6c9dbd7ca4f244da94fec980980a3bc4d5", size = 64167, upload-time = "2025-11-25T08:00:34.586Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cf/7a/ea0f3e3ea74be36fc7cf54f966cde732a3de72697983cdb5646b0a4dacde/datetime-6.0-py3-none-any.whl", hash = "sha256:d19988f0657a4e72c9438344157254a8dcad6aea8cd5ae70a5d1b5a75e5dc930", size = 52637, upload-time = "2025-11-25T08:00:33.077Z" }, -] - [[package]] name = "debugpy" version = "1.8.19" @@ -762,6 +740,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f8/0a/a3871375c7b9727edaeeea994bfff7c63ff7804c9829c19309ba2e058807/greenlet-3.3.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:b01548f6e0b9e9784a2c99c5651e5dc89ffcbe870bc5fb2e5ef864e9cc6b5dcb", size = 276379, upload-time = "2025-12-04T14:23:30.498Z" }, { url = "https://files.pythonhosted.org/packages/43/ab/7ebfe34dce8b87be0d11dae91acbf76f7b8246bf9d6b319c741f99fa59c6/greenlet-3.3.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:349345b770dc88f81506c6861d22a6ccd422207829d2c854ae2af8025af303e3", size = 597294, upload-time = "2025-12-04T14:50:06.847Z" }, { url = "https://files.pythonhosted.org/packages/a4/39/f1c8da50024feecd0793dbd5e08f526809b8ab5609224a2da40aad3a7641/greenlet-3.3.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e8e18ed6995e9e2c0b4ed264d2cf89260ab3ac7e13555b8032b25a74c6d18655", size = 607742, upload-time = "2025-12-04T14:57:42.349Z" }, + { url = "https://files.pythonhosted.org/packages/77/cb/43692bcd5f7a0da6ec0ec6d58ee7cddb606d055ce94a62ac9b1aa481e969/greenlet-3.3.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c024b1e5696626890038e34f76140ed1daf858e37496d33f2af57f06189e70d7", size = 622297, upload-time = "2025-12-04T15:07:13.552Z" }, { url = "https://files.pythonhosted.org/packages/75/b0/6bde0b1011a60782108c01de5913c588cf51a839174538d266de15e4bf4d/greenlet-3.3.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:047ab3df20ede6a57c35c14bf5200fcf04039d50f908270d3f9a7a82064f543b", size = 609885, upload-time = "2025-12-04T14:26:02.368Z" }, { url = "https://files.pythonhosted.org/packages/49/0e/49b46ac39f931f59f987b7cd9f34bfec8ef81d2a1e6e00682f55be5de9f4/greenlet-3.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d9ad37fc657b1102ec880e637cccf20191581f75c64087a549e66c57e1ceb53", size = 1567424, upload-time = "2025-12-04T15:04:23.757Z" }, { url = "https://files.pythonhosted.org/packages/05/f5/49a9ac2dff7f10091935def9165c90236d8f175afb27cbed38fb1d61ab6b/greenlet-3.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83cd0e36932e0e7f36a64b732a6f60c2fc2df28c351bae79fbaf4f8092fe7614", size = 1636017, upload-time = "2025-12-04T14:27:29.688Z" }, @@ -769,6 +748,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/02/2f/28592176381b9ab2cafa12829ba7b472d177f3acc35d8fbcf3673d966fff/greenlet-3.3.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:a1e41a81c7e2825822f4e068c48cb2196002362619e2d70b148f20a831c00739", size = 275140, upload-time = "2025-12-04T14:23:01.282Z" }, { url = "https://files.pythonhosted.org/packages/2c/80/fbe937bf81e9fca98c981fe499e59a3f45df2a04da0baa5c2be0dca0d329/greenlet-3.3.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9f515a47d02da4d30caaa85b69474cec77b7929b2e936ff7fb853d42f4bf8808", size = 599219, upload-time = "2025-12-04T14:50:08.309Z" }, { url = "https://files.pythonhosted.org/packages/c2/ff/7c985128f0514271b8268476af89aee6866df5eec04ac17dcfbc676213df/greenlet-3.3.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7d2d9fd66bfadf230b385fdc90426fcd6eb64db54b40c495b72ac0feb5766c54", size = 610211, upload-time = "2025-12-04T14:57:43.968Z" }, + { url = "https://files.pythonhosted.org/packages/79/07/c47a82d881319ec18a4510bb30463ed6891f2ad2c1901ed5ec23d3de351f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30a6e28487a790417d036088b3bcb3f3ac7d8babaa7d0139edbaddebf3af9492", size = 624311, upload-time = "2025-12-04T15:07:14.697Z" }, { url = "https://files.pythonhosted.org/packages/fd/8e/424b8c6e78bd9837d14ff7df01a9829fc883ba2ab4ea787d4f848435f23f/greenlet-3.3.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:087ea5e004437321508a8d6f20efc4cfec5e3c30118e1417ea96ed1d93950527", size = 612833, upload-time = "2025-12-04T14:26:03.669Z" }, { url = "https://files.pythonhosted.org/packages/b5/ba/56699ff9b7c76ca12f1cdc27a886d0f81f2189c3455ff9f65246780f713d/greenlet-3.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ab97cf74045343f6c60a39913fa59710e4bd26a536ce7ab2397adf8b27e67c39", size = 1567256, upload-time = "2025-12-04T15:04:25.276Z" }, { url = "https://files.pythonhosted.org/packages/1e/37/f31136132967982d698c71a281a8901daf1a8fbab935dce7c0cf15f942cc/greenlet-3.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5375d2e23184629112ca1ea89a53389dddbffcf417dad40125713d88eb5f96e8", size = 1636483, upload-time = "2025-12-04T14:27:30.804Z" }, @@ -776,6 +756,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/7c/f0a6d0ede2c7bf092d00bc83ad5bafb7e6ec9b4aab2fbdfa6f134dc73327/greenlet-3.3.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:60c2ef0f578afb3c8d92ea07ad327f9a062547137afe91f38408f08aacab667f", size = 275671, upload-time = "2025-12-04T14:23:05.267Z" }, { url = "https://files.pythonhosted.org/packages/44/06/dac639ae1a50f5969d82d2e3dd9767d30d6dbdbab0e1a54010c8fe90263c/greenlet-3.3.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a5d554d0712ba1de0a6c94c640f7aeba3f85b3a6e1f2899c11c2c0428da9365", size = 646360, upload-time = "2025-12-04T14:50:10.026Z" }, { url = "https://files.pythonhosted.org/packages/e0/94/0fb76fe6c5369fba9bf98529ada6f4c3a1adf19e406a47332245ef0eb357/greenlet-3.3.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3a898b1e9c5f7307ebbde4102908e6cbfcb9ea16284a3abe15cab996bee8b9b3", size = 658160, upload-time = "2025-12-04T14:57:45.41Z" }, + { url = "https://files.pythonhosted.org/packages/93/79/d2c70cae6e823fac36c3bbc9077962105052b7ef81db2f01ec3b9bf17e2b/greenlet-3.3.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:dcd2bdbd444ff340e8d6bdf54d2f206ccddbb3ccfdcd3c25bf4afaa7b8f0cf45", size = 671388, upload-time = "2025-12-04T15:07:15.789Z" }, { url = "https://files.pythonhosted.org/packages/b8/14/bab308fc2c1b5228c3224ec2bf928ce2e4d21d8046c161e44a2012b5203e/greenlet-3.3.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5773edda4dc00e173820722711d043799d3adb4f01731f40619e07ea2750b955", size = 660166, upload-time = "2025-12-04T14:26:05.099Z" }, { url = "https://files.pythonhosted.org/packages/4b/d2/91465d39164eaa0085177f61983d80ffe746c5a1860f009811d498e7259c/greenlet-3.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ac0549373982b36d5fd5d30beb8a7a33ee541ff98d2b502714a09f1169f31b55", size = 1615193, upload-time = "2025-12-04T15:04:27.041Z" }, { url = "https://files.pythonhosted.org/packages/42/1b/83d110a37044b92423084d52d5d5a3b3a73cafb51b547e6d7366ff62eff1/greenlet-3.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d198d2d977460358c3b3a4dc844f875d1adb33817f0613f663a656f463764ccc", size = 1683653, upload-time = "2025-12-04T14:27:32.366Z" }, @@ -783,6 +764,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/66/bd6317bc5932accf351fc19f177ffba53712a202f9df10587da8df257c7e/greenlet-3.3.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:d6ed6f85fae6cdfdb9ce04c9bf7a08d666cfcfb914e7d006f44f840b46741931", size = 282638, upload-time = "2025-12-04T14:25:20.941Z" }, { url = "https://files.pythonhosted.org/packages/30/cf/cc81cb030b40e738d6e69502ccbd0dd1bced0588e958f9e757945de24404/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9125050fcf24554e69c4cacb086b87b3b55dc395a8b3ebe6487b045b2614388", size = 651145, upload-time = "2025-12-04T14:50:11.039Z" }, { url = "https://files.pythonhosted.org/packages/9c/ea/1020037b5ecfe95ca7df8d8549959baceb8186031da83d5ecceff8b08cd2/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:87e63ccfa13c0a0f6234ed0add552af24cc67dd886731f2261e46e241608bee3", size = 654236, upload-time = "2025-12-04T14:57:47.007Z" }, + { url = "https://files.pythonhosted.org/packages/69/cc/1e4bae2e45ca2fa55299f4e85854606a78ecc37fead20d69322f96000504/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2662433acbca297c9153a4023fe2161c8dcfdcc91f10433171cf7e7d94ba2221", size = 662506, upload-time = "2025-12-04T15:07:16.906Z" }, { url = "https://files.pythonhosted.org/packages/57/b9/f8025d71a6085c441a7eaff0fd928bbb275a6633773667023d19179fe815/greenlet-3.3.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3c6e9b9c1527a78520357de498b0e709fb9e2f49c3a513afd5a249007261911b", size = 653783, upload-time = "2025-12-04T14:26:06.225Z" }, { url = "https://files.pythonhosted.org/packages/f6/c7/876a8c7a7485d5d6b5c6821201d542ef28be645aa024cfe1145b35c120c1/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:286d093f95ec98fdd92fcb955003b8a3d054b4e2cab3e2707a5039e7b50520fd", size = 1614857, upload-time = "2025-12-04T15:04:28.484Z" }, { url = "https://files.pythonhosted.org/packages/4f/dc/041be1dff9f23dac5f48a43323cd0789cb798342011c19a248d9c9335536/greenlet-3.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c10513330af5b8ae16f023e8ddbfb486ab355d04467c4679c5cfe4659975dd9", size = 1676034, upload-time = "2025-12-04T14:27:33.531Z" }, @@ -2008,15 +1990,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, ] -[[package]] -name = "pathlib" -version = "1.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/aa/9b065a76b9af472437a0059f77e8f962fe350438b927cb80184c32f075eb/pathlib-1.0.1.tar.gz", hash = "sha256:6940718dfc3eff4258203ad5021090933e5c04707d5ca8cc9e73c94a7894ea9f", size = 49298, upload-time = "2014-09-03T15:41:57.18Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/78/f9/690a8600b93c332de3ab4a344a4ac34f00c8f104917061f779db6a918ed6/pathlib-1.0.1-py3-none-any.whl", hash = "sha256:f35f95ab8b0f59e6d354090350b44a80a80635d22efdedfa84c7ad1cf0a74147", size = 14363, upload-time = "2022-05-04T13:37:20.585Z" }, -] - [[package]] name = "patsy" version = "1.0.2" @@ -2220,7 +2193,6 @@ dev = [ { name = "tabulate" }, { name = "tomli" }, { name = "towncrier" }, - { name = "yaml-changelog" }, ] [package.metadata] @@ -2268,7 +2240,6 @@ dev = [ { name = "tabulate" }, { name = "tomli" }, { name = "towncrier", specifier = ">=24.8.0" }, - { name = "yaml-changelog", specifier = ">=0.1.7" }, ] [[package]] @@ -3697,45 +3668,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/07/5a/377161c2d3538d199 wheels = [ { url = "https://files.pythonhosted.org/packages/1a/62/c8d562e7766786ba6587d09c5a8ba9f718ed3fa8af7f4553e8f91c36f302/xlrd-2.0.2-py2.py3-none-any.whl", hash = "sha256:ea762c3d29f4cca48d82df517b6d89fbce4db3107f9d78713e48cd321d5c9aa9", size = 96555, upload-time = "2025-06-14T08:46:37.766Z" }, ] - -[[package]] -name = "yaml-changelog" -version = "0.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "argparse" }, - { name = "datetime" }, - { name = "pathlib" }, - { name = "pyyaml" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/49/1004cdb8f58f49e136927b6b82554720f8f290269c4a2fe00ddf84f95dc5/yaml-changelog-0.3.0.tar.gz", hash = "sha256:d3a0f6921f8702200b16ecc3dbe6de839b7838544e68af6437ae2ecc67d83819", size = 3937, upload-time = "2022-10-18T17:50:21.571Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/e5/b28588e1e05392c7d4bcf300673ba563323b02b217f78926f6347c461407/yaml_changelog-0.3.0-py3-none-any.whl", hash = "sha256:d9b5f325efb1c9fb8461c5fec3d94c7bc5259c8f8e37ba0a790b01a07e9487f3", size = 16993, upload-time = "2022-10-18T17:50:20.173Z" }, -] - -[[package]] -name = "zope-interface" -version = "8.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/71/c9/5ec8679a04d37c797d343f650c51ad67d178f0001c363e44b6ac5f97a9da/zope_interface-8.1.1.tar.gz", hash = "sha256:51b10e6e8e238d719636a401f44f1e366146912407b58453936b781a19be19ec", size = 254748, upload-time = "2025-11-15T08:32:52.404Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/3d/f5b8dd2512f33bfab4faba71f66f6873603d625212206dd36f12403ae4ca/zope_interface-8.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a16715808408db7252b8c1597ed9008bdad7bf378ed48eb9b0595fad4170e49d", size = 208660, upload-time = "2025-11-15T08:36:53.579Z" }, - { url = "https://files.pythonhosted.org/packages/e5/41/c331adea9b11e05ff9ac4eb7d3032b24c36a3654ae9f2bf4ef2997048211/zope_interface-8.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce6b58752acc3352c4aa0b55bbeae2a941d61537e6afdad2467a624219025aae", size = 208851, upload-time = "2025-11-15T08:36:54.854Z" }, - { url = "https://files.pythonhosted.org/packages/25/00/7a8019c3bb8b119c5f50f0a4869183a4b699ca004a7f87ce98382e6b364c/zope_interface-8.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:807778883d07177713136479de7fd566f9056a13aef63b686f0ab4807c6be259", size = 259292, upload-time = "2025-11-15T08:36:56.409Z" }, - { url = "https://files.pythonhosted.org/packages/1a/fc/b70e963bf89345edffdd5d16b61e789fdc09365972b603e13785360fea6f/zope_interface-8.1.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50e5eb3b504a7d63dc25211b9298071d5b10a3eb754d6bf2f8ef06cb49f807ab", size = 264741, upload-time = "2025-11-15T08:36:57.675Z" }, - { url = "https://files.pythonhosted.org/packages/96/fe/7d0b5c0692b283901b34847f2b2f50d805bfff4b31de4021ac9dfb516d2a/zope_interface-8.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eee6f93b2512ec9466cf30c37548fd3ed7bc4436ab29cd5943d7a0b561f14f0f", size = 264281, upload-time = "2025-11-15T08:36:58.968Z" }, - { url = "https://files.pythonhosted.org/packages/2b/2c/a7cebede1cf2757be158bcb151fe533fa951038cfc5007c7597f9f86804b/zope_interface-8.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:80edee6116d569883c58ff8efcecac3b737733d646802036dc337aa839a5f06b", size = 212327, upload-time = "2025-11-15T08:37:00.4Z" }, - { url = "https://files.pythonhosted.org/packages/85/81/3c3b5386ce4fba4612fd82ffb8a90d76bcfea33ca2b6399f21e94d38484f/zope_interface-8.1.1-cp313-cp313-macosx_10_9_x86_64.whl", hash = "sha256:84f9be6d959640de9da5d14ac1f6a89148b16da766e88db37ed17e936160b0b1", size = 209046, upload-time = "2025-11-15T08:37:01.473Z" }, - { url = "https://files.pythonhosted.org/packages/4a/e3/32b7cb950c4c4326b3760a8e28e5d6f70ad15f852bfd8f9364b58634f74b/zope_interface-8.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:531fba91dcb97538f70cf4642a19d6574269460274e3f6004bba6fe684449c51", size = 209104, upload-time = "2025-11-15T08:37:02.887Z" }, - { url = "https://files.pythonhosted.org/packages/a3/3d/c4c68e1752a5f5effa2c1f5eaa4fea4399433c9b058fb7000a34bfb1c447/zope_interface-8.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:fc65f5633d5a9583ee8d88d1f5de6b46cd42c62e47757cfe86be36fb7c8c4c9b", size = 259277, upload-time = "2025-11-15T08:37:04.389Z" }, - { url = "https://files.pythonhosted.org/packages/fd/5b/cf4437b174af7591ee29bbad728f620cab5f47bd6e9c02f87d59f31a0dda/zope_interface-8.1.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efef80ddec4d7d99618ef71bc93b88859248075ca2e1ae1c78636654d3d55533", size = 264742, upload-time = "2025-11-15T08:37:05.613Z" }, - { url = "https://files.pythonhosted.org/packages/0b/0e/0cf77356862852d3d3e62db9aadae5419a1a7d89bf963b219745283ab5ca/zope_interface-8.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49aad83525eca3b4747ef51117d302e891f0042b06f32aa1c7023c62642f962b", size = 264252, upload-time = "2025-11-15T08:37:07.035Z" }, - { url = "https://files.pythonhosted.org/packages/8a/10/2af54aa88b2fa172d12364116cc40d325fedbb1877c3bb031b0da6052855/zope_interface-8.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:71cf329a21f98cb2bd9077340a589e316ac8a415cac900575a32544b3dffcb98", size = 212330, upload-time = "2025-11-15T08:37:08.14Z" }, - { url = "https://files.pythonhosted.org/packages/b9/f5/44efbd98ba06cb937fce7a69fcd7a78c4ac7aa4e1ad2125536801376d2d0/zope_interface-8.1.1-cp314-cp314-macosx_10_9_x86_64.whl", hash = "sha256:da311e9d253991ca327601f47c4644d72359bac6950fbb22f971b24cd7850f8c", size = 209099, upload-time = "2025-11-15T08:37:09.395Z" }, - { url = "https://files.pythonhosted.org/packages/fd/36/a19866c09c8485c36a4c6908e1dd3f8820b41c1ee333c291157cf4cf09e7/zope_interface-8.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3fb25fca0442c7fb93c4ee40b42e3e033fef2f648730c4b7ae6d43222a3e8946", size = 209240, upload-time = "2025-11-15T08:37:10.687Z" }, - { url = "https://files.pythonhosted.org/packages/c1/28/0dbf40db772d779a4ac8d006a57ad60936d42ad4769a3d5410dcfb98f6f9/zope_interface-8.1.1-cp314-cp314-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:bac588d0742b4e35efb7c7df1dacc0397b51ed37a17d4169a38019a1cebacf0a", size = 260919, upload-time = "2025-11-15T08:37:11.838Z" }, - { url = "https://files.pythonhosted.org/packages/72/ae/650cd4c01dd1b32c26c800b2c4d852f044552c34a56fbb74d41f569cee31/zope_interface-8.1.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3d1f053d2d5e2b393e619bce1e55954885c2e63969159aa521839e719442db49", size = 264102, upload-time = "2025-11-15T08:37:13.241Z" }, - { url = "https://files.pythonhosted.org/packages/46/f0/f534a2c34c006aa090c593cd70eaf94e259fd0786f934698d81f0534d907/zope_interface-8.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:64a1ad7f4cb17d948c6bdc525a1d60c0e567b2526feb4fa38b38f249961306b8", size = 264276, upload-time = "2025-11-15T08:37:14.369Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a8/d7e9cf03067b767e23908dbab5f6be7735d70cb4818311a248a8c4bb23cc/zope_interface-8.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:169214da1b82b7695d1a36f92d70b11166d66b6b09d03df35d150cc62ac52276", size = 212492, upload-time = "2025-11-15T08:37:15.538Z" }, -]