diff --git a/.dprint.jsonc b/.dprint.jsonc index c3642905..5863e35f 100644 --- a/.dprint.jsonc +++ b/.dprint.jsonc @@ -7,9 +7,6 @@ "lineWidth": 200, "emphasisKind": "asterisks", }, - "toml": { - "lineWidth": 100, - }, "yaml": { "printWidth": 100, "formatComments": true, @@ -20,6 +17,5 @@ "https://plugins.dprint.dev/g-plane/pretty_yaml-v0.5.1.wasm", "https://plugins.dprint.dev/json-0.20.0.wasm", "https://plugins.dprint.dev/markdown-0.19.0.wasm", - "https://plugins.dprint.dev/toml-0.7.0.wasm", ], } diff --git a/lefthook.yml b/lefthook.yml index 57fdcc5d..ced63a7e 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -20,9 +20,13 @@ pre-commit: parallel: true jobs: - name: dprint - glob: "*.{json,jsonc,md,toml,yaml,yml}" + glob: "*.{json,jsonc,md,yaml,yml}" stage_fixed: true run: pixi {run} dprint + - name: tombi + glob: "*.toml" + stage_fixed: true + run: pixi {run} tombi - name: ruff glob: "*.{py,pyi}" stage_fixed: true diff --git a/pixi.lock b/pixi.lock index 077a273c..15ecd54c 100644 --- a/pixi.lock +++ b/pixi.lock @@ -302,6 +302,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/tombi-1.2.6-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/typos-1.49.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda @@ -598,6 +599,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/sleef-3.9.0-h289094c_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tbb-2021.13.0-hc1436ee_6.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hb794df6_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/tombi-1.2.6-h19f9e61_0.conda - conda: https://prefix.dev/conda-forge/osx-64/typos-1.49.0-h19f9e61_0.conda - conda: https://prefix.dev/conda-forge/osx-64/uv-0.12.1-h0bcf9e0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda @@ -783,6 +785,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.18.0-py314h18e1515_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/sleef-3.9.0-hb028509_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tombi-1.2.6-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.49.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.12.1-h11277c2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda @@ -904,6 +907,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/tombi-1.2.6-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/triton-3.7.0-cuda129py314h2b49ec1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/typos-1.49.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda @@ -1195,6 +1199,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tombi-1.2.6-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/typos-1.49.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda @@ -1362,6 +1367,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tombi-1.2.6-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/typos-1.49.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda @@ -1493,6 +1499,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/sleef-3.9.0-ha0421bc_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tbb-2023.0.0-hab88423_2.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/tombi-1.2.6-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/triton-3.7.0-cuda129py314h2b49ec1_0.conda - conda: https://prefix.dev/conda-forge/linux-64/typos-1.49.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda @@ -1791,6 +1798,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/sleef-3.9.0-h67fd636_0.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tombi-1.2.6-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/typos-1.49.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda @@ -2439,6 +2447,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.16.1-h462bb3b_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/tombi-1.2.6-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/typos-1.49.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda @@ -2633,6 +2642,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ruff-0.16.1-hcca44e8_0.conda - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hb794df6_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/tombi-1.2.6-h19f9e61_0.conda - conda: https://prefix.dev/conda-forge/osx-64/typos-1.49.0-h19f9e61_0.conda - conda: https://prefix.dev/conda-forge/osx-64/uv-0.12.1-h0bcf9e0_0.conda - conda: https://prefix.dev/conda-forge/osx-64/yaml-0.2.5-h4132b18_3.conda @@ -2758,6 +2768,7 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ruff-0.16.1-h828de30_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/tombi-1.2.6-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.49.0-h6fdd925_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.12.1-h11277c2_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/yaml-0.2.5-h925e9cb_3.conda @@ -2819,6 +2830,7 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ruff-0.16.1-h462bb3b_0.conda - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/tombi-1.2.6-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/typos-1.49.0-hb17b654_0.conda - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda - conda: https://prefix.dev/conda-forge/linux-64/yaml-0.2.5-h280c20c_3.conda @@ -3005,6 +3017,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/ruff-0.16.1-h6b72154_0.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tombi-1.2.6-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/typos-1.49.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda @@ -3126,6 +3139,7 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/ruff-0.16.1-h6b72154_0.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tombi-1.2.6-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/typos-1.49.0-h18a1a76_0.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda @@ -6078,26 +6092,27 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.3-py311h3778330_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://prefix.dev/conda-forge/linux-64/hypothesis-6.165.0-py311h902ca64_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-hf4e2dac_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda @@ -6105,73 +6120,66 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-h7508c33_1_cpython.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.24-h26efc2c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.6.1-pyhc364b38_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.7-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.20.0-pyh7e86bf3_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.12.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda_source: array-api-extra[08d18e4a] @ . + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda_source: array-api-extra[bda84e8a] @ . osx-64: - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.6.1-pyhc364b38_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.7-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.20.0-pyh7e86bf3_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.12.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-64/bzip2-1.0.8-h500dc9f_9.conda - conda: https://prefix.dev/conda-forge/osx-64/coverage-7.14.3-py311ha8ae342_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/hypothesis-6.165.0-py311h3a14e8f_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libblas-3.11.0-8_he492b99_openblas.conda - conda: https://prefix.dev/conda-forge/osx-64/libcblas-3.11.0-8_h9b27e0a_openblas.conda - conda: https://prefix.dev/conda-forge/osx-64/libcxx-22.1.8-h19cb2f5_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libexpat-2.8.1-hcc62823_1.conda - conda: https://prefix.dev/conda-forge/osx-64/libffi-3.5.2-hd1f9c09_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgcc-15.2.0-h08519bb_19.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-15.2.0-h7e5c614_19.conda - - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-15.2.0-hd16e46c_19.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgcc-16.1.0-h13771c8_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran-16.1.0-h7e5c614_1.conda + - conda: https://prefix.dev/conda-forge/osx-64/libgfortran5-16.1.0-h70d9f54_1.conda - conda: https://prefix.dev/conda-forge/osx-64/liblapack-3.11.0-8_h859234e_openblas.conda - conda: https://prefix.dev/conda-forge/osx-64/liblzma-5.8.3-hbb4bfdb_0.conda - conda: https://prefix.dev/conda-forge/osx-64/libopenblas-0.3.33-openmp_h9e49c7b_0.conda - - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.2-h77d7759_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_2.conda + - conda: https://prefix.dev/conda-forge/osx-64/libsqlite-3.53.4-h77d7759_0.conda + - conda: https://prefix.dev/conda-forge/osx-64/libzlib-1.3.2-hbb4bfdb_3.conda - conda: https://prefix.dev/conda-forge/osx-64/llvm-openmp-22.1.8-h0d3cbff_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ncurses-6.6-hcc0dc9a_0.conda - conda: https://prefix.dev/conda-forge/osx-64/ninja-1.13.2-hfc0b2d5_0.conda @@ -6180,50 +6188,47 @@ environments: - conda: https://prefix.dev/conda-forge/osx-64/python-3.11.15-ha9537fe_1_cpython.conda - conda: https://prefix.dev/conda-forge/osx-64/readline-8.3-h68b038d_0.conda - conda: https://prefix.dev/conda-forge/osx-64/scipy-1.17.1-py311h556693a_1.conda - - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-h7142dee_3.conda - - conda: https://prefix.dev/conda-forge/osx-64/uv-0.11.24-hbe083cb_0.conda - - conda_source: array-api-extra[58385f77] @ . + - conda: https://prefix.dev/conda-forge/osx-64/tk-8.6.13-hb794df6_3.conda + - conda: https://prefix.dev/conda-forge/osx-64/uv-0.12.1-h0bcf9e0_0.conda + - conda_source: array-api-extra[e3cc3671] @ . osx-arm64: - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.6.1-pyhc364b38_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.7-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.20.0-pyh7e86bf3_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.12.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/_openmp_mutex-4.5-7_kmp_llvm.conda - conda: https://prefix.dev/conda-forge/osx-arm64/bzip2-1.0.8-hd037594_9.conda - conda: https://prefix.dev/conda-forge/osx-arm64/coverage-7.14.3-py311hc290fe0_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hef89b57_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/hypothesis-6.165.0-py311hf7c400d_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/icu-78.3-hc7cc350_2.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libblas-3.11.0-8_h51639a9_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcblas-3.11.0-8_hb0561ab_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libcxx-22.1.8-h55c6f16_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libexpat-2.8.1-hf6b4638_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libffi-3.5.2-hcf2aa1b_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-15.2.0-hcbb3090_19.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-15.2.0-h07b0088_19.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-15.2.0-hdae7583_19.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgcc-16.1.0-h3cf6597_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran-16.1.0-h07b0088_1.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libgfortran5-16.1.0-h32cdfcc_1.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblapack-3.11.0-8_hd9741b5_openblas.conda - conda: https://prefix.dev/conda-forge/osx-arm64/liblzma-5.8.3-h8088a28_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/libopenblas-0.3.33-openmp_he657e61_0.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.2-h1ae2325_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_2.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libsqlite-3.53.4-h1ae2325_0.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/libzlib-1.3.2-h8088a28_3.conda - conda: https://prefix.dev/conda-forge/osx-arm64/llvm-openmp-22.1.8-hc7d1edf_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ncurses-6.6-h1d4f5a5_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/ninja-1.13.2-h49c215f_0.conda @@ -6232,33 +6237,34 @@ environments: - conda: https://prefix.dev/conda-forge/osx-arm64/python-3.11.15-h0c9c016_1_cpython.conda - conda: https://prefix.dev/conda-forge/osx-arm64/readline-8.3-h46df422_0.conda - conda: https://prefix.dev/conda-forge/osx-arm64/scipy-1.17.1-py311h9a58382_1.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-h010d191_3.conda - - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.11.24-hc169f86_0.conda - - conda_source: array-api-extra[3cbd700d] @ . + - conda: https://prefix.dev/conda-forge/osx-arm64/tk-8.6.13-hd3d0363_3.conda + - conda: https://prefix.dev/conda-forge/osx-arm64/uv-0.12.1-h11277c2_0.conda + - conda_source: array-api-extra[fdf1fe63] @ . p1: - conda: https://prefix.dev/conda-forge/linux-64/_openmp_mutex-4.5-20_gnu.conda - conda: https://prefix.dev/conda-forge/linux-64/bzip2-1.0.8-hda65f42_9.conda - conda: https://prefix.dev/conda-forge/linux-64/coverage-7.14.3-py311h3778330_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h33c6efd_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.45.1-default_hbd61a6d_102.conda + - conda: https://prefix.dev/conda-forge/linux-64/hypothesis-6.165.0-py311h902ca64_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/icu-78.3-h54a6638_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/ld_impl_linux-64-2.46.1-default_hbd61a6d_102.conda - conda: https://prefix.dev/conda-forge/linux-64/libblas-3.11.0-8_h4a7cf45_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/libcblas-3.11.0-8_h0358290_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/libexpat-2.8.1-hecca717_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libffi-3.5.2-h3435931_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-15.2.0-he0feb66_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-15.2.0-h69a702a_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-15.2.0-h69a702a_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-15.2.0-h68bc16d_19.conda - - conda: https://prefix.dev/conda-forge/linux-64/libgomp-15.2.0-he0feb66_19.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-16.1.0-ha9f2e26_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgcc-ng-16.1.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran-16.1.0-h69a702a_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgfortran5-16.1.0-h79bb938_1.conda + - conda: https://prefix.dev/conda-forge/linux-64/libgomp-16.1.0-he0feb66_1.conda - conda: https://prefix.dev/conda-forge/linux-64/liblapack-3.11.0-8_h47877c9_openblas.conda - conda: https://prefix.dev/conda-forge/linux-64/liblzma-5.8.3-hb03c661_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libnsl-2.0.1-hb9d3cd8_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libopenblas-0.3.33-pthreads_h94d23a6_0.conda - - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.2-hf4e2dac_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-15.2.0-h934c35e_19.conda + - conda: https://prefix.dev/conda-forge/linux-64/libsqlite-3.53.4-hf4e2dac_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/libstdcxx-16.1.0-h934c35e_1.conda - conda: https://prefix.dev/conda-forge/linux-64/libuuid-2.42.2-h5347b49_0.conda - conda: https://prefix.dev/conda-forge/linux-64/libxcrypt-4.4.36-hd590300_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_2.conda + - conda: https://prefix.dev/conda-forge/linux-64/libzlib-1.3.2-h25fd6f3_3.conda - conda: https://prefix.dev/conda-forge/linux-64/ncurses-6.6-hdb14827_0.conda - conda: https://prefix.dev/conda-forge/linux-64/ninja-1.13.2-h171cf75_0.conda - conda: https://prefix.dev/conda-forge/linux-64/numpy-2.4.6-py311h2e04523_0.conda @@ -6266,59 +6272,52 @@ environments: - conda: https://prefix.dev/conda-forge/linux-64/python-3.11.15-h7508c33_1_cpython.conda - conda: https://prefix.dev/conda-forge/linux-64/readline-8.3-h853b02a_0.conda - conda: https://prefix.dev/conda-forge/linux-64/scipy-1.17.1-py311hbe70eeb_1.conda - - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_h366c992_103.conda - - conda: https://prefix.dev/conda-forge/linux-64/uv-0.11.24-h26efc2c_0.conda + - conda: https://prefix.dev/conda-forge/linux-64/tk-8.6.13-noxft_hd70dff1_3.conda + - conda: https://prefix.dev/conda-forge/linux-64/uv-0.12.1-h2112641_0.conda - conda: https://prefix.dev/conda-forge/linux-64/zstd-1.5.7-hb78ec9c_6.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.6.1-pyhc364b38_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.6.17-hbd8a1cb_0.conda - - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyhc90fa1f_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.7.22-hbd8a1cb_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.7-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.20.0-pyh7e86bf3_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.12.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda - - conda_source: array-api-extra[08d18e4a] @ . + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda + - conda_source: array-api-extra[bda84e8a] @ . p2: - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.6.1-pyhc364b38_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.7-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.20.0-pyh7e86bf3_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.12.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.3-py311h3f79411_0.conda + - conda: https://prefix.dev/conda-forge/win-64/hypothesis-6.165.0-py311hf51aa87_0.conda - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda @@ -6327,53 +6326,50 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.8-h4fa8253_0.conda - - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda + - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.1.0-hac47afa_233.conda - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py311h65cb7f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda + - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.1.0-h57928b3_233.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_1_cpython.conda - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py311h9c22a71_1.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.24-h2229357_0.conda - - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - - conda_source: array-api-extra[64f7151e] @ . + - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda_source: array-api-extra[9f0b63c2] @ . win-64: - conda: https://prefix.dev/conda-forge/noarch/array-api-compat-1.15.0-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/array-api-strict-2.6.1-pyhc364b38_0.conda - - conda: https://prefix.dev/conda-forge/noarch/attrs-26.1.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.6.17-h4c7d964_0.conda - - conda: https://prefix.dev/conda-forge/noarch/click-8.4.1-pyh6dadd2b_0.conda + - conda: https://prefix.dev/conda-forge/noarch/ca-certificates-2026.7.22-h4c7d964_0.conda - conda: https://prefix.dev/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/exceptiongroup-1.3.1-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/hypothesis-6.155.7-pyha770c72_0.conda - conda: https://prefix.dev/conda-forge/noarch/iniconfig-2.3.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.1-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/meson-1.11.2-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/meson-python-0.20.0-pyh7e86bf3_0.conda - conda: https://prefix.dev/conda-forge/noarch/packaging-26.2-pyhc364b38_0.conda - conda: https://prefix.dev/conda-forge/noarch/pluggy-1.6.0-pyhf9edf01_1.conda - conda: https://prefix.dev/conda-forge/noarch/pygments-2.20.0-pyhd8ed1ab_0.conda - - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.11.0-pyhd8ed1ab_0.conda + - conda: https://prefix.dev/conda-forge/noarch/pyproject-metadata-0.12.1-pyhd8ed1ab_0.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-9.1.1-pyhc364b38_2.conda - conda: https://prefix.dev/conda-forge/noarch/pytest-cov-7.1.0-pyhcf101f3_0.conda - conda: https://prefix.dev/conda-forge/noarch/python_abi-3.11-8_cp311.conda - - conda: https://prefix.dev/conda-forge/noarch/setuptools-82.0.1-pyh332efcf_0.conda - conda: https://prefix.dev/conda-forge/noarch/sortedcontainers-2.4.0-pyhd8ed1ab_1.conda - conda: https://prefix.dev/conda-forge/noarch/tomli-2.4.1-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.15.0-pyhcf101f3_0.conda - - conda: https://prefix.dev/conda-forge/noarch/tzdata-2025c-hc9c84f9_1.conda + - conda: https://prefix.dev/conda-forge/noarch/typing_extensions-4.16.0-pyhcf101f3_0.conda + - conda: https://prefix.dev/conda-forge/noarch/tzdata-2026c-h151e31d_0.conda - conda: https://prefix.dev/conda-forge/win-64/bzip2-1.0.8-h0ad9c76_9.conda - conda: https://prefix.dev/conda-forge/win-64/coverage-7.14.3-py311h3f79411_0.conda + - conda: https://prefix.dev/conda-forge/win-64/hypothesis-6.165.0-py311hf51aa87_0.conda - conda: https://prefix.dev/conda-forge/win-64/libblas-3.11.0-8_h8455456_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/libcblas-3.11.0-8_h2a3cdd5_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/libexpat-2.8.1-hac47afa_1.conda @@ -6382,27 +6378,27 @@ environments: - conda: https://prefix.dev/conda-forge/win-64/libiconv-1.18-hc1393d2_2.conda - conda: https://prefix.dev/conda-forge/win-64/liblapack-3.11.0-8_hf9ab0e9_mkl.conda - conda: https://prefix.dev/conda-forge/win-64/liblzma-5.8.3-hfd05255_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.2-hf5d6505_1.conda + - conda: https://prefix.dev/conda-forge/win-64/libsqlite-3.53.4-hf5d6505_0.conda - conda: https://prefix.dev/conda-forge/win-64/libwinpthread-12.0.0.r4.gg4f2fc60ca-h57928b3_10.conda - conda: https://prefix.dev/conda-forge/win-64/libxml2-16-2.15.3-h692994f_0.conda - conda: https://prefix.dev/conda-forge/win-64/libxml2-2.15.3-hbc0d294_0.conda - - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_2.conda + - conda: https://prefix.dev/conda-forge/win-64/libzlib-1.3.2-hfd05255_3.conda - conda: https://prefix.dev/conda-forge/win-64/llvm-openmp-22.1.8-h4fa8253_0.conda - - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.0.0-hac47afa_908.conda + - conda: https://prefix.dev/conda-forge/win-64/mkl-2026.1.0-hac47afa_233.conda - conda: https://prefix.dev/conda-forge/win-64/ninja-1.13.2-h477610d_0.conda - conda: https://prefix.dev/conda-forge/win-64/numpy-2.4.6-py311h65cb7f3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.0.0-h57928b3_908.conda + - conda: https://prefix.dev/conda-forge/win-64/onemkl-license-2026.1.0-h57928b3_233.conda - conda: https://prefix.dev/conda-forge/win-64/openssl-3.6.3-hf411b9b_0.conda - conda: https://prefix.dev/conda-forge/win-64/python-3.11.15-h0159041_1_cpython.conda - conda: https://prefix.dev/conda-forge/win-64/scipy-1.17.1-py311h9c22a71_1.conda - conda: https://prefix.dev/conda-forge/win-64/tbb-2023.0.0-hd3d4ead_2.conda - - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h6ed50ae_3.conda + - conda: https://prefix.dev/conda-forge/win-64/tk-8.6.13-h967ab96_3.conda - conda: https://prefix.dev/conda-forge/win-64/ucrt-10.0.26100.0-h57928b3_0.conda - - conda: https://prefix.dev/conda-forge/win-64/uv-0.11.24-h2229357_0.conda - - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-h1b7c187_39.conda - - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36231-h1b9f54f_39.conda - - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36231-h1b9f54f_39.conda - - conda_source: array-api-extra[64f7151e] @ . + - conda: https://prefix.dev/conda-forge/win-64/uv-0.12.1-h7ca4a90_0.conda + - conda: https://prefix.dev/conda-forge/win-64/vc-14.5-ha367084_41.conda + - conda: https://prefix.dev/conda-forge/win-64/vc14_runtime-14.51.36247-habf1de7_41.conda + - conda: https://prefix.dev/conda-forge/win-64/vcomp14-14.51.36247-habf1de7_41.conda + - conda_source: array-api-extra[9f0b63c2] @ . tests-py314: channels: - url: https://prefix.dev/conda-forge/ @@ -10195,6 +10191,19 @@ packages: - tk >=8.6.13,<8.7.0a0 size: 3550916 timestamp: 1784229071544 +- conda: https://prefix.dev/conda-forge/linux-64/tombi-1.2.6-hb17b654_0.conda + sha256: 5f03e7ade8909c18853247789c88f754ab75c522e8ecf15062b30ace3c079a61 + md5: 02c4a272d51a4e6f54000627ed3df412 + depends: + - __glibc >=2.17,<3.0.a0 + - libgcc >=14 + constrains: + - __glibc >=2.17 + license: MIT + license_family: MIT + run_exports: {} + size: 7031830 + timestamp: 1785730748795 - conda: https://prefix.dev/conda-forge/linux-64/triton-3.7.0-cuda129py311h2e1fb5d_0.conda sha256: e6d915e1eb5d50dfb01d102d6ec8f391b1b6957950844c5170a4d1aa0c0e5d97 md5: aeb38aabb320d6e17c5e36e4e9c53a2e @@ -14071,6 +14080,18 @@ packages: - tk >=8.6.13,<8.7.0a0 size: 3516600 timestamp: 1784229134070 +- conda: https://prefix.dev/conda-forge/osx-64/tombi-1.2.6-h19f9e61_0.conda + sha256: c364e5391ef83415867d3d52b415bd28408cf9d737d61160c1ba5c72295c45f4 + md5: dc5314cc0d5caae2ca2e3df0988d2ae4 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: {} + size: 6915148 + timestamp: 1785730874035 - conda: https://prefix.dev/conda-forge/osx-64/typos-1.49.0-h19f9e61_0.conda sha256: 03ff9f0c629fefaa12457e2d9f0ceaf9841e498445efaa9cb8872d1f1e63137b md5: 07b5f6fbf59416f85aad3068dc1f422a @@ -15930,6 +15951,18 @@ packages: - tk >=8.6.13,<8.7.0a0 size: 3338712 timestamp: 1784229090530 +- conda: https://prefix.dev/conda-forge/osx-arm64/tombi-1.2.6-h6fdd925_0.conda + sha256: 5cd1f03612420535fcd7353dea5097ed3e734739b3b781aa1dbce1ea1f7da305 + md5: 6b96ccfa64c6c299f69bbd9eee56d5e8 + depends: + - __osx >=11.0 + constrains: + - __osx >=11.0 + license: MIT + license_family: MIT + run_exports: {} + size: 6407215 + timestamp: 1785730758960 - conda: https://prefix.dev/conda-forge/osx-arm64/typos-1.49.0-h6fdd925_0.conda sha256: fd5474cab7965b8eed8f9ae8a21c82c3ee10fda5aa369dfc63d0f4593af7dbbf md5: a5dc26e78597367e0e39df66f5192fcf @@ -18136,6 +18169,18 @@ packages: - tk >=8.6.13,<8.7.0a0 size: 3782314 timestamp: 1784229072899 +- conda: https://prefix.dev/conda-forge/win-64/tombi-1.2.6-h18a1a76_0.conda + sha256: 1a896d9f6dd1f68e614901419ac0ea2c5fdd6406db52286fb2d135222c7738a8 + md5: 16552cfb765a8fabae9e30e5bbe13345 + depends: + - vc >=14.3,<15 + - vc14_runtime >=14.44.35208 + - ucrt >=10.0.20348.0 + license: MIT + license_family: MIT + run_exports: {} + size: 8027741 + timestamp: 1785730787222 - conda: https://prefix.dev/conda-forge/win-64/typos-1.49.0-h18a1a76_0.conda sha256: e1dea4a75d2d92a4f943ffd6764f5af31518e836996af51e1d88f1ebf5ec8a7f md5: 0b42600fc25d9844c3bce99b2fafcd85 diff --git a/pixi.toml b/pixi.toml index 1e5f9794..02de50d2 100644 --- a/pixi.toml +++ b/pixi.toml @@ -27,32 +27,66 @@ array-api-compat = "*" ### workspace environments ### [environments] -default = { features = ["py314"], solve-group = "py314" } -lint = { features = ["py311", "lint"], solve-group = "py311" } -docs = { features = ["py314", "docs"], solve-group = "py314" } -tests = { features = ["py314", "tests"], solve-group = "py314" } -tests-py314 = { features = ["py314", "tests"], solve-group = "py314" } # alias of tests -tests-run-deps = { features = ["py314", "tests-run-deps"], solve-group = "py314" } +default = { + features = ["py314"], + solve-group = "py314", +} +lint = { + features = ["py311", "lint"], + solve-group = "py311", +} +docs = { + features = ["py314", "docs"], + solve-group = "py314", +} + +tests = { + features = ["py314", "tests"], + solve-group = "py314", +} +tests-py314 = { # alias of tests + features = ["py314", "tests"], + solve-group = "py314", +} +tests-py311 = { + features = ["py311", "tests"], + solve-group = "py311", +} +tests-run-deps = { + features = ["py314", "tests-run-deps"], + solve-group = "py314", +} # Some backends may pin numpy; use separate solve-group -dev = { features = ["py314", "lint", "tests", "docs", "dev", "backends"], solve-group = "backends" } -tests-backends = { features = ["py314", "tests", "backends"], solve-group = "backends" } -tests-backends-py311 = { features = ["py311", "tests", "backends"] } +dev = { + features = ["py314", "lint", "tests", "docs", "dev", "backends"], + solve-group = "backends", +} +tests-backends = { + features = ["py314", "tests", "backends"], + solve-group = "backends", +} +tests-backends-py311.features = ["py311", "tests", "backends"] # CUDA not available on free github actions and on some developers' PCs -dev-cuda = { features = ["py314", "lint", "tests", "docs", "dev", "backends", "cuda-backends"], solve-group = "cuda" } -tests-cuda = { features = ["py314", "tests", "backends", "cuda-backends"], solve-group = "cuda" } -tests-cuda-py311 = { features = ["py311", "tests", "backends", "cuda-backends"] } +dev-cuda = { + features = ["py314", "lint", "tests", "docs", "dev", "backends", "cuda-backends"], + solve-group = "cuda", +} +tests-cuda = { + features = ["py314", "tests", "backends", "cuda-backends"], + solve-group = "cuda", +} +tests-cuda-py311.features = ["py311", "tests", "backends", "cuda-backends"] # Ungrouped environments tests-numpy1 = ["py311", "tests", "numpy1"] -tests-py311 = ["py311", "tests"] tests-nogil = ["py314t", "nogil", "tests"] ### default feature definition ### [dev] -# this pulls in array-api-extra's host and run dependencies +# this pulls in array-api-extra's host dependencies array-api-extra.path = "." [dependencies] @@ -70,7 +104,7 @@ numpydoc = ">=1.10.0,<2" array-api-strict = ">=2.6.1,<2.7" numpy = ">=2.1.3" hypothesis = ">=6.155.7" -dask-core = ">=2026.7.1" # No distributed, tornado, etc. +dask-core = ">=2026.7.1" # No distributed, tornado, etc. dprint = ">=0.50.0,<0.51" lefthook = ">=2.1.10,<3" ruff = ">=0.16.0,<0.17" @@ -81,27 +115,104 @@ pytest = ">=9.1.1,<10" validate-pyproject = ">=0.25,<0.26" pyrefly = ">=1.1.1,<1.2" zizmor = ">=1.28.0,<1.29" +tombi = ">=1.2.6,<1.3" # NOTE: don't add cupy, jax, pytorch, or sparse here, # as they slow down mypy and are not portable across target OSs [feature.lint.tasks] -lefthook = { cmd = "lefthook", description = "Run lefthook", default-environment = "lint" } -hooks = { cmd = "lefthook install", description = "Install pre-commit hooks", default-environment = "lint" } -pre-commit = { cmd = "lefthook run pre-commit", description = "Run pre-commit checks", default-environment = "lint" } -pylint = { cmd = "pylint array_api_extra", cwd = "src", description = "Lint with pylint", default-environment = "lint" } -mypy = { cmd = "mypy", description = "Type check with mypy", default-environment = "lint" } -pyrefly = { cmd = "pyrefly check", description = "Type check with pyrefly", default-environment = "lint" } -pyright = { cmd = "basedpyright", description = "Type check with basedpyright", default-environment = "lint" } -ruff-check = { cmd = "ruff check --fix", description = "Lint with ruff", default-environment = "lint" } -ruff-format = { cmd = "ruff format", description = "Format with ruff", default-environment = "lint" } -dprint = { cmd = "dprint fmt", description = "Format with dprint", default-environment = "lint" } -typos = { cmd = "typos --write-changes --force-exclude", description = "Fix typos", default-environment = "lint" } -actionlint = { cmd = "actionlint", description = "Lint actions with actionlint", default-environment = "lint" } -zizmor = { cmd = "zizmor .github -p", description = "GHA static analysis with zizmor", default-environment = "lint" } -blacken-docs = { cmd = "blacken-docs", description = "Format Python markdown blocks with Black", default-environment = "lint" } -validate-pyproject = { cmd = "validate-pyproject pyproject.toml", description = "Validate pyproject.toml", default-environment = "lint" } -numpydoc = { cmd = "numpydoc lint", description = "Validate docstrings with numpydoc", default-environment = "lint" } -lint = { cmd = "lefthook run pre-commit --all-files --force", description = "Run all linters", default-environment = "lint" } +lefthook = { + description = "Run lefthook", + cmd = "lefthook", + default-environment = "lint", +} +hooks = { + description = "Install pre-commit hooks", + cmd = "lefthook install", + default-environment = "lint", +} +pre-commit = { + description = "Run pre-commit checks", + cmd = "lefthook run pre-commit", + default-environment = "lint", +} + +pylint = { + description = "Lint with pylint", + cwd = "src", + cmd = "pylint array_api_extra", + default-environment = "lint", +} +mypy = { + description = "Type check with mypy", + cmd = "mypy", + default-environment = "lint", +} +pyrefly = { + description = "Type check with pyrefly", + cmd = "pyrefly check", + default-environment = "lint", +} +pyright = { + description = "Type check with basedpyright", + cmd = "basedpyright", + default-environment = "lint", +} +ruff-check = { + description = "Lint with ruff", + cmd = "ruff check --fix", + default-environment = "lint", +} +ruff-format = { + description = "Format with ruff", + cmd = "ruff format", + default-environment = "lint", +} +dprint = { + description = "Format with dprint", + cmd = "dprint fmt", + default-environment = "lint", +} +typos = { + description = "Fix typos", + cmd = "typos --write-changes --force-exclude", + default-environment = "lint", +} +actionlint = { + description = "Lint actions with actionlint", + cmd = "actionlint", + default-environment = "lint", +} +zizmor = { + description = "GHA static analysis with zizmor", + cmd = "zizmor .github -p", + default-environment = "lint", +} +blacken-docs = { + description = "Format Python markdown blocks with Black", + cmd = "blacken-docs", + default-environment = "lint", +} +validate-pyproject = { + description = "Validate pyproject.toml", + cmd = "validate-pyproject pyproject.toml", + default-environment = "lint", +} +numpydoc = { + description = "Validate docstrings with numpydoc", + cmd = "numpydoc lint", + default-environment = "lint", +} +tombi = { + description = "Format TOML with tombi", + cmd = "tombi format", + default-environment = "lint", +} + +lint = { + description = "Run all linters", + cmd = "lefthook run pre-commit --all-files --force", + default-environment = "lint", +} [feature.tests.dependencies] pytest = ">=9.1.1" @@ -112,58 +223,126 @@ numpy = ">=1.22.0" scipy = ">=1.15.2,<2" [feature.tests.tasks] -tests = { cmd = "pytest -v", description = "Run tests", default-environment = "tests" } -tests-cov = { cmd = "pytest -v -ra --cov --cov-report=xml --cov-report=term --durations=20", description = "Run tests with coverage", default-environment = "tests" } - -clean-vendor-compat = { cmd = "rm -rf vendor_tests/array_api_compat", description = "Delete the existing vendored version of array-api-compat", default-environment = "tests" } -clean-vendor-extra = { cmd = "rm -rf vendor_tests/array_api_extra", description = "Delete the existing vendored version of array-api-extra", default-environment = "tests" } -copy-vendor-compat = { cmd = "cp -r $(python -c 'import site; print(site.getsitepackages()[0])')/array_api_compat vendor_tests/ && rm -rf vendor_tests/array_api_compat/vendor_tests && rm -rf vendor_tests/array_api_compat/tests", depends-on = ["clean-vendor-compat"], description = "Vendor a clean copy of array-api-compat", default-environment = "tests" } -copy-vendor-extra = { cmd = "cp -r src/array_api_extra vendor_tests/", depends-on = ["clean-vendor-extra"], description = "Vendor a clean copy of array-api-extra", default-environment = "tests" } -tests-vendor = { cmd = "pytest -v vendor_tests", depends-on = ["copy-vendor-compat", "copy-vendor-extra"], description = "Check that array-api-extra and array-api-compat can be vendored together", default-environment = "tests" } - -tests-ci = { depends-on = ["tests-cov", "tests-vendor"], description = "Run tests with coverage and vendor tests" } -coverage = { cmd = "coverage html", depends-on = ["tests-cov"], description = "Generate test coverage html report", default-environment = "tests" } -open-coverage = { cmd = "open htmlcov/index.html", depends-on = ["coverage"], description = "Open test coverage report", default-environment = "tests" } +tests = { + description = "Run tests", + cmd = "pytest -v", + default-environment = "tests", +} +tests-cov = { + description = "Run tests with coverage", + cmd = "pytest -v -ra --cov --cov-report=xml --cov-report=term --durations=20", + default-environment = "tests", +} + +coverage = { + description = "Generate test coverage html report", + depends-on = ["tests-cov"], + cmd = "coverage html", + default-environment = "tests", +} +open-coverage = { + description = "Open test coverage report", + depends-on = ["coverage"], + cmd = "open htmlcov/index.html", + default-environment = "tests", +} + +clean-vendor-compat = { + description = "Delete the existing vendored version of array-api-compat", + cmd = "rm -rf vendor_tests/array_api_compat", + default-environment = "tests", +} +clean-vendor-extra = { + description = "Delete the existing vendored version of array-api-extra", + cmd = "rm -rf vendor_tests/array_api_extra", + default-environment = "tests", +} +copy-vendor-compat = { + description = "Vendor a clean copy of array-api-compat", + depends-on = ["clean-vendor-compat"], + cmd = "cp -r $(python -c 'import site; print(site.getsitepackages()[0])')/array_api_compat vendor_tests/ && rm -rf vendor_tests/array_api_compat/vendor_tests && rm -rf vendor_tests/array_api_compat/tests", + default-environment = "tests", +} +copy-vendor-extra = { + description = "Vendor a clean copy of array-api-extra", + depends-on = ["clean-vendor-extra"], + cmd = "cp -r src/array_api_extra vendor_tests/", + default-environment = "tests", +} +tests-vendor = { + description = "Check that array-api-extra and array-api-compat can be vendored together", + depends-on = ["copy-vendor-compat", "copy-vendor-extra"], + cmd = "pytest -v vendor_tests", + default-environment = "tests", +} + +tests-ci = { + description = "Run tests with coverage and vendor tests", + depends-on = ["tests-cov", "tests-vendor"], +} # tests with only run dependencies [feature.tests-run-deps.dependencies] pytest = ">=9.1.1" pytest-cov = ">=7.1.0" -[feature.tests-run-deps.tasks.tests-run-deps] -cmd = "pytest -v run_deps_tests" -description = "Run run-dependency tests" -default-environment = "tests-run-deps" - -[feature.tests-run-deps.tasks.tests-run-deps-cov] -cmd = "pytest -v -ra --cov --cov-report=xml --cov-report=term --durations=20 run_deps_tests" -description = "Run run-dependency tests with coverage" -default-environment = "tests-run-deps" +[feature.tests-run-deps.tasks] +tests-run-deps = { + description = "Run run-dependency tests", + cmd = "pytest -v run_deps_tests", + default-environment = "tests-run-deps", +} +tests-run-deps-cov = { + description = "Run run-dependency tests with coverage", + cmd = "pytest -v -ra --cov --cov-report=xml --cov-report=term --durations=20 run_deps_tests", + default-environment = "tests-run-deps", +} [feature.docs.dependencies] sphinx = ">=7.4.7" furo = ">=2025.12.19" myst-parser = ">=5.1.0" sphinx-copybutton = ">=0.5.2" -sphinx-autodoc-typehints = "==3.7.0" # pin due to https://github.com/tox-dev/sphinx-autodoc-typehints/issues/730 +sphinx-autodoc-typehints = "==3.7.0" # pin due to https://github.com/tox-dev/sphinx-autodoc-typehints/issues/730 # Needed to import parsed modules with autodoc -dask-core = ">=2026.7.1" # No distributed, tornado, etc. +dask-core = ">=2026.7.1" # No distributed, tornado, etc. pytest = ">=9.1.1" typing-extensions = ">=4.16.0" numpy = ">=2.1.3" [feature.docs.tasks] -docs = { cmd = "sphinx-build -E -W . build/", cwd = "docs", description = "Build docs", default-environment = "docs" } -open-docs = { cmd = "open build/index.html", cwd = "docs", depends-on = ["docs"], description = "Open the generated docs", default-environment = "docs" } +docs = { + description = "Build docs", + cwd = "docs", + cmd = "sphinx-build -E -W . build/", + default-environment = "docs", +} +open-docs = { + description = "Open the generated docs", + depends-on = ["docs"], + cwd = "docs", + cmd = "open build/index.html", + default-environment = "docs", +} [feature.docs.target.win.tasks] -open-docs = { cmd = "cmd /c start build/index.html", cwd = "docs", depends-on = ["docs"], description = "Open the generated docs", default-environment = "docs" } +open-docs = { + description = "Open the generated docs", + depends-on = ["docs"], + cwd = "docs", + cmd = "cmd /c start build/index.html", + default-environment = "docs", +} [feature.dev.dependencies] ipython = ">=9.15.0" [feature.dev.tasks] -ipython = { cmd = "ipython", description = "Launch ipython", default-environment = "dev" } +ipython = { + description = "Launch ipython", + cmd = "ipython", + default-environment = "dev", +} [feature.py311.dependencies] python = "~=3.11.0" @@ -183,7 +362,7 @@ numpy = "=1.24.1" # Note: JAX and PyTorch will install CPU variants. [feature.backends.dependencies] pytorch = ">=2.12.0" -dask-core = ">=2026.7.1" # No distributed, tornado, etc. +dask-core = ">=2026.7.1" # No distributed, tornado, etc. sparse = ">=0.19.0" [feature.backends.target.unix.dependencies] @@ -201,15 +380,21 @@ platforms = ["linux-64-cuda-12-9", "win-64-cuda-12-9"] [feature.cuda-backends.dependencies] cuda-version = "==12.9" cupy = ">=14.1.1" -pytorch = { version = ">=2.12.0", build = "cuda12*" } +pytorch = { + version = ">=2.12.0", + build = "cuda12*", +} [feature.cuda-backends.target.linux.dependencies] -jaxlib = { version = ">=0.10.2", build = "cuda12*" } +jaxlib = { + version = ">=0.10.2", + build = "cuda12*", +} [feature.nogil.dependencies] pytest-run-parallel = ">=0.9.1" numpy = ">=2.3.5" # pytorch = "*" # Not available on Python 3.13t yet -dask-core = ">=2026.7.1" # No distributed, tornado, etc. +dask-core = ">=2026.7.1" # No distributed, tornado, etc. # sparse = "*" # numba not available on Python 3.13t yet # jax = "*" # ml_dtypes not available on Python 3.13t yet diff --git a/pyproject.toml b/pyproject.toml index 7555123d..c1f6eadc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,15 @@ -[build-system] -requires = ["meson-python"] -build-backend = "mesonpy" - [project] name = "array-api-extra" version = "0.11.1.dev0" -authors = [ - { name = "Lucas Colley", email = "lucas.colley8@gmail.com" }, - # { name = "Open Source Contributors" }, # https://github.com/pypi/warehouse/issues/14813 -] description = "Extra array functions built on top of the array API standard." readme = "README.md" +requires-python = ">=3.11" license = "MIT" license-files = ["LICENSE"] -requires-python = ">=3.11" +authors = [ + { name = "Lucas Colley", email = "lucas.colley8@gmail.com" }, + # { name = "Open Source Contributors" }, # https://github.com/pypi/warehouse/issues/14813 +] classifiers = [ "Intended Audience :: Developers", "Operating System :: OS Independent", @@ -30,31 +26,52 @@ classifiers = [ dependencies = ["array-api-compat>=1.15.0,<2"] [project.urls] -Homepage = "https://github.com/data-apis/array-api-extra" "Bug Tracker" = "https://github.com/data-apis/array-api-extra/issues" Changelog = "https://github.com/data-apis/array-api-extra/releases" +Homepage = "https://github.com/data-apis/array-api-extra" -# pytest +[build-system] +requires = ["meson-python"] +build-backend = "mesonpy" -[tool.pytest.ini_options] -minversion = "6.0" -addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] -xfail_strict = true -filterwarnings = ["error"] -log_cli_level = "INFO" -testpaths = ["tests"] -markers = [ - "skip_xp_backend(library, /, *, reason=None): Skip test for a specific backend", - "xfail_xp_backend(library, /, *, reason=None, strict=None): Xfail test for a specific backend", -] +[tool.basedpyright] +include = ["src", "tests", "vendor_tests", "run_deps_tests"] +exclude = ["vendor_tests/array_api_compat"] +pythonVersion = "3.11" +pythonPlatform = "All" +typeCheckingMode = "all" -# Coverage +# https://github.com/data-apis/array-api-typing +reportAny = false +reportExplicitAny = false +# no array-api-strict type stubs; pytest fixtures +reportUnknownMemberType = false +# no array-api-compat type stubs; pytest fixtures +reportUnknownVariableType = false +# Redundant with mypy checks +reportMissingImports = false +reportMissingTypeStubs = false +# false positives for input validation +reportUnreachable = false +# ruff handles this +reportUnusedParameter = false +# cyclic imports inside function bodies +reportImportCycles = false +# PyRight can't trace types in lambdas +reportUnknownLambdaType = false +# conflicts with https://docs.astral.sh/ruff/rules/explicit-string-concatenation/ +reportImplicitStringConcatenation = false + +executionEnvironments = [ + { root = "tests", reportPrivateUsage = false, reportUnknownArgumentType = false }, + { root = "vendor_tests", reportPrivateUsage = false, reportUnknownArgumentType = false }, + { root = "run_deps_tests", reportPrivateUsage = false, reportUnknownArgumentType = false }, + { root = "src" }, +] [tool.coverage] run.source = ["array_api_extra"] -# mypy - [tool.mypy] files = ["src", "tests", "vendor_tests", "run_deps_tests"] python_version = "3.11" @@ -70,11 +87,11 @@ ignore_missing_imports = true [[tool.mypy.overrides]] module = ["tests/*"] -disable_error_code = ["no-untyped-def"] # test(...) without -> None +disable_error_code = ["no-untyped-def"] # test(...) without -> None [[tool.mypy.overrides]] module = ["vendor_tests/*"] -disable_error_code = ["no-untyped-def"] # test(...) without -> None +disable_error_code = ["no-untyped-def"] # test(...) without -> None [[tool.mypy.overrides]] module = ["vendor_tests/array_api_compat/*"] @@ -82,9 +99,32 @@ ignore_errors = true [[tool.mypy.overrides]] module = ["run_deps_tests/*"] -disable_error_code = ["no-untyped-def"] # test(...) without -> None +disable_error_code = ["no-untyped-def"] # test(...) without -> None + +[tool.numpydoc_validation] +checks = [ + "all", # report on all checks, except the below + "EX01", # most docstrings do not need an example + "SA01", # data-apis/array-api-extra#87 + "ES01", # most docstrings do not need an extended summary +] +exclude_files = [ + "^tests/.*", + "^vendor_tests/.*", +] -# pyrefly +[tool.pylint] +py-version = "3.11" +reports.output-format = "colorized" +messages_control.disable = [ + "design", # ignore heavily opinionated design checks + "fixme", # allow FIXME comments + "line-too-long", # ruff handles this + "unused-argument", # ruff handles this + "missing-function-docstring", # numpydoc handles this + "import-error", # mypy handles this + "import-outside-toplevel", # optional dependencies +] [tool.pyrefly.errors] # Redundant with mypy checks @@ -115,113 +155,57 @@ errors = { unannotated-return = false } matches = "run_deps_tests/*.py" errors = { unannotated-return = false } -# pyright - -[tool.basedpyright] -include = ["src", "tests", "vendor_tests", "run_deps_tests"] -exclude = ["vendor_tests/array_api_compat"] -pythonVersion = "3.11" -pythonPlatform = "All" -typeCheckingMode = "all" - -# https://github.com/data-apis/array-api-typing -reportAny = false -reportExplicitAny = false -# no array-api-strict type stubs; pytest fixtures -reportUnknownMemberType = false -# no array-api-compat type stubs; pytest fixtures -reportUnknownVariableType = false -# Redundant with mypy checks -reportMissingImports = false -reportMissingTypeStubs = false -# false positives for input validation -reportUnreachable = false -# ruff handles this -reportUnusedParameter = false -# cyclic imports inside function bodies -reportImportCycles = false -# PyRight can't trace types in lambdas -reportUnknownLambdaType = false -# conflicts with https://docs.astral.sh/ruff/rules/explicit-string-concatenation/ -reportImplicitStringConcatenation = false - -executionEnvironments = [ - { root = "tests", reportPrivateUsage = false, reportUnknownArgumentType = false }, - { root = "vendor_tests", reportPrivateUsage = false, reportUnknownArgumentType = false }, - { root = "run_deps_tests", reportPrivateUsage = false, reportUnknownArgumentType = false }, - { root = "src" }, +[tool.pytest.ini_options] +addopts = ["-ra", "--showlocals", "--strict-markers", "--strict-config"] +filterwarnings = ["error"] +log_cli_level = "INFO" +markers = [ + "skip_xp_backend(library, /, *, reason=None): Skip test for a specific backend", + "xfail_xp_backend(library, /, *, reason=None, strict=None): Xfail test for a specific backend", ] - -# Ruff +minversion = "6.0" +testpaths = ["tests"] +xfail_strict = true [tool.ruff] target-version = "py311" [tool.ruff.lint] extend-select = [ - "B", # flake8-bugbear - "F", # Pyflakes - "I", # isort - "E", # Pycodestyle - "W", # Pycodestyle - "N", # pep8-naming - "ARG", # flake8-unused-arguments - "C4", # flake8-comprehensions - "EM", # flake8-errmsg - "ICN", # flake8-import-conventions - "ISC", # flake8-implicit-str-concat - "G", # flake8-logging-format - "PGH", # pygrep-hooks - "PIE", # flake8-pie - "PL", # pylint - "PT", # flake8-pytest-style - "PTH", # flake8-use-pathlib - "RET", # flake8-return - "RUF", # Ruff-specific - "SIM", # flake8-simplify - "T20", # flake8-print - "UP", # pyupgrade - "YTT", # flake8-2020 - "EXE", # flake8-executable - "NPY", # NumPy specific rules - "PD", # pandas-vet - "UP", # Pyupgrade + "B", # flake8-bugbear + "F", # Pyflakes + "I", # isort + "E", # Pycodestyle + "W", # Pycodestyle + "N", # pep8-naming + "ARG", # flake8-unused-arguments + "C4", # flake8-comprehensions + "EM", # flake8-errmsg + "ICN", # flake8-import-conventions + "ISC", # flake8-implicit-str-concat + "G", # flake8-logging-format + "PGH", # pygrep-hooks + "PIE", # flake8-pie + "PL", # pylint + "PT", # flake8-pytest-style + "PTH", # flake8-use-pathlib + "RET", # flake8-return + "RUF", # Ruff-specific + "SIM", # flake8-simplify + "T20", # flake8-print + "UP", # pyupgrade + "YTT", # flake8-2020 + "EXE", # flake8-executable + "NPY", # NumPy specific rules + "PD", # pandas-vet + "UP", # Pyupgrade ] ignore = [ - "PLR09", # Too many <...> - "PLR2004", # Magic value used in comparison - "ISC001", # Conflicts with formatter - "N801", # Class name should use CapWords convention - "N802", # Function name should be lowercase - "N806", # Variable in function should be lowercase - "PLC0415", # `import` should be at the top-level of a file -] - -# Pylint - -[tool.pylint] -py-version = "3.11" -reports.output-format = "colorized" -messages_control.disable = [ - "design", # ignore heavily opinionated design checks - "fixme", # allow FIXME comments - "line-too-long", # ruff handles this - "unused-argument", # ruff handles this - "missing-function-docstring", # numpydoc handles this - "import-error", # mypy handles this - "import-outside-toplevel", # optional dependencies -] - -# numpydoc - -[tool.numpydoc_validation] -checks = [ - "all", # report on all checks, except the below - "EX01", # most docstrings do not need an example - "SA01", # data-apis/array-api-extra#87 - "ES01", # most docstrings do not need an extended summary -] -exclude_files = [ - '^tests/.*', - '^vendor_tests/.*', + "PLR09", # Too many <...> + "PLR2004", # Magic value used in comparison + "ISC001", # Conflicts with formatter + "N801", # Class name should use CapWords convention + "N802", # Function name should be lowercase + "N806", # Variable in function should be lowercase + "PLC0415", # `import` should be at the top-level of a file ] diff --git a/tombi.toml b/tombi.toml new file mode 100644 index 00000000..3d86da1c --- /dev/null +++ b/tombi.toml @@ -0,0 +1,2 @@ +toml-version = "v1.1.0" +format.rules.line-width = 100