)]}'
{
  "commit": "3d4c56c0757ddc0372ced03ffa97a13ea50d1bd8",
  "tree": "8f2db8f7e47dbb7331eeb46cbb3273b9e5b54f0c",
  "parents": [
    "0840763851e47a40676dc47b29f5f3a62b0127d7"
  ],
  "author": {
    "name": "Tim Saucer",
    "email": "timsaucer@gmail.com",
    "time": "Fri May 29 16:53:19 2026 -0400"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri May 29 16:53:19 2026 -0400"
  },
  "message": "feat: create free-threaded python wheels (#1553)\n\n* Initial commit for free threaded python support\n\n* ci: use uvx to run maturin in native wheel builds\n\nThe free-threaded matrix entries skip `uv sync` to avoid resolving\nproject dependencies against cp313t/cp314t (many dev deps lack\nfree-threaded wheels), so `uv run --no-project maturin` failed on\nmacOS/Windows with \"Failed to spawn: `maturin`\". Switch to\n`uvx maturin@1.8.1`, which runs maturin in an isolated tool env\nindependent of the project venv and matches the pin used by\nmaturin-action for manylinux builds.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci: resolve free-threaded interpreter path explicitly on Windows\n\nmaturin\u0027s `--interpreter python3.14t` fails on Windows because the\nfree-threaded build ships as plain `python.exe` (no `tN` suffix). Look\nup `sys.executable` of the python on PATH (which actions/setup-python\nprepends with the free-threaded install), assert\n`Py_GIL_DISABLED \u003d\u003d 1` so a misconfigured PATH can\u0027t silently build a\nGIL wheel, and normalize backslashes to forward slashes so the path\nsurvives re-expansion in the downstream `run:` line.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* build: enable PyO3 generate-import-lib for Windows free-threaded wheels\n\nWindows free-threaded Python does not expose `abiflags` in sysconfig,\nso PyO3\u0027s default Windows linkage path fails with \"A python 3\ninterpreter on Windows does not define abiflags in its sysconfig ಠ_ಠ\"\nwhen building cp31Xt wheels. Enabling the `generate-import-lib` PyO3\nfeature switches Windows builds to a generated import library\n(provided by the `python3-dll-a` crate) that does not depend on a\nfully populated sysconfig. It is a no-op on macOS and Linux and is\ncompatible with the existing `abi3` feature.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci: bump maturin to 1.13.3 for Windows free-threaded support\n\nmaturin 1.8.1 errors out on Windows free-threaded interpreters with\n\"A python 3 interpreter on Windows does not define abiflags in its\nsysconfig\" even when given a valid `python.exe`. Newer maturin\nreleases handle the missing abiflags gracefully for cp31Xt builds.\nBump both the `uvx maturin@` pin used for native macOS/Windows wheels\nand the `maturin-version` passed to PyO3/maturin-action for the\nmanylinux containers.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* ci: standardize wheel build job names as \"\u003cOS\u003e \u003carch\u003e (\u003ctag\u003e)\"\n\nThe mac/Windows matrix shared a single name template that prepended\n\"macOS arm64 \u0026 Windows\" to every entry, which got truncated in the\nGitHub UI sidebar and made it hard to tell macOS and Windows runs\napart. Rename all wheel build jobs to the same pattern so the OS,\narchitecture, and python tag are visible at a glance:\n\n- Linux x86_64 / arm64\n- macOS arm64 / x86_64\n- Windows x86_64\n\nCo-Authored-By: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e\n\n* taplo fmt\n\n* build: move pygithub to release group to fix free-threaded wheel builds\n\npygithub pulls in cryptography via pyjwt[crypto]. cryptography 44.0.0\nships only abi3 wheels, which free-threaded interpreters cannot use, so\nuv builds it from sdist; its bundled PyO3 0.23.2 caps at Python 3.13 and\nfails on 3.14t. pygithub is only used by the manual release changelog\nscript, so move it out of the dev group into a new release group.\n\u0027uv sync --dev\u0027 (used by CI test jobs) no longer drags in cryptography.\n\n* ci: pin uv venv to setup-python interpreter for free-threaded jobs\n\nPassing a bare version like \u00273.13t\u0027 to \u0027uv venv --python\u0027 let uv fall\nback to a different system interpreter (3.12), creating a venv whose ABI\ndid not match the downloaded cp313t wheel and failing the install. Use\nthe python-path output from setup-python so the venv uses exactly the\ninterpreter that was set up.\n\n* taplo fmt\n\n* ci: set UV_PYTHON so uv sync keeps the free-threaded interpreter\n\nPinning only \u0027uv venv --python\u0027 was not enough: \u0027uv sync\u0027 ignores the\nexisting .venv, runs its own interpreter discovery, and recreated the\nvenv with the system 3.12, again mismatching the cp313t wheel. Set\nUV_PYTHON to the setup-python interpreter for the install and test\nsteps so every uv command (venv, sync, pip, run) uses it.\n\n* ci: run tests from the .venv, not the bare setup-python interpreter\n\nSetting UV_PYTHON on the test step pointed \u0027uv run --no-project pytest\u0027\nat the setup-python interpreter, which has no pytest installed, causing\n\u0027Failed to spawn: pytest\u0027. UV_PYTHON is only needed in the install step\nto build the .venv with the right interpreter; the test step must use\nthat .venv. Drop UV_PYTHON from the test step.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* ci: install datafusion wheel into the activated .venv\n\nSetting UV_PYTHON as a step env split the install across two\nenvironments: \u0027uv sync\u0027 populated .venv while \u0027uv pip install\u0027 targeted\nthe bare setup-python interpreter, so the datafusion wheel never landed\nin .venv and \u0027import datafusion\u0027 failed under pytest. Pin the\ninterpreter at \u0027uv venv --python\u0027, activate the venv, and pass --active\nto \u0027uv sync\u0027 so sync and pip install both target the same .venv.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n* ci: point uv at the venv interpreter by path for free-threaded jobs\n\nActivating the venv and passing --active still let \u0027uv sync\u0027 run its own\ninterpreter discovery, which skips free-threaded builds and re-picked the\nsystem 3.12, recreating .venv and breaking the cp313t/cp314t wheel\ninstall. Pass the venv\u0027s own interpreter (.venv/bin/python) explicitly to\n\u0027uv sync\u0027, \u0027uv pip install\u0027, and \u0027uv run\u0027 so every step stays in the\nfree-threaded environment created by \u0027uv venv\u0027.\n\nCo-Authored-By: Claude \u003cnoreply@anthropic.com\u003e\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) \u003cnoreply@anthropic.com\u003e",
  "tree_diff": [
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "25f75d1f874ecb76b9cdd1958383776c8176532b",
      "new_mode": 33188,
      "new_path": ".github/actions/build-wheel/action.yml"
    },
    {
      "type": "modify",
      "old_id": "37a9dba03ca5bf22201fdf0cf74833da58bea4d2",
      "old_mode": 33188,
      "old_path": ".github/workflows/build.yml",
      "new_id": "593a343e18c5380204576841880ae069d3e3c237",
      "new_mode": 33188,
      "new_path": ".github/workflows/build.yml"
    },
    {
      "type": "modify",
      "old_id": "2cd792ea9354fa0e6f902d33f159d9528d4223ba",
      "old_mode": 33188,
      "old_path": ".github/workflows/test.yml",
      "new_id": "0c8fa4f79ac1f9c53a7202786c807d1b9dce54c1",
      "new_mode": 33188,
      "new_path": ".github/workflows/test.yml"
    },
    {
      "type": "modify",
      "old_id": "6a1ef2447f807ebb4ac647626b2fec6b6f4951dd",
      "old_mode": 33188,
      "old_path": "Cargo.lock",
      "new_id": "d3cedb6287d5a587a52d074ef1966b3d688b866b",
      "new_mode": 33188,
      "new_path": "Cargo.lock"
    },
    {
      "type": "modify",
      "old_id": "d714dc9780f14793e3ddec94d554a41c7d8ced40",
      "old_mode": 33188,
      "old_path": "crates/core/Cargo.toml",
      "new_id": "1f5b4e305bbf9ffdaa3d3f1a33d76873d94fd442",
      "new_mode": 33188,
      "new_path": "crates/core/Cargo.toml"
    },
    {
      "type": "modify",
      "old_id": "1b02ca576faa7c87f7300ef92ae9077c2d99b86a",
      "old_mode": 33188,
      "old_path": "dev/release/README.md",
      "new_id": "384ef92109f6976115d72091bdfbe2e68b79a97f",
      "new_mode": 33188,
      "new_path": "dev/release/README.md"
    },
    {
      "type": "modify",
      "old_id": "418640a49a87b3da085a12f4e7f4654a3c5fac15",
      "old_mode": 33188,
      "old_path": "pyproject.toml",
      "new_id": "2b6a976dbd53a038a039d9c9f4df7dd317912a23",
      "new_mode": 33188,
      "new_path": "pyproject.toml"
    },
    {
      "type": "modify",
      "old_id": "26ab8b20ef7a069c8c384813a0ae3a2c9d1e5f2a",
      "old_mode": 33188,
      "old_path": "uv.lock",
      "new_id": "6673b7fe2b0f200d0674dd9e5cf8d721212a83ef",
      "new_mode": 33188,
      "new_path": "uv.lock"
    }
  ]
}
