v0.2.2 — 2026-08-01
Fixed
- Release workflow aborted the PyPI upload with InvalidDistribution: Unknown distribution format: 'release-notes.txt'. The publish job downloads artifacts with merge-multiple into dist/, so the release-notes artifact landed alongside the wheels and twine refused the whole batch. Notes are now rendered from the checkout in the release job instead of being passed as an artifact, and the publish job asserts dist/ holds only .whl/.tar.gz before uploading.
- Source distribution was rejected by PyPI with 400 License-File LICENSE does not exist in distribution file. maturin writes License-File: LICENSE into the metadata and bundles the file into wheels, but does not copy it into the sdist tarball; it is now included explicitly via [tool.maturin] include. The 0.2.1 wheels published fine — only the sdist was missing, so source installs (any platform without a prebuilt wheel) failed.
Added
- Changelog is validated in CI with patchnotes (--strict), which annotates problems inline on the PR diff.
- GitHub Releases are now created from the changelog entry for the tagged version, so release notes and CHANGELOG.md cannot drift apart.
- scripts/release.py bumps CHANGELOG.md, pyproject.toml, and pygeospy/__init__.py together, which CI now enforces are in sync.
Changed
- .gitignore: removed a meaningless ~/.cache/pygeospy/ rule (ignore paths are repo-relative), scoped over-broad *.geojson/*.gpx/*_report.md globs to the repository root so genuine project files are not silently ignored, and dropped the blanket *.tar.gz that could hide test fixtures.
- README: corrected the install and build instructions, documented the pure-Python fallback honestly, and moved the roadmap out of the changelog.