Build manylinux wheels; merge CI/release; migrate to uv - #11
Merged
Conversation
Add a PEP 517 [build-system] section so the cffi C extension builds in an isolated frontend, and rework the PyPI release workflow to build auditwheel-repaired manylinux/musllinux wheels via cibuildwheel 4.1.0 (covering CPython 3.9-3.14 and PyPy 3.9-3.11) alongside the sdist. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fold the release build/upload jobs into ci.yaml and add `release` to its triggers. The build_wheels/build_sdist/upload jobs `needs` the lint+test jobs and are gated with `if: github.event_name == 'release'`, so a release is published only after its tests pass. Deletes pypi.yaml. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Drop end-of-life 3.7-3.9 and pypy3.8 from the CI matrix, add 3.12-3.14 and pypy3.10/3.11, so the tested versions match the wheels we publish. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the hand-pinned dev-requirements.txt with a PEP 735 [dependency-groups] dev group locked in uv.lock, and move package metadata from setup.py into a [project] table in pyproject.toml (setup.py is now a thin shim that only wires the cffi extension via cffi_modules and feeds the dunamai-bumped VERSION through `dynamic = ["version"]`). CI, the release jobs, and the docs workflow now use astral-sh/setup-uv with `uv sync` / `uv run` / `uvx` instead of pip. Bump requires-python to >=3.10 so the published wheels (cibuildwheel reads requires-python) match the tested versions. Modernize the ruff config ([tool.ruff.lint]) and `ruff check` CLI, and reformat build.py with current black. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ewjoachim
force-pushed
the
build-manylinux-wheels
branch
from
June 23, 2026 11:55
179d694 to
4bb88a3
Compare
Replace `twine upload` with `uv publish --trusted-publishing always` and grant the upload job `id-token: write`, so PyPI authenticates the release via OIDC. Drops the TWINE_USERNAME/TWINE_PASSWORD secrets. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ewjoachim
force-pushed
the
build-manylinux-wheels
branch
from
June 23, 2026 12:11
a80e461 to
e9339a3
Compare
fabien-marty
approved these changes
Jun 23, 2026
twine is no longer used now that publishing goes through pypa/gh-action-pypi-publish. It pulled keyring -> secretstorage -> cryptography, whose current release fails to build on PyPy 3.10 (pyo3/abi3 requires PyPy >= 3.11), breaking the pypy CI jobs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ewjoachim
force-pushed
the
build-manylinux-wheels
branch
from
June 23, 2026 13:36
f39122b to
a9aab1a
Compare
Group runs by branch/PR so pushing a new commit cancels the older in-progress run. Releases are exempt (cancel-in-progress is false for release events) so a publish in flight is never interrupted. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
We only build Linux wheels, so the one-entry os matrix was pure ceremony. Use runs-on: ubuntu-latest directly. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add macos-latest to the build_wheels matrix and configure separate arm64/x86_64 macOS wheels (arm64 built natively, x86_64 cross-compiled). Enable PyPy in cibuildwheel (opt-in since 4.x; gives pp311) and skip the free-threaded cp314t builds, keeping the shipped set aligned with the tested matrix. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This was referenced Jun 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #10.
Builds
auditwheel-repaired manylinux (+ musllinux) wheels on release via cibuildwheel 4.1.0, gated behind the test matrix, and migrates the dev/CI tooling to uv.1. manylinux wheels (#10)
pyproject.toml: PEP 517[build-system](setuptools + cffi) so the cffi extension builds in an isolated frontend, plus[tool.cibuildwheel](buildfrontend,pytestrun against each wheel, 64-bit-only Linux viaauto64).requires-pythonand builds CPython 3.10–3.14 + PyPy 3.10/3.11 — covering the cp3.14 + pp3.11 requested in Build manylinux wheels #10. 😉 auditwheel repair is automatic.2. One workflow, tested releases
pypi.yamlintoci.yaml(deletedpypi.yaml) and addedrelease: [created]to the triggers.build_wheels/build_sdist/uploadare gated withif: github.event_name == 'release', and the build jobsneeds: [linux_lint_and_test, macos_test]— a release is published only after its tests pass.3. Test matrix
4. Migrate to uv
dev-requirements.txt(cffi was pinned to 1.15.1, which can't build on 3.12+) with a PEP 735[dependency-groups]dev group locked inuv.lock.setup.pyinto a[project]table.setup.pyis now a thin shim: it only wires the cffi extension (cffi_modules, which has no pyproject equivalent) and feeds the dunamai-bumpedVERSIONviadynamic = ["version"].astral-sh/setup-uvwithuv sync/uv run/uvx/uv buildinstead of pip.[tool.ruff.lint],ruff check) and reformattedbuild.pywith current black. UpdatedCONTRIBUTING.md.Validation (locally, Python 3.14 via uv)
uv syncbuilds the extension;uv run invoke lint(ruff + black) passes;uv run invoke test --coverage→ 6/6 pass, 100% coverage.uv buildproduces a wheel + sdist; the wheel imports and computes correct FNV hashes; the sdist includesfnv.c/fnv.hso source installs still compile.ci.yaml/docs.yamlvalidated as well-formed YAML.Notes
requires-pythonis now>=3.10, so wheels and tested versions match. 3.7–3.9 are dropped entirely.🤖 Generated with Claude Code