From 3820a4d9a9c18b539d48a7ce34cbe903cd5d666d Mon Sep 17 00:00:00 2001 From: Taewoon Kim Date: Sun, 25 Oct 2026 20:20:20 +0900 Subject: [PATCH 1/2] Native parity: give the test environment setuptools, which test_wheel_packages.py needs tests/test_wheel_packages.py runs `setup.py build_py` on a copy of the sources. The parity job's `uv run --no-project --python 3.12 --with ...` environment has no setuptools: Python 3.12 does not ship it, and only the Ubuntu runners' system Python happens to carry one. On windows-x64 and macos-arm64 both tests failed with `ModuleNotFoundError: No module named 'setuptools'` (runs 40102813583 and 40109358404; every other file passed, 969 tests on Windows), which turned the required macos-arm64 gate red as well. Add `--with setuptools` to the parity run, as pyproject.toml already does for the JVM test extra. The second test also starts a child with an environment of only PATH; pass SYSTEMROOT through on Windows, where a child without it cannot import socket. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/native-preview.yml | 4 +++- bindings/python/tests/test_wheel_packages.py | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/native-preview.yml b/.github/workflows/native-preview.yml index 161c54d9d42..b28c855a0e1 100644 --- a/.github/workflows/native-preview.yml +++ b/.github/workflows/native-preview.yml @@ -495,6 +495,8 @@ jobs: # The tests of this checkout run with `arcadedb_embedded` aliased to the installed `arcadedb_native` (parity/alias), in a clean # environment that contains the wheel and the test dependencies, not the source tree. The same dependency set as the preview chain. + # setuptools is one of them: tests/test_wheel_packages.py runs `setup.py build_py`, and a Python 3.12 environment has no setuptools + # (the Ubuntu runners' system Python happens to have one; the macOS and Windows runners' Python does not, so both failed on it). - name: Run the parity suite run: | set -euo pipefail @@ -503,7 +505,7 @@ jobs: cores="$(nproc 2>/dev/null || sysctl -n hw.ncpu)" uv run --no-project --python 3.12 --with "$w" --with pytest --with numpy --with requests --with jpype1 --with pyarrow \ --with polars --with pandas --with duckdb --with networkx --with "psycopg[binary]" --with adbc-driver-postgresql \ - --with redis --with neo4j --with ladybug \ + --with redis --with neo4j --with ladybug --with setuptools \ python bindings/python/native-wheel/parity/parity_wheel.py --repo "$GITHUB_WORKSPACE" \ --alias "$GITHUB_WORKSPACE/bindings/python/native-wheel/parity/alias" --backend native \ --out "$T/parity/parity-wheel.tsv" --cores "0-$((cores - 1))" | tee "$T/parity/parity-wheel.run.log" diff --git a/bindings/python/tests/test_wheel_packages.py b/bindings/python/tests/test_wheel_packages.py index 3dcf9bb0b94..f8d4602fb37 100644 --- a/bindings/python/tests/test_wheel_packages.py +++ b/bindings/python/tests/test_wheel_packages.py @@ -61,6 +61,9 @@ def test_backend_selection_imports_without_native_library(tmp_path): """A fresh interpreter, as the wheel's ``test_install.py`` runs: the JVM backend is the default.""" root = _built_root(tmp_path) env = {"PATH": os.environ["PATH"]} + if "SYSTEMROOT" in os.environ: + # Windows: a child process without SYSTEMROOT cannot import socket (winsock does not initialise), and any dependency may. + env["SYSTEMROOT"] = os.environ["SYSTEMROOT"] if root is not None: env["PYTHONPATH"] = str(root) code = ( From 9729abceef322a73d72c5a04c8ed01f7264134f4 Mon Sep 17 00:00:00 2001 From: Taewoon Kim Date: Sun, 25 Oct 2026 20:20:54 +0900 Subject: [PATCH 2/2] Native release: windows-x64 becomes a required platform Add windows-x64 to REQUIRED_PLATFORMS, so a native-v* tag publishes only when the Windows parity run also passed, and update the release notes. Windows already built its wheel and passed 969 tests on the installed wheel; its only red were the two test_wheel_packages.py tests fixed in the previous commit. Co-Authored-By: Claude Sonnet 5.5 --- .github/workflows/native-preview.yml | 2 +- bindings/python/docs/development/release.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/native-preview.yml b/.github/workflows/native-preview.yml index b28c855a0e1..36b2f8c9a00 100644 --- a/.github/workflows/native-preview.yml +++ b/.github/workflows/native-preview.yml @@ -55,7 +55,7 @@ env: PYTHONUTF8: "1" # Windows defaults to cp1252; the notices contain non-ASCII author names # The platforms (matrix keys) whose parity run must pass before a tag publishes. Others publish too when they passed, and are only # informational otherwise. Promote a platform here once it is green. - REQUIRED_PLATFORMS: "linux-x86_64 linux-aarch64 macos-arm64" + REQUIRED_PLATFORMS: "linux-x86_64 linux-aarch64 macos-arm64 windows-x64" jobs: version: diff --git a/bindings/python/docs/development/release.md b/bindings/python/docs/development/release.md index b20bcec9095..3df4d207e21 100644 --- a/bindings/python/docs/development/release.md +++ b/bindings/python/docs/development/release.md @@ -219,7 +219,7 @@ The native preview is a second package built from the `native-preview` branch: d | `macos-arm64` | `macos-15` (7 GB: `-J-Xmx5g`, `-H:NumberOfThreads=2`) | on the runner | `macosx__arm64` (minos read from the load commands) | `libarcadedb.dylib` | | `windows-x64` | `windows-latest` (MSVC environment from `vcvars64.bat`) | on the runner | `win_amd64` | `libarcadedb.dll` | -- **Which platforms gate a release**: the single list `REQUIRED_PLATFORMS` at the top of the workflow (now `linux-x86_64 linux-aarch64 macos-arm64`, each green in runs 10 and 11; `windows-x64` is not yet in it). The publish job fails without a passed parity run for each listed platform, and then uploads every wheel that passed, required or not. Add a platform to the list when it is green. +- **Which platforms gate a release**: the single list `REQUIRED_PLATFORMS` at the top of the workflow (now `linux-x86_64 linux-aarch64 macos-arm64 windows-x64`; the first three were green in runs 10 and 11, and `windows-x64` joined once its parity run passed all 969 tests on the installed wheel after the `setuptools` fix). The publish job fails without a passed parity run for each listed platform, and then uploads every wheel that passed, required or not. Add a platform to the list when it is green. - **Why its own PyPI name**: PyPI keeps one file per name, version and platform tag, so a native build cannot sit beside the JVM wheel under `arcadedb-embedded`. The name goes away when the bindings move to `arcadedb` on PyPI. ## Python Versioning Strategy