chore: release 0.7.1 - #196
Conversation
Cut 0.7.1 so the notebooks stop depending on unreleased API. Notebooks 02 and 03 import datasets.make_donor_panel, which the published 0.7.0 wheel does not contain, so both fall into a try/except that installs from git+main and cannot recover in-process: the failed import leaves the stale module in sys.modules, so the re-import after a successful install raises the same error. The Colab badge therefore ran an unreleased snapshot rather than the archived release the paper points at. Version number: plan.md said 0.7.1, while the source tree already described this content as 0.8.0 in three _share_of_wallet.py strings and one deprecations heading. The block is minor-shaped, so 0.7.1 is a deliberate departure from the project's own semver policy, taken because cutting 0.8.0 would make three standing removal promises come due today, including the FiscalYearGroupedSplitter drop_repeat_donors default flip. Those stay queued. The rename shipping here is name-only: same values, same position, old spelling still reachable under a DeprecationWarning until 0.9.0. Also collapses the duplicate CHANGELOG headings the union merge driver left in the unreleased block (four Added, two each of Fixed, Changed and Deprecated) and moves the #194 refactor bullet from Fixed to Changed. RELEASING step 1 exists to catch exactly that; merge=union is line-based, not section-aware, so git will never flag it. Local gate: 1977 passed, 4 skipped, 97.99% total coverage against the 92% floor, riskcov 98% against 93, python -m build plus twine check --strict both PASSED on the 0.7.1 wheel and sdist.
|
Local gate, run against the editable install after reinstalling so the metadata version matches the bumped Exit code 0 on all of them. The premise was checked against the published wheel rather than assumed, in a clean venv from a neutral cwd: So none of the unreleased block is in 0.7.0, which is what makes this a real release rather than a version-string bump. What this PR does not do: it does not tag, and it does not publish. After merge the tag goes on |
Cuts 0.7.1. Steps 1 to 5 of the RELEASING.md checklist; the tag and the release go on after this merges, and the Publish release click stays with the maintainer.
Why now, and why this is not just housekeeping
Notebooks 02 and 03 import
philanthropy.datasets.make_donor_panel, which does not exist in the published 0.7.0 wheel. Verified in a clean venv from a neutral cwd, because the repository root shadows site-packages and an earlier check run from the root reported the opposite:Both notebooks therefore fall into a
try/except ImportErrorthat pip-installs fromgit+...@main. Two consequences, and the second is the one a JOSS reviewer sees:from philanthropy.datasets import make_donor_panelleaves the old module cached insys.modules, so the re-import after a successful install raises the same error. It only works where philanthropy is absent entirely, which is fresh Colab. Anyone who followed the README'spip install philanthropyand then opened the notebook locally gets a hard failure.Releasing is the root-cause fix. The notebook install cells are a separate PR that merges only once 0.7.1 is actually on PyPI, because until then an unconditional
pip install "philanthropy[viz]>=0.7.1"would break fresh Colab too.The version number, which was not obvious
plan.mdsays 0.7.1. The source tree onmainalready said 0.8.0:_share_of_wallet.pydocumented the output rename as "Until 0.8.0 the column was namedsow_score" and warned "deprecated since 0.8.0", anddocs/reference/index.mdhad a "Live onmain(0.8.0)" heading. The two were written independently and never checked against each other.The unreleased block is minor-shaped by semver: new public API (
GiftIntervalCalibrator,metrics.interval_score,metrics.interval_report,datasets.make_donor_panel) plus a renamed output column. None of it is in 0.7.0.Shipping it as 0.7.1 is a deliberate, documented departure from this project's own versioning policy, taken because the alternative is worse. Cutting 0.8.0 makes three standing promises come due today: removing
WealthScreeningImputerKNN(group_col_idx=...), removingphilanthropy.utils.make_donor_dataset, and flipping theFiscalYearGroupedSplitterdrop_repeat_donorsdefault toTrue. That last one changes the default behaviour of the splitter this package's central argument rests on, six weeks before the merge freeze. Those stay queued for a real 0.8.0.The mitigation is that the rename is name-only:
ShareOfWalletScorer.transformcolumn 0 holds the same values in the same position, onlyget_feature_names_out()spells it differently, andget_legacy_feature_names_out()returns the old spelling under aDeprecationWarninguntil 0.9.0. Code reading the column positionally needs nothing.What changed here
pyproject.toml:0.7.0to0.7.1. Nothing else carries the runtime version;philanthropy.__version__reads installed metadata.CHANGELOG.md:## [Unreleased]becomes## [0.7.1] - 2026-09-08, with a fresh empty## [Unreleased]above it.publish.ymlrejects a heading still reading- TBD, so the date is load-bearing rather than cosmetic.CHANGELOG.mdheading cleanup, which is RELEASING step 1 doing its job..gitattributessetsmerge=unionon this file so concurrent PRs stop conflicting, and the cost is that git will never flag a problem in it again. The union driver had left the unreleased block with four### Addedheadings, two### Fixed, two### Changedand two### Deprecated. Collapsed to one of each in Keep a Changelog order. No bullet text was edited and none was dropped.### Fixed, and a deduplication with no behaviour change belongs under### Changed. Union merges are line-based, not section-aware, which is exactly the failure mode RELEASING step 1 says to eyeball for.CITATION.cff:versionanddate-released. The file's own comment saysversiontracks the newest published release, and the tag will point at this commit, so the archived citation has to name 0.7.1 rather than the release before it._share_of_wallet.pyanddocs/reference/index.md: the four strings that described the rename as arriving in 0.8.0 now say 0.7.1, including the liveDeprecationWarningtext users actually read. Every future promise still says 0.8.0 and is untouched:group_col_idx,utils.make_donor_dataset, and thedrop_repeat_donorsdefault.tests/test_deprecations.pystores removal versions only andtest_sow_score_still_works_and_warnsmatches on "removed in 0.9.0", so no test needed changing.docs/reference/index.mdalso stops telling readers thatpip install philanthropygives them 0.7.0.Not in this PR, on purpose
SECURITY.mdalready supports0.7.x, so 0.7.1 needs no edit there..zenodo.jsoncarries no version field; Zenodo reads it at deposit time.### Removed in 0.7.0section of the deprecations page stays as it is. Those removals did happen in 0.7.0.## [1.0.0] - TBDis left exactly where it sits. It is staged, not being cut, and the publish gate compares the tag against thepyproject.tomlof the commit the tag points at, so its presence changes nothing.Verification
Run locally against the editable install, after reinstalling so the metadata version matches the bumped
pyproject.toml:Output pasted in a comment below.