test: let the interop suites find a Python that actually has h5py
Every Python interop suite had stopped running on this machine: the h5py writer round-trips, the facade suite, netCDF4 and the reference files. `python3` is 3.14, nothing on the box has h5py, and PEP 668 refuses to install it into a system interpreter at all — so the availability probes all returned false and each suite skipped without failing. A silent skip here is exactly how the v5 compound-datatype bug reached a release, so the probes now read `CLAWHDF5_PYTHON` and `ci-test.sh` picks up `.venv/bin/python` on its own. The detection sits at the top of the script rather than beside the interop step, because the non-ignored suites run in the earlier `cargo test` step and would otherwise still miss it. `CLAWHDF5_REQUIRE_INTEROP=1` continues to turn a skip into a failure. Verified against a venv with h5py 3.16 / HDF5 2.0.0: 94 interop tests across the four suites, all passing. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
@@ -4,9 +4,18 @@
|
||||
//! (and vice versa). They require python3 + h5py to be installed.
|
||||
|
||||
use clawhdf5_format::file_writer::{AttrValue, CompoundTypeBuilder, EnumTypeBuilder, FileWriter};
|
||||
/// The Python interpreter to drive interop checks with.
|
||||
///
|
||||
/// `CLAWHDF5_PYTHON` lets these run against a virtualenv holding h5py, which
|
||||
/// on a PEP 668 "externally managed" system is the only place it can be
|
||||
/// installed. Without it the suite silently skips, and a silent skip here is
|
||||
/// how a datatype bug once reached a release.
|
||||
fn python() -> String {
|
||||
std::env::var("CLAWHDF5_PYTHON").unwrap_or_else(|_| "python3".to_string())
|
||||
}
|
||||
|
||||
fn h5py_available() -> bool {
|
||||
std::process::Command::new("python3")
|
||||
std::process::Command::new(python())
|
||||
.args(["-c", "import h5py"])
|
||||
.output()
|
||||
.map(|o| o.status.success())
|
||||
@@ -17,10 +26,10 @@ fn h5py_read(_path: &std::path::Path, script: &str) -> String {
|
||||
if !h5py_available() {
|
||||
panic!("h5py not installed — skipping interop test");
|
||||
}
|
||||
let o = std::process::Command::new("python3")
|
||||
let o = std::process::Command::new(python())
|
||||
.args(["-c", script])
|
||||
.output()
|
||||
.expect("python3");
|
||||
.expect("python interpreter");
|
||||
if !o.status.success() {
|
||||
panic!("h5py: {}", String::from_utf8_lossy(&o.stderr));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user