From eb35b2d671e1193a5ca3f7ffb026476c5960b493 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:44:28 +0000 Subject: [PATCH 1/5] Initial plan From 683a18bc06f181ac19b4953f9d99c730aa5a101e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:55:23 +0000 Subject: [PATCH 2/5] Add add_note helper function and replace exc.add_note calls Co-authored-by: ev-br <2133832+ev-br@users.noreply.github.com> --- array_api_tests/pytest_helpers.py | 19 +++++++++++++ array_api_tests/test_array_object.py | 2 +- array_api_tests/test_creation_functions.py | 28 +++++++++---------- array_api_tests/test_data_type_functions.py | 28 +++++++++---------- .../test_manipulation_functions.py | 24 ++++++++-------- array_api_tests/test_searching_functions.py | 12 ++++---- array_api_tests/test_set_functions.py | 8 +++--- array_api_tests/test_sorting_functions.py | 4 +-- array_api_tests/test_statistical_functions.py | 18 ++++++------ 9 files changed, 81 insertions(+), 62 deletions(-) diff --git a/array_api_tests/pytest_helpers.py b/array_api_tests/pytest_helpers.py index 98d16f27..2735b4b6 100644 --- a/array_api_tests/pytest_helpers.py +++ b/array_api_tests/pytest_helpers.py @@ -11,6 +11,7 @@ from .typing import Array, DataType, Scalar, ScalarType, Shape __all__ = [ + "add_note", "raises", "doesnt_raise", "nargs", @@ -31,6 +32,24 @@ ] +def add_note(exc, note): + """ + Add a note to an exception in a backward-compatible way. + + For Python 3.11+, this uses the built-in exc.add_note() method. + For earlier versions, it manually appends to exc.__notes__. + """ + try: + exc.add_note(note) + except AttributeError: + if not hasattr(exc, "__notes__"): + try: + exc.__notes__ = [] + except AttributeError: + return # give up, might be e.g. a frozen dataclass + exc.__notes__.append(note) + + def raises(exceptions, function, message=""): """ Like pytest.raises() except it allows custom error messages diff --git a/array_api_tests/test_array_object.py b/array_api_tests/test_array_object.py index 007b3179..af575182 100644 --- a/array_api_tests/test_array_object.py +++ b/array_api_tests/test_array_object.py @@ -106,7 +106,7 @@ def test_getitem(shape, dtype, data): expected = xp.asarray(out_obj, dtype=dtype) ph.assert_array_elements("__getitem__", out=out, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @pytest.mark.unvectorized diff --git a/array_api_tests/test_creation_functions.py b/array_api_tests/test_creation_functions.py index d239194e..c55b2da4 100644 --- a/array_api_tests/test_creation_functions.py +++ b/array_api_tests/test_creation_functions.py @@ -196,7 +196,7 @@ def test_arange(dtype, data): out[0], xp.asarray(_start, dtype=out.dtype) ), f"out[0]={out[0]}, but should be {_start} {f_func}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -257,7 +257,7 @@ def test_asarray_scalars(shape, data): v = scalar_type(out[idx]) ph.assert_scalar_equals("asarray", type_=scalar_type, idx=idx, out=v, expected=v_expect, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise def scalar_eq(s1: Scalar, s2: Scalar) -> bool: @@ -323,7 +323,7 @@ def test_asarray_arrays(shape, dtypes, data): new_out_value, value ), f"{f_out}, but should be {value} after x was mutated" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -339,7 +339,7 @@ def test_empty(shape, kw): ph.assert_kw_dtype("empty", kw_dtype=kw["dtype"], out_dtype=out.dtype) ph.assert_shape("empty", out_shape=out.shape, expected=shape, kw=dict(shape=shape)) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -357,7 +357,7 @@ def test_empty_like(x, kw): ph.assert_kw_dtype("empty_like", kw_dtype=kw["dtype"], out_dtype=out.dtype) ph.assert_shape("empty_like", out_shape=out.shape, expected=x.shape) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @given( @@ -387,7 +387,7 @@ def test_eye(n_rows, n_cols, kw): expected = xp.reshape(expected, (n_rows, _n_cols)) ph.assert_array_elements("eye", out=out, expected=expected, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -455,7 +455,7 @@ def test_full(shape, fill_value, kw): ph.assert_shape("full", out_shape=out.shape, expected=shape, kw=dict(shape=shape)) ph.assert_fill("full", fill_value=fill_value, dtype=dtype, out=out, kw=dict(fill_value=fill_value)) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -476,7 +476,7 @@ def test_full_like(kw, data): ph.assert_shape("full_like", out_shape=out.shape, expected=x.shape) ph.assert_fill("full_like", fill_value=fill_value, dtype=dtype, out=out, kw=dict(fill_value=fill_value)) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise finite_kw = {"allow_nan": False, "allow_infinity": False} @@ -534,7 +534,7 @@ def test_linspace(num, dtype, endpoint, data): expected = expected[:-1] ph.assert_array_elements("linspace", out=out, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -563,7 +563,7 @@ def test_meshgrid(dtype, data): for i, x in enumerate(out): ph.assert_dtype("meshgrid", in_dtype=dtype, out_dtype=x.dtype, repr_name=f"out[{i}].dtype") except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -590,7 +590,7 @@ def test_ones(shape, kw): dtype = kw.get("dtype", None) or dh.default_float ph.assert_fill("ones", fill_value=make_one(dtype), dtype=dtype, out=out, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -611,7 +611,7 @@ def test_ones_like(x, kw): ph.assert_fill("ones_like", fill_value=make_one(dtype), dtype=dtype, out=out, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -638,7 +638,7 @@ def test_zeros(shape, kw): ph.assert_fill("zeros", fill_value=make_zero(dtype), dtype=dtype, out=out, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -660,5 +660,5 @@ def test_zeros_like(x, kw): ph.assert_fill("zeros_like", fill_value=make_zero(dtype), dtype=dtype, out=out, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise diff --git a/array_api_tests/test_data_type_functions.py b/array_api_tests/test_data_type_functions.py index ad1b551d..f6613b60 100644 --- a/array_api_tests/test_data_type_functions.py +++ b/array_api_tests/test_data_type_functions.py @@ -90,7 +90,7 @@ def test_astype(x_dtype, dtype, kw, data): # TODO: test values # TODO: test copy except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -124,7 +124,7 @@ def test_broadcast_arrays(shapes, data): ) # TODO: test values except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -145,7 +145,7 @@ def test_broadcast_to(x, data): ph.assert_shape("broadcast_to", out_shape=out.shape, expected=shape) # TODO: test values except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -168,7 +168,7 @@ def test_can_cast(_from, to): # check that the array library actually allows such casts. assert out == expected, f"{out=}, but should be {expected} {f_func}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -189,7 +189,7 @@ def test_finfo(dtype): assert isinstance(out.min, float) assert isinstance(out.smallest_normal, float) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @pytest.mark.min_version("2022.12") @@ -211,7 +211,7 @@ def test_finfo_dtype(dtype): assert out.dtype is not float assert out.dtype is not complex except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -230,7 +230,7 @@ def test_iinfo(dtype): assert isinstance(out.max, int) assert isinstance(out.min, int) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -245,7 +245,7 @@ def test_iinfo_dtype(dtype): assert not isinstance(out.dtype, str) assert out.dtype is not int except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -277,7 +277,7 @@ def test_isdtype(dtype, kind): break assert out == expected, f"{out=}, but should be {expected} [isdtype()]" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -290,7 +290,7 @@ def test_result_type(self, dtypes): out = xp.result_type(*dtypes) ph.assert_dtype("result_type", in_dtype=dtypes, out_dtype=out, repr_name="out") except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @given(pair=hh.pair_of_mutually_promotable_dtypes(None)) @@ -312,7 +312,7 @@ def test_arrays_and_dtypes(self, pair, data): out = xp.result_type(*a_and_dt) ph.assert_dtype("result_type", in_dtype=s1+s2, out_dtype=out, repr_name="out") except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @given(dtypes=hh.mutually_promotable_dtypes(2), data=st.data()) @@ -333,7 +333,7 @@ def test_with_scalars(self, dtypes, data): else: raise ValueError(f"unknown dtype {out = }.") except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise scalar = data.draw(st.sampled_from(scalars)) @@ -344,7 +344,7 @@ def test_with_scalars(self, dtypes, data): out_scalar = xp.result_type(*inputs) assert out_scalar == out except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise # retry with arrays @@ -356,5 +356,5 @@ def test_with_scalars(self, dtypes, data): out_scalar = xp.result_type(*inputs) assert out_scalar == out except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise diff --git a/array_api_tests/test_manipulation_functions.py b/array_api_tests/test_manipulation_functions.py index 0a52be40..3af7b959 100644 --- a/array_api_tests/test_manipulation_functions.py +++ b/array_api_tests/test_manipulation_functions.py @@ -118,7 +118,7 @@ def test_concat(dtypes, base_shape, data): kw=kw, ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -152,7 +152,7 @@ def test_expand_dims(x, axis): "expand_dims", x, x_indices=sh.ndindex(x.shape), out=out, out_indices=sh.ndindex(out.shape) ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -202,7 +202,7 @@ def test_moveaxis(x, data): "moveaxis", x, x_indices=sh.ndindex(x.shape), out=out, out_indices=permuted_indices ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -245,7 +245,7 @@ def test_squeeze(x, data): assert_array_ndindex("squeeze", x, x_indices=sh.ndindex(x.shape), out=out, out_indices=sh.ndindex(out.shape)) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -275,7 +275,7 @@ def test_flip(x, data): assert_array_ndindex("flip", x, x_indices=indices, out=out, out_indices=reverse_indices, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -310,7 +310,7 @@ def test_permute_dims(x, axes): assert_array_ndindex("permute_dims", x, x_indices=indices, out=out, out_indices=permuted_indices) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @pytest.mark.min_version("2023.12") @@ -378,7 +378,7 @@ def test_repeat(x, kw, data): start = end except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -406,7 +406,7 @@ def test_reshape(x, shape): assert_array_ndindex("reshape", x, x_indices=sh.ndindex(x.shape), out=out, out_indices=sh.ndindex(out.shape)) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -460,7 +460,7 @@ def test_roll(x, data): shifted_indices = roll_ndindex(x.shape, shifts, axes) assert_array_ndindex("roll", x, x_indices=sh.ndindex(x.shape), out=out, out_indices=shifted_indices, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -512,7 +512,7 @@ def test_stack(shape, dtypes, kw, data): kw=kw, ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -540,7 +540,7 @@ def test_tile(x, data): assert out.shape == tuple(r*s for r, s in zip(R, S)) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @pytest.mark.min_version("2023.12") @@ -571,5 +571,5 @@ def test_unstack(x, data): idx[axis] = i ph.assert_array_elements("unstack", out=arr, expected=x[tuple(idx)], kw=kw, out_repr=f"out[{i}]") except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise diff --git a/array_api_tests/test_searching_functions.py b/array_api_tests/test_searching_functions.py index 8df475d8..d4ba1295 100644 --- a/array_api_tests/test_searching_functions.py +++ b/array_api_tests/test_searching_functions.py @@ -53,7 +53,7 @@ def test_argmax(x, data): ph.assert_scalar_equals("argmax", type_=int, idx=out_idx, out=max_i, expected=expected, kw=kw) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -94,7 +94,7 @@ def test_argmin(x, data): expected = min(range(len(elements)), key=elements.__getitem__) ph.assert_scalar_equals("argmin", type_=int, idx=out_idx, out=min_i, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -145,7 +145,7 @@ def test_count_nonzero(x, data): expected = sum(el != 0 for el in elements) ph.assert_scalar_equals("count_nonzero", type_=int, idx=out_idx, out=count, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -194,7 +194,7 @@ def test_nonzero(x): idx == indices[i] ), f"{f_idx} is in the wrong position, should be {indices.index(idx)}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -236,7 +236,7 @@ def test_where(shapes, dtypes, data): out_val=out[idx] ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -275,5 +275,5 @@ def test_searchsorted(data): ) # TODO: shapes and values testing except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise diff --git a/array_api_tests/test_set_functions.py b/array_api_tests/test_set_functions.py index 4ca046cf..8a6f7a9d 100644 --- a/array_api_tests/test_set_functions.py +++ b/array_api_tests/test_set_functions.py @@ -116,7 +116,7 @@ def test_unique_all(x): expected = sum(v for k, v in counts.items() if cmath.isnan(k)) assert nans == expected, f"{nans} NaNs in out, but should be {expected}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -168,7 +168,7 @@ def test_unique_counts(x): expected = sum(v for k, v in counts.items() if cmath.isnan(k)) assert nans == expected, f"{nans} NaNs in out, but should be {expected}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @given(hh.arrays(dtype=hh.all_dtypes, shape=hh.shapes(min_side=1))) @@ -225,7 +225,7 @@ def test_unique_inverse(x): expected = xp.sum(xp.astype(xp.isnan(x), xp.uint8)) assert nans == expected, f"{nans} NaNs in out.values, but should be {expected}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -254,5 +254,5 @@ def test_unique_values(x): expected = xp.sum(xp.astype(xp.isnan(x), xp.uint8)) assert nans == expected, f"{nans} NaNs in out, but should be {expected}" except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise diff --git a/array_api_tests/test_sorting_functions.py b/array_api_tests/test_sorting_functions.py index 97121a3e..eaff696b 100644 --- a/array_api_tests/test_sorting_functions.py +++ b/array_api_tests/test_sorting_functions.py @@ -92,7 +92,7 @@ def test_argsort(x, data): "argsort", idx=idx, out=out_o, set_=set(expected_orders), kw=kw ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @pytest.mark.unvectorized @@ -147,5 +147,5 @@ def test_sort(x, data): kw=kw, ) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise diff --git a/array_api_tests/test_statistical_functions.py b/array_api_tests/test_statistical_functions.py index 58204e78..c3623466 100644 --- a/array_api_tests/test_statistical_functions.py +++ b/array_api_tests/test_statistical_functions.py @@ -93,7 +93,7 @@ def test_cumulative_sum(x, data): idx=out_idx.raw, out=out_val, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -154,7 +154,7 @@ def test_cumulative_prod(x, data): #TODO: add value testing of cumulative_prod except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -197,7 +197,7 @@ def test_max(x, data): expected = max(elements) ph.assert_scalar_equals("max", type_=scalar_type, idx=out_idx, out=max_, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -224,7 +224,7 @@ def test_mean(x, data): ) # Values testing mean is too finicky except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -260,7 +260,7 @@ def test_min(x, data): expected = min(elements) ph.assert_scalar_equals("min", type_=scalar_type, idx=out_idx, out=min_, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -334,7 +334,7 @@ def test_prod(x, data): ph.assert_scalar_isclose("prod", type_=scalar_type, idx=out_idx, out=prod, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -376,7 +376,7 @@ def test_std(x, data): ) # We can't easily test the result(s) as standard deviation methods vary a lot except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -451,7 +451,7 @@ def test_sum(x, data): assume(condition_number < 1e6) ph.assert_scalar_isclose("sum", type_=scalar_type, idx=out_idx, out=sum_, expected=expected) except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise @@ -494,5 +494,5 @@ def test_var(x, data): ) # We can't easily test the result(s) as variance methods vary a lot except Exception as exc: - exc.add_note(repro_snippet) + ph.add_note(exc, repro_snippet) raise From f450b95cd71818c9f6e9d66418c0975e1bed3bde Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 14:57:15 +0000 Subject: [PATCH 3/5] Fix docstring formatting in add_note function Co-authored-by: ev-br <2133832+ev-br@users.noreply.github.com> --- array_api_tests/pytest_helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/array_api_tests/pytest_helpers.py b/array_api_tests/pytest_helpers.py index 2735b4b6..462bfef6 100644 --- a/array_api_tests/pytest_helpers.py +++ b/array_api_tests/pytest_helpers.py @@ -35,7 +35,7 @@ def add_note(exc, note): """ Add a note to an exception in a backward-compatible way. - + For Python 3.11+, this uses the built-in exc.add_note() method. For earlier versions, it manually appends to exc.__notes__. """ From c3bd3999b5bc537bda7426cd0be5e8ec07479627 Mon Sep 17 00:00:00 2001 From: Evgeni Burovski Date: Mon, 24 Nov 2025 16:02:40 +0100 Subject: [PATCH 4/5] DOC: add an origin link to the `add_note` backwards compat workaround --- array_api_tests/pytest_helpers.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/array_api_tests/pytest_helpers.py b/array_api_tests/pytest_helpers.py index 462bfef6..be601770 100644 --- a/array_api_tests/pytest_helpers.py +++ b/array_api_tests/pytest_helpers.py @@ -38,6 +38,8 @@ def add_note(exc, note): For Python 3.11+, this uses the built-in exc.add_note() method. For earlier versions, it manually appends to exc.__notes__. + + https://github.com/HypothesisWorks/hypothesis/issues/4606#issuecomment-3568140174 """ try: exc.add_note(note) From d9428097ced3a338a66de058ad5a639b64348aec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 24 Nov 2025 15:08:20 +0000 Subject: [PATCH 5/5] Add Python 3.10 to test matrix Co-authored-by: ev-br <2133832+ev-br@users.noreply.github.com> --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f9c026f5..e3318c78 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,7 +8,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.12", "3.13"] + python-version: ["3.10", "3.12", "3.13"] steps: - name: Checkout array-api-tests