Repository navigation
chore(release): bump KCL to v0.13.2 - #410
Merged
Merged
Conversation
Moves KCL_VERSION in go/install/install.go and every binding's package version from 0.13.1 to 0.13.2, now that kcl-lang/kcl has cut v0.13.2. The prebuilt binaries every binding vendors are downloaded from that release, so the runtime pin and the package version have to move together. The kcl-* git dependencies move with it for a second reason: they are unpinned to the default branch, whose workspace version is already 0.13.2, so the 0.13.1 requirement no longer resolves. Renames the lua rockspec to match the new package_version, which publish-luarocks.yaml globs for by name. Comments recording what changed *in* v0.13.1 (the LoadPackageResult fields, the ListDepFiles removal) are left alone; they are historical. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Peefy <xpf6677@163.com>
Moves pyo3 from the pinned 0.20.2 to 0.30, the first line with final Python 3.15 support, and gives the wheel jobs a Python dimension so a cp315 leg actually gets built. Closes #404. The pyo3 pin was `=0.20.2` because of PyO3/maturin#1960, where the action built against interpreters newer than pyo3's documented ceiling (3.12) and hard-failed. That issue closed in Feb 2024 once maturin 1.5 stopped detecting too-new interpreters, so the pin has been load-bearing for nothing for two years. cp313/cp314 only worked because the workflow also set PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1, which is exactly the escape hatch that issue was about; with 0.30 that variable is dropped. The only source change is the #[pymodule] signature, which takes &Bound<'_, PyModule> under the post-0.21 API. The &PyModule-to-Bound migration is otherwise the whole surface -- this crate uses two #[pyfunction]s and nothing else. requires-python moves 3.7 -> 3.9 to match pyo3 0.30's own floor. Note protobuf >=7.36.2 already requires >=3.10, so the cp37/cp38 wheels that were being published could not actually install; that pre-existing gap is unchanged by this commit. Verified locally on 3.14 with maturin 1.15.0: builds, 176 tests pass. The 3.15 legs themselves can only be exercised in CI. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Peefy <xpf6677@163.com>
Peefy
force-pushed
the
chore/kcl-0.13.2
branch
from
October 16, 2026 14:25
46833bd to
9068ece
Compare
maturin rejects the two together, so the Linux 3.15 leg died on `--find-interpreter cannot be used with --interpreter`. The pinned leg now passes `-i python3.15` alone and the default leg keeps `--find-interpreter` alone; previously the expression appended `-i` on top of an unconditional `--find-interpreter`. Caught by CI, not locally: the Linux job builds inside the manylinux container, while a local `maturin develop` is a host build that never passes `-i`. Windows 3.15 and the 3.15 test legs passed, which is why only the linux jobs failed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Peefy <xpf6677@163.com>
maturin's --find-interpreter means "build for every interpreter it finds", not "build for the default one". The runner images already carry a range: the manylinux container ships 3.9-3.15 plus free-threaded and PyPy, the macOS image carries 3.15. So the explicit 3.15 legs were rebuilding wheels the default legs had already produced, and macOS produced a byte-identical cp315 wheel under two artifact names, which collide once the release job merges artifacts. Windows is the exception: its image stops at 3.14, so that job now installs 3.15 explicitly. setup-python adds to what maturin discovers rather than replacing it, so 3.10-3.14 from the image are still built. The test job keeps its 3.x/3.15 matrix -- there the version selects what is exercised rather than what is packaged, so both legs are worth running. Signed-off-by: Peefy <xpf6677@163.com>
maturin-action cross-compiles aarch64 in ghcr.io/rust-cross/manylinux2014-cross:aarch64, whose /opt/python stops at CPython 3.14. --find-interpreter therefore reports 3.9-3.14, 3.14t and PyPy 3.11 there and never offers 3.15, even though the interpreter itself is present -- naming it explicitly resolves fine. The x86_64 leg is unaffected: it builds in the native manylinux image, which does ship 3.15. So after dropping the redundant 3.15 legs, aarch64 Linux shipped no 3.15 wheel at all -- the exact gap #404 asks to close. This restores it for aarch64 only, where it is the difference between having the wheel and not. The free-threaded 3.15t build is separate and non-fatal: the cross image may not carry 3.15t, and that should not take the cp315 wheel down with it. If it turns out to be present, the step can be made fatal. Signed-off-by: Peefy <xpf6677@163.com>
The step was non-fatal while it was a probe. CI confirms the cross image does carry 3.15t -- maturin just never offers it to --find-interpreter -- so the aarch64 artifact now matches x86_64 exactly: cp39, cp310-cp315, cp314t, cp315t and PyPy 3.11. Signed-off-by: Peefy <xpf6677@163.com>
protobuf 7.x -- the wheel's only runtime dependency -- requires Python >=3.10, so a 3.9 build of this wheel can never install: pip resolves protobuf, finds no compatible version, and refuses. Declaring >=3.9 let pip believe a 3.9 install was possible and then fail on the dependency rather than up front. The declared floor is now the one that actually works, and it is not a retreat -- the old floor of >=3.7 was already untrue, and the old >=3.9 was untrue for the same reason. maturin skips interpreters below requires-python during --find-interpreter rather than failing, so the Linux images' CPython 3.9 is simply not built any more. The published set goes from 31 wheels to 29: the two cp39 wheels go, and nothing else changes. Signed-off-by: Peefy <xpf6677@163.com>
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.
Two commits: the 0.13.2 version bump, and CPython 3.15 wheel support (#404).
1.
chore(release): bump KCL to v0.13.2KCL_VERSIONingo/install/install.goand every binding's package version from0.13.1to0.13.2, now that kcl-lang/kcl v0.13.2 is published. The runtime pin and the package version move together: the prebuilt binaries every binding vendors come from that release (seedocs/lib-vendoring.md).kcl-*git dependencies with it. They are unpinned to the default branch, whose workspace version is already0.13.2, so the0.13.1requirement no longer resolved — this part is a build fix, not cosmetics.lua/kcl_lib-0.13.1-3.rockspectokcl_lib-0.13.2-3.rockspec;publish-luarocks.yamlglobs for it by version and errors unless exactly one matches.Comments recording what changed in v0.13.1 are left alone — historical, not stale.
2.
feat(python): build wheels for CPython 3.15=0.20.2→0.30, the first line with final 3.15 support.>=1.5→>=1.14; CI pinsv1.15.0.requires-python3.7→3.10.The pyo3 pin was dead weight.
=0.20.2existed because of PyO3/maturin#1960 — the action built against interpreters newer than pyo3's documented ceiling (3.12) and hard-failed. That closed in Feb 2024 once maturin 1.5 stopped detecting too-new interpreters, so the pin has been constraining nothing for two years. cp313/cp314 only worked because the workflow also setPYO3_USE_ABI3_FORWARD_COMPATIBILITY=1, which is precisely the escape hatch that issue was about; that variable is now dropped.Source change is one line:
#[pymodule]takes&Bound<'_, PyModule>under the post-0.21 API. The crate is two#[pyfunction]s, so that migration is the entire surface.requires-pythonwas a lie in both directions. It said>=3.7, and protobuf 7.x — the wheel's only runtime dependency — requires>=3.10, so no build below 3.10 could ever install: pip resolves protobuf, finds no compatible version, and refuses. Declaring the floor that actually works means pip says no up front instead of failing halfway through. maturin skips interpreters belowrequires-pythonduring--find-interpreterrather than erroring, so the Linux images' CPython 3.9 simply stops being probed and the cp39 wheels are no longer built.How the cp315 wheel actually gets built
The wheel jobs pass
--find-interpreter, which means "build for every interpreter maturin can find", not "build for one". The runner images already cover a wide range — but three of the four platforms needed something more:quay.io/pypa/manylinux2014_x86_64(native)ghcr.io/rust-cross/manylinux2014-cross:aarch64(cross)actions/setup-pythonfor 3.15. setup-python adds to what maturin discovers rather than replacing it, so 3.10–3.14 are still built.--find-interpreternever offers them — it reports 3.10 through 3.14, 3.14t and PyPy 3.11 and stops. Naming them explicitly (-i python3.15,-i python3.15t) resolves, so the aarch64 leg builds those two wheels in separate steps.An earlier revision of this PR added a
python: [default, "3.15"]matrix dimension to all the wheel jobs. That was redundant for x86_64 and macOS and actively harmful: macOS produced a byte-identical cp315 wheel under two artifact names, and those collide once the release job merges artifacts. The dimension is gone. Thetestjob keeps its3.x/3.15matrix, where the version selects what is exercised rather than what is packaged — both legs are worth running there.Wheel coverage, 0.13.1 → 0.13.2
Every platform gains 3.15. The dropped 3.7/3.8/3.9 and older PyPy builds are all unusable — protobuf 7.x needs Python >= 3.10 — and they are gone because
requires-pythonnow excludes them, not because anything was dropped by hand.One thing worth a reviewer's eye
The release job's artifact download changed shape. It listed four artifacts by exact name, which would have needed hand-editing for every new Python version. It's now a single
pattern: wheels-*-<run_id>download withmerge-multiple. Thewheels-prefix deliberately excludes the sdist artifact, which was never published either before or after. This is the one change on the PyPI publishing path that isn't exercised by a normal PR run (releaseis tag-gated), so it's the thing most worth a second look.Test plan
cargo metadataresolves — the 0.13.2 git requirement builds the full graphmaturin developon Python 3.14 with pyo3 0.30.1 / maturin 1.15.0; 176 tests pass, 2 skippedtestjob still resolves its 3.x/3.15 matrix🤖 Generated with Claude Code