diff --git a/.github/workflows/native-preview.yml b/.github/workflows/native-preview.yml index 161c54d9d42..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: @@ -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/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 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 = (