99 build-test :
1010 name : Build and test (${{ matrix.os }})
1111 runs-on : ${{ matrix.os }}
12+ env :
13+ HGRAPH_SMOKE_PYTHONS : " 3.12 3.13 3.14"
1214 strategy :
1315 fail-fast : false
1416 matrix :
1517 os : [ ubuntu-latest, macos-latest, windows-latest ]
1618 steps :
17- - uses : actions/checkout@v4
19+ - uses : actions/checkout@v6
1820
1921 - name : Restore uv/pip caches
20- uses : actions/cache@v4
22+ uses : actions/cache@v5.0.3
2123 with :
2224 path : |
2325 ~/.cache/uv
@@ -26,14 +28,14 @@ jobs:
2628 restore-keys : |
2729 ${{ runner.os }}-uvpip-
2830
29- # Install uv and Python 3.12 (aligns with hg_cpp approach)
30- - uses : astral-sh/setup-uv@v4
31+ # Build the ABI3 wheel against the 3.12 stable ABI baseline.
32+ - uses : astral-sh/setup-uv@v7.5.0
3133 with :
3234 python-version : ' 3.12'
3335
3436 # Ensure Conan is available for builds/tools
3537 - name : Install Conan via uv tool
36- run : uv tool install conan
38+ run : uv tool install --upgrade conan==2.26.2
3739
3840 # Build the wheel with nanobind stable ABI enabled
3941 - name : Build wheel (NB stable ABI, Windows MSVC)
6870 ls -la dist || true
6971
7072 - name : Upload built wheels (all OS)
71- uses : actions/upload-artifact@v4
73+ uses : actions/upload-artifact@v7.0.0
7274 with :
7375 name : wheels-${{ runner.os }}
7476 path : dist/**
@@ -97,93 +99,92 @@ jobs:
9799
98100 - name : Upload repaired Linux wheels (manylinux)
99101 if : runner.os == 'Linux'
100- uses : actions/upload-artifact@v4
102+ uses : actions/upload-artifact@v7.0.0
101103 with :
102104 name : wheels-linux-manylinux
103105 path : wheelhouse/**
104106 if-no-files-found : error
105107 retention-days : 7
106108
107- - name : Install built wheel into env (Windows)
109+ - name : Resolve built wheel path (Windows)
108110 if : runner.os == 'Windows'
109111 shell : pwsh
110112 run : |
111113 $wheel = (Get-ChildItem dist/*.whl | Select-Object -First 1).FullName
112114 if (-not $wheel) { Write-Error "No wheel found in dist/"; Get-ChildItem dist -Recurse; exit 1 }
113- uv pip install --upgrade pip
114- uv pip install "$wheel"
115+ "HGRAPH_WHEEL=$wheel" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
115116
116- - name : Install built wheel into env (Unix)
117+ - name : Resolve built wheel path (Unix)
117118 if : runner.os != 'Windows'
118119 shell : bash
119120 run : |
120121 set -euo pipefail
121- wheel=$(ls dist/*.whl | head -n1 || true)
122+ if [ "${RUNNER_OS}" = "Linux" ] && compgen -G "wheelhouse/*.whl" > /dev/null; then
123+ wheel=$(ls wheelhouse/*.whl | head -n1)
124+ else
125+ wheel=$(ls dist/*.whl | head -n1 || true)
126+ fi
122127 if [ -z "${wheel}" ]; then
123- echo "No wheel found in dist/ "
128+ echo "No wheel found for smoke/full-test install "
124129 ls -la dist || true
130+ ls -la wheelhouse || true
125131 exit 1
126132 fi
127- uv pip install --upgrade pip
128- uv pip install "${wheel}"
133+ echo "HGRAPH_WHEEL=${wheel}" >> "${GITHUB_ENV}"
129134
130- - name : Run smoke tests (macOS) [Python runtime]
131- if : runner.os == 'macOS'
132- shell : bash
133- env :
134- HGRAPH_USE_CPP : ' false'
135+ - name : Install built wheel into primary env (Windows)
136+ if : runner.os == 'Windows'
137+ shell : pwsh
135138 run : |
136- set -euo pipefail
137- echo "HGRAPH_USE_CPP=$HGRAPH_USE_CPP"
138- # Temporarily hide local hgraph/ to force use of installed wheel
139- mv hgraph hgraph_src
140- .venv/bin/pytest hgraph_unit_tests -q -m smoke || status=$?
141- mv hgraph_src hgraph
142- exit ${status:-0}
139+ uv pip install --upgrade pip
140+ uv pip install "$env:HGRAPH_WHEEL"
143141
144- - name : Run smoke tests (macOS) [C++ runtime]
145- if : runner.os == 'macOS '
142+ - name : Install built wheel into primary env (Unix)
143+ if : runner.os != 'Windows '
146144 shell : bash
147- env :
148- HGRAPH_USE_CPP : ' true'
149145 run : |
150146 set -euo pipefail
151- echo "HGRAPH_USE_CPP=$HGRAPH_USE_CPP"
152- # Temporarily hide local hgraph/ to force use of installed wheel
153- mv hgraph hgraph_src
154- .venv/bin/pytest hgraph_unit_tests -q -m smoke || status=$?
155- mv hgraph_src hgraph
156- exit ${status:-0}
147+ uv pip install --upgrade pip
148+ uv pip install "${HGRAPH_WHEEL}"
157149
158- - name : Run smoke tests (Windows) [Python runtime]
150+ - name : Run ABI3 smoke tests (Windows)
159151 if : runner.os == 'Windows'
160152 shell : pwsh
161- env :
162- HGRAPH_USE_CPP : ' false'
163153 run : |
164- Write-Host "HGRAPH_USE_CPP=$env:HGRAPH_USE_CPP"
165- # Temporarily hide local hgraph/ to force use of installed wheel
166154 Rename-Item hgraph hgraph_src
167155 try {
168- .venv\Scripts\pytest hgraph_unit_tests -q -m smoke
156+ foreach ($pyver in $env:HGRAPH_SMOKE_PYTHONS.Split(' ')) {
157+ $venvPython = Join-Path $PWD ".venv-smoke-$pyver\Scripts\python.exe"
158+ uv venv --clear ".venv-smoke-$pyver" --python $pyver
159+ uv pip install --python $venvPython --upgrade pip
160+ uv pip install --python $venvPython pytest tornado requests pandas "perspective-python<4.0.0" kafka-python matplotlib "$env:HGRAPH_WHEEL"
161+ foreach ($useCpp in @('false', 'true')) {
162+ Write-Host "Smoke test: python=$pyver HGRAPH_USE_CPP=$useCpp wheel=$env:HGRAPH_WHEEL"
163+ $env:HGRAPH_USE_CPP = $useCpp
164+ & (Join-Path $PWD ".venv-smoke-$pyver\Scripts\pytest.exe") hgraph_unit_tests -q -m smoke
165+ }
166+ }
169167 } finally {
168+ Remove-Item Env:HGRAPH_USE_CPP -ErrorAction SilentlyContinue
170169 Rename-Item hgraph_src hgraph
171170 }
172171
173- - name : Run smoke tests (Windows) [C++ runtime]
174- if : runner.os == 'Windows'
175- shell : pwsh
176- env :
177- HGRAPH_USE_CPP : ' true'
172+ - name : Run ABI3 smoke tests (Unix)
173+ if : runner.os != 'Windows'
174+ shell : bash
178175 run : |
179- Write-Host "HGRAPH_USE_CPP=$env:HGRAPH_USE_CPP"
180- # Temporarily hide local hgraph/ to force use of installed wheel
181- Rename-Item hgraph hgraph_src
182- try {
183- .venv\Scripts\pytest hgraph_unit_tests -q -m smoke
184- } finally {
185- Rename-Item hgraph_src hgraph
186- }
176+ set -euo pipefail
177+ mv hgraph hgraph_src
178+ trap 'mv hgraph_src hgraph' EXIT
179+ for pyver in ${HGRAPH_SMOKE_PYTHONS}; do
180+ uv venv --clear ".venv-smoke-${pyver}" --python "${pyver}"
181+ uv pip install --python ".venv-smoke-${pyver}/bin/python" --upgrade pip
182+ uv pip install --python ".venv-smoke-${pyver}/bin/python" pytest tornado requests pandas "perspective-python<4.0.0" kafka-python matplotlib "${HGRAPH_WHEEL}"
183+ for use_cpp in false true; do
184+ echo "Smoke test: python=${pyver} HGRAPH_USE_CPP=${use_cpp} wheel=${HGRAPH_WHEEL}"
185+ HGRAPH_USE_CPP="${use_cpp}" ".venv-smoke-${pyver}/bin/pytest" hgraph_unit_tests -q -m smoke
186+ done
187+ done
187188
188189 - name : Run tests (Linux only) [Python runtime]
189190 if : runner.os == 'Linux'
@@ -242,7 +243,7 @@ jobs:
242243
243244 - name : Upload core dumps (Linux only)
244245 if : failure() && runner.os == 'Linux'
245- uses : actions/upload-artifact@v4
246+ uses : actions/upload-artifact@v7.0.0
246247 with :
247248 name : linux-core-dumps
248249 path : |
@@ -252,4 +253,3 @@ jobs:
252253 /home/runner/work/*/*/core*
253254 if-no-files-found : ignore
254255 retention-days : 7
255-
0 commit comments