From 1e68f11b15484cf42df8da2c67d05298671a0462 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Tue, 22 Apr 2025 15:45:05 +0200 Subject: [PATCH 01/12] (chore): derive CI matrix from hatch env --- .github/workflows/ci.yml | 115 +++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 54 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a9cc7f821..f5e80e69c5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,43 +17,49 @@ defaults: shell: bash -e {0} # -e to fail on error jobs: - pytest: + get-environments: + runs-on: ubuntu-latest + outputs: + envs: ${{ steps.get-envs.outputs.envs }} + steps: + - uses: actions/checkout@v4 + with: + filter: blob:none + fetch-depth: 0 + - uses: astral-sh/setup-uv@v5 + with: + enable-cache: false + - id: get-envs + run: | + ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries + | map( + select(.key | startswith("hatch-test")) + | { + name: .key, + test-type: (if (.key | contains(["pre", "min"])) then "coverage" else null end), + python: .value.python, + } + )') + echo "envs=${ENVS_JSON}" | tee $GITHUB_OUTPUT + + test: + needs: get-environments runs-on: ubuntu-latest - strategy: matrix: - include: - - python-version: '3.11' - - python-version: '3.13' - - python-version: '3.13' - dependencies-version: min-optional - - python-version: '3.13' - dependencies-version: pre-release - test-type: coverage - - python-version: '3.11' - dependencies-version: minimum - test-type: coverage - - env: # for use codecov’s env_vars tagging - PYTHON: ${{ matrix.python-version }} - DEPS: ${{ matrix.dependencies-version || 'default' }} - TESTS: ${{ matrix.test-type || 'default' }} - + env: ${{ fromJSON(needs.get-environments.outputs.envs) }} + env: # environment variable for use codecov’s env_vars tagging + ENV_NAME: ${{ matrix.env.name }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 filter: blob:none - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - with: - python-version: ${{ matrix.python-version }} - - - name: Install UV - uses: astral-sh/setup-uv@v5 + - uses: astral-sh/setup-uv@v5 with: enable-cache: true + python-version: ${{ matrix.env.python }} cache-dependency-glob: pyproject.toml - name: Cache downloaded data @@ -63,36 +69,25 @@ jobs: key: pytest - name: Install dependencies - if: matrix.dependencies-version == null - run: uv pip install --system --compile "scanpy[dev,test-full] @ ." - - name: Install dependencies (no optional features) - if: matrix.dependencies-version == 'min-optional' - run: uv pip install --system --compile "scanpy[dev,test-min] @ ." - - name: Install dependencies (minimum versions) - if: matrix.dependencies-version == 'minimum' - run: | - uv pip install --system --compile tomli packaging - deps=$(python3 ci/scripts/min-deps.py pyproject.toml --extra dev test) - uv pip install --system --compile $deps "scanpy @ ." - - name: Install dependencies (pre-release versions) - if: matrix.dependencies-version == 'pre-release' - run: uv pip install -v --system --compile --pre "scanpy[dev,test-full] @ ." "anndata[dev,test] @ git+https://github.com/scverse/anndata.git" + run: uvx hatch env create ${{ matrix.env.name }} - - name: Run pytest - if: matrix.test-type == null - run: pytest - - name: Run pytest (coverage) - if: matrix.test-type == 'coverage' - run: coverage run -m pytest --cov --cov-report=xml + - name: Run tests + if: matrix.env.test-type == null + run: uvx hatch run ${{ matrix.env.name }}:run + - name: Run tests (coverage) + if: matrix.env.test-type == 'coverage' + run: | + uvx hatch run ${{ matrix.env.name }}:run-cov + uvx hatch run ${{ matrix.env.name }}:coverage xml - name: Upload coverage data - uses: codecov/codecov-action@v4 - if: matrix.test-type == 'coverage' + uses: codecov/codecov-action@v5 + if: matrix.env.test-type == 'coverage' with: token: ${{ secrets.CODECOV_TOKEN }} - env_vars: "PYTHON,DEPS,TESTS" + env_vars: ENV_NAME fail_ci_if_error: true - file: test-data/coverage.xml + files: test-data/coverage.xml - name: Upload test results # yaml strings can’t start with “!”, so using explicit substitution @@ -100,18 +95,18 @@ jobs: uses: codecov/test-results-action@v1 with: token: ${{ secrets.CODECOV_TOKEN }} - env_vars: "PYTHON,DEPS,TESTS" + env_vars: ENV_NAME fail_ci_if_error: true file: test-data/test-results.xml - name: Publish debug artifacts - if: matrix.test-type == 'coverage' + if: matrix.env.test-type == 'coverage' uses: actions/upload-artifact@v4 with: - name: debug-data-${{ matrix.python-version }}-${{ matrix.dependencies-version || 'default' }}-${{ matrix.test-type || 'default' }} + name: debug-data-${{ matrix.env.name }} path: .pytest_cache/d/debug - check-build: + build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -126,3 +121,15 @@ jobs: enable-cache: false - run: uvx --from build pyproject-build --sdist --wheel . - run: uvx twine check dist/* + + check: + if: always() + needs: + - get-environments + - test + - build + runs-on: ubuntu-latest + steps: + - uses: re-actors/alls-green@release/v1 + with: + jobs: ${{ toJSON(needs) }} From c0f9d12f839e6f93113e7e44388b544f7da97be3 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Tue, 22 Apr 2025 15:53:40 +0200 Subject: [PATCH 02/12] fix jq --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f5e80e69c5..aba5fdde1b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,7 +36,7 @@ jobs: select(.key | startswith("hatch-test")) | { name: .key, - test-type: (if (.key | contains(["pre", "min"])) then "coverage" else null end), + "test-type": (if (.key | test("pre|min")) then "coverage" else null end), python: .value.python, } )') From 10f6e7e7dc7f724c05025be2a448606dca3ce865 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Tue, 22 Apr 2025 16:19:09 +0200 Subject: [PATCH 03/12] hm --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aba5fdde1b..a6ce09623a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: - uses: astral-sh/setup-uv@v5 with: enable-cache: false + - run: uvx hatch env show --json | jq . - id: get-envs run: | ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries From 60d57af32ff25d449f753fc335a24a9d476524f5 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Tue, 22 Apr 2025 16:20:47 +0200 Subject: [PATCH 04/12] wtf --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a6ce09623a..30e6b269b7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: - uses: astral-sh/setup-uv@v5 with: enable-cache: false - - run: uvx hatch env show --json | jq . + - run: uvx hatch env show --json - id: get-envs run: | ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries From 2686bccb6422d9efa3360e3afef1d555b877c57e Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Tue, 22 Apr 2025 16:22:11 +0200 Subject: [PATCH 05/12] wat --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 30e6b269b7..103bd8e179 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: - uses: astral-sh/setup-uv@v5 with: enable-cache: false - - run: uvx hatch env show --json + - run: jq --version - id: get-envs run: | ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries From bffe642b608727cfada62fca13783ab699fdd46a Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Tue, 22 Apr 2025 16:29:58 +0200 Subject: [PATCH 06/12] NO_COLOR --- .github/workflows/ci.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 103bd8e179..0d6d3d812b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,10 +29,9 @@ jobs: - uses: astral-sh/setup-uv@v5 with: enable-cache: false - - run: jq --version - id: get-envs run: | - ENVS_JSON=$(uvx hatch env show --json | jq -c 'to_entries + ENVS_JSON=$(NO_COLOR=1 uvx hatch env show --json | jq -c 'to_entries | map( select(.key | startswith("hatch-test")) | { From ab12072cbdb946c1b99a2d93878d9beec3d49201 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Thu, 24 Apr 2025 10:32:15 +0200 Subject: [PATCH 07/12] back to pytest-cov --- .github/workflows/ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0d6d3d812b..baa68dae3a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -69,16 +69,14 @@ jobs: key: pytest - name: Install dependencies - run: uvx hatch env create ${{ matrix.env.name }} + run: uvx hatch -v env create ${{ matrix.env.name }} - name: Run tests if: matrix.env.test-type == null run: uvx hatch run ${{ matrix.env.name }}:run - name: Run tests (coverage) if: matrix.env.test-type == 'coverage' - run: | - uvx hatch run ${{ matrix.env.name }}:run-cov - uvx hatch run ${{ matrix.env.name }}:coverage xml + run: uvx hatch run ${{ matrix.env.name }}:run-cov --cov --cov-report=xml - name: Upload coverage data uses: codecov/codecov-action@v5 From 8c343a670bcb951d0b0e19d0104f10e02b1cb69d Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Fri, 16 May 2025 17:04:34 +0200 Subject: [PATCH 08/12] Switch to min-vers --- .gitignore | 2 +- ci/scripts/{min-deps.py => min-vers.py} | 20 ++++++--- hatch.toml | 17 ++++--- pyproject.toml | 60 +++++++++++-------------- 4 files changed, 49 insertions(+), 50 deletions(-) rename ci/scripts/{min-deps.py => min-vers.py} (91%) diff --git a/.gitignore b/.gitignore index de85b8a6b7..8315711691 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ # Python build files __pycache__/ -/ci/scanpy-min-deps.txt +/ci/scanpy-min-vers.txt /dist/ /*-env/ /env-*/ diff --git a/ci/scripts/min-deps.py b/ci/scripts/min-vers.py similarity index 91% rename from ci/scripts/min-deps.py rename to ci/scripts/min-vers.py index 595b480b83..bcfe1221cf 100755 --- a/ci/scripts/min-deps.py +++ b/ci/scripts/min-vers.py @@ -3,7 +3,7 @@ # requires-python = ">=3.11" # dependencies = [ "packaging" ] # /// -"""Parse a pyproject.toml file and output a list of minimum dependencies.""" +"""Parse a pyproject.toml file and output a list of minimum dependency versions.""" from __future__ import annotations @@ -31,8 +31,9 @@ def min_dep(req: Requirement) -> Requirement: Example ------- >>> min_dep(Requirement("numpy>=1.0")) - - + + >>> min_dep(Requirement("numpy<3.0")) + """ req_name = req.name if req.extras: @@ -44,7 +45,6 @@ def min_dep(req: Requirement) -> Requirement: if not filter_specs: # TODO: handle markers return Requirement(f"{req_name}{req.specifier}") - min_version = Version("0.0.0.a1") for spec in filter_specs: if spec.operator in {">", ">=", "~="}: @@ -52,16 +52,17 @@ def min_dep(req: Requirement) -> Requirement: elif spec.operator == "==": min_version = Version(spec.version) - return Requirement(f"{req_name}=={min_version}.*") + return Requirement(f"{req_name}=={min_version}") def extract_min_deps( dependencies: Iterable[Requirement], *, pyproject ) -> Generator[Requirement, None, None]: - """Extract minimum dependencies from a list of requirements.""" + """Extract minimum dependency versions from a list of requirements.""" dependencies = deque(dependencies) # We'll be mutating this project_name = pyproject["project"]["name"] + deps = {} while len(dependencies) > 0: req = dependencies.pop() @@ -74,7 +75,11 @@ def extract_min_deps( extra_deps = pyproject["project"]["optional-dependencies"][extra] dependencies += map(Requirement, extra_deps) else: - yield min_dep(req) + if req.name in deps: + req.specifier &= deps[req.name].specifier + req.extras |= deps[req.name].extras + deps[req.name] = min_dep(req) + yield from deps.values() class Args(argparse.Namespace): @@ -100,6 +105,7 @@ def parser(cls) -> argparse.ArgumentParser: prog="min-deps", description=cls.__doc__, usage="pip install `python min-deps.py pyproject.toml`", + allow_abbrev=False, ) parser.add_argument( "_path", diff --git a/hatch.toml b/hatch.toml index df59372512..b846a8b483 100644 --- a/hatch.toml +++ b/hatch.toml @@ -15,25 +15,24 @@ scripts.clean = "git restore --source=HEAD --staged --worktree -- docs/release-n [envs.hatch-test] default-args = [ ] -features = [ "dev", "test", "dask-ml" ] +features = [ "dev", "test" ] extra-dependencies = [ "ipykernel" ] overrides.matrix.deps.env-vars = [ { if = [ "pre" ], key = "UV_PRERELEASE", value = "allow" }, - { if = [ "min" ], key = "UV_CONSTRAINT", value = "ci/scanpy-min-deps.txt" }, + { if = [ "min-vers" ], key = "UV_CONSTRAINT", value = "ci/scanpy-min-vers.txt" }, ] overrides.matrix.deps.pre-install-commands = [ - { if = [ "min" ], value = "uv run ci/scripts/min-deps.py pyproject.toml --all-extras -o ci/scanpy-min-deps.txt" }, + { if = [ + "min-vers", + ], value = "uv run ci/scripts/min-vers.py pyproject.toml --all-extras -o ci/scanpy-min-vers.txt" }, ] overrides.matrix.deps.python = [ - { if = [ "min" ], value = "3.11" }, - { if = [ "stable", "full", "pre" ], value = "3.13" }, -] -overrides.matrix.deps.features = [ - { if = [ "full" ], value = "test-full" }, + { if = [ "min-vers" ], value = "3.11" }, + { if = [ "stable", "pre" ], value = "3.13" }, ] overrides.matrix.deps.extra-dependencies = [ { if = [ "pre" ], value = "anndata[dev,test] @ git+https://github.com/scverse/anndata.git" }, ] [[envs.hatch-test.matrix]] -deps = [ "stable", "full", "pre", "min" ] +deps = [ "stable", "pre", "min-vers" ] diff --git a/pyproject.toml b/pyproject.toml index 838dbcc377..83600448e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,26 +46,26 @@ classifiers = [ "Topic :: Scientific/Engineering :: Visualization", ] dependencies = [ - "anndata>=0.9", - "numpy>=1.25", - "matplotlib>=3.7", - "pandas >=2.0", - "scipy>=1.11", - "seaborn>=0.13", - "h5py>=3.8", + "anndata>=0.9.2", + "numpy>=1.25.2", + "matplotlib>=3.7.5", + "pandas >=2.0.3", + "scipy>=1.11.1", + "seaborn>=0.13.2", + "h5py>=3.8.0", "tqdm", - "scikit-learn>=1.1,<1.6", - "statsmodels>=0.14", + "scikit-learn>=1.1.3,<1.6", + "statsmodels>=0.14.4", "patsy!=1.0.0", # https://github.com/pydata/patsy/issues/215 - "networkx>=2.8", + "networkx>=2.8.8", "natsort", "joblib", - "numba>=0.58", - "umap-learn>=0.5,!=0.5", - "pynndescent>=0.5", + "numba>=0.58.1", + "umap-learn>=0.5.7", + "pynndescent>=0.5.13", "packaging>=21.3", "session-info2", - "legacy-api-wrap>=1.4", # for positional API deprecations + "legacy-api-wrap>=1.4.1", # for positional API deprecations "typing-extensions; python_version < '3.13'", ] dynamic = [ "version" ] @@ -94,27 +94,21 @@ test-min = [ ] test = [ "scanpy[test-min]", - # Optional but important dependencies - "scanpy[leiden]", - "zarr<3", + # optional storage and processing modes "scanpy[dask]", - "scanpy[scrublet]", -] -test-full = [ - "scanpy[test]", - # optional storage modes "zappy", + "zarr<3", # additional tested algorithms + "scanpy[scrublet]", "scanpy[louvain]", + "scanpy[leiden]", "scanpy[magic]", "scanpy[skmisc]", "scanpy[harmony]", - "scanpy[scanorama]", "scanpy[dask-ml]", ] doc = [ - # https://github.com/sphinx-doc/sphinx/issues/13366 - "sphinx>=7,<8.2.0", + "sphinx>=7", "sphinx-book-theme>=1.1.0", "scanpydoc>=0.15.3", "sphinx-autodoc-typehints>=1.25.2", @@ -140,14 +134,14 @@ dev = [ ] # Algorithms paga = [ "igraph" ] -louvain = [ "igraph", "louvain>=0.6.0,!=0.6.2" ] # Louvain community detection -leiden = [ "igraph>=0.10", "leidenalg>=0.9.0" ] # Leiden community detection -bbknn = [ "bbknn" ] # Batch balanced KNN (batch correction) -magic = [ "magic-impute>=2.0" ] # MAGIC imputation method -skmisc = [ "scikit-misc>=0.1.3" ] # highly_variable_genes method 'seurat_v3' -harmony = [ "harmonypy" ] # Harmony dataset integration -scanorama = [ "scanorama" ] # Scanorama dataset integration -scrublet = [ "scikit-image>=0.20" ] # Doublet detection with automatic thresholds +louvain = [ "igraph", "louvain>=0.8.2" ] # Louvain community detection +leiden = [ "igraph>=0.10.8", "leidenalg>=0.9.0" ] # Leiden community detection +bbknn = [ "bbknn" ] # Batch balanced KNN (batch correction) +magic = [ "magic-impute>=2.0.4" ] # MAGIC imputation method +skmisc = [ "scikit-misc>=0.5.1" ] # highly_variable_genes method 'seurat_v3' +harmony = [ "harmonypy" ] # Harmony dataset integration +scanorama = [ "scanorama" ] # Scanorama dataset integration +scrublet = [ "scikit-image>=0.20.0" ] # Doublet detection with automatic thresholds # Acceleration rapids = [ "cudf>=0.9", "cuml>=0.9", "cugraph>=0.9" ] # GPU accelerated calculation of neighbors dask = [ "dask[array]>=2023.5.1,<2024.8.0" ] # Use the Dask parallelization engine From 539d026839dc23c2b454bea089ae87d98b6b36d9 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Fri, 16 May 2025 17:13:56 +0200 Subject: [PATCH 09/12] add min-extras job --- hatch.toml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/hatch.toml b/hatch.toml index b846a8b483..5d68d5b35b 100644 --- a/hatch.toml +++ b/hatch.toml @@ -15,7 +15,7 @@ scripts.clean = "git restore --source=HEAD --staged --worktree -- docs/release-n [envs.hatch-test] default-args = [ ] -features = [ "dev", "test" ] +features = [ "dev", "test-min" ] extra-dependencies = [ "ipykernel" ] overrides.matrix.deps.env-vars = [ { if = [ "pre" ], key = "UV_PRERELEASE", value = "allow" }, @@ -33,6 +33,9 @@ overrides.matrix.deps.python = [ overrides.matrix.deps.extra-dependencies = [ { if = [ "pre" ], value = "anndata[dev,test] @ git+https://github.com/scverse/anndata.git" }, ] +overrides.matrix.deps.features = [ + { if = [ "stable", "pre", "min-vers" ], value = "test" }, +] [[envs.hatch-test.matrix]] -deps = [ "stable", "pre", "min-vers" ] +deps = [ "stable", "pre", "min-vers", "min-extras" ] From 2da125391825b9fde669cbca90b633bf959fceaa Mon Sep 17 00:00:00 2001 From: "Philipp A." Date: Sat, 17 May 2025 12:40:39 +0200 Subject: [PATCH 10/12] Update .github/workflows/ci.yml Co-authored-by: Ilan Gold --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index baa68dae3a..4383a63897 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: strategy: matrix: env: ${{ fromJSON(needs.get-environments.outputs.envs) }} - env: # environment variable for use codecov’s env_vars tagging + env: # environment variable for use in codecov’s env_vars tagging ENV_NAME: ${{ matrix.env.name }} steps: - uses: actions/checkout@v4 From 4217bc3aef7e62dd3b30ac86743230a1c1b6bdf7 Mon Sep 17 00:00:00 2001 From: Phil Schaf Date: Mon, 26 May 2025 15:00:17 +0200 Subject: [PATCH 11/12] remove other external tools from tests --- pyproject.toml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 17eeb8d9b8..59a3690a60 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -103,9 +103,7 @@ test = [ "scanpy[scrublet]", "scanpy[louvain]", "scanpy[leiden]", - "scanpy[magic]", "scanpy[skmisc]", - "scanpy[harmony]", "scanpy[dask-ml]", ] doc = [ From 4a87e0921002091a21c7f115a9ae0877002214f3 Mon Sep 17 00:00:00 2001 From: "Philipp A." Date: Mon, 26 May 2025 18:55:46 +0200 Subject: [PATCH 12/12] rename --- .gitignore | 2 +- ci/scripts/{min-vers.py => low-vers.py} | 0 hatch.toml | 12 ++++++------ 3 files changed, 7 insertions(+), 7 deletions(-) rename ci/scripts/{min-vers.py => low-vers.py} (100%) diff --git a/.gitignore b/.gitignore index 8315711691..bbe3c82e58 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,7 @@ # Python build files __pycache__/ -/ci/scanpy-min-vers.txt +/ci/scanpy-low-vers.txt /dist/ /*-env/ /env-*/ diff --git a/ci/scripts/min-vers.py b/ci/scripts/low-vers.py similarity index 100% rename from ci/scripts/min-vers.py rename to ci/scripts/low-vers.py diff --git a/hatch.toml b/hatch.toml index 5d68d5b35b..fe1be3889b 100644 --- a/hatch.toml +++ b/hatch.toml @@ -19,23 +19,23 @@ features = [ "dev", "test-min" ] extra-dependencies = [ "ipykernel" ] overrides.matrix.deps.env-vars = [ { if = [ "pre" ], key = "UV_PRERELEASE", value = "allow" }, - { if = [ "min-vers" ], key = "UV_CONSTRAINT", value = "ci/scanpy-min-vers.txt" }, + { if = [ "low-vers" ], key = "UV_CONSTRAINT", value = "ci/scanpy-low-vers.txt" }, ] overrides.matrix.deps.pre-install-commands = [ { if = [ - "min-vers", - ], value = "uv run ci/scripts/min-vers.py pyproject.toml --all-extras -o ci/scanpy-min-vers.txt" }, + "low-vers", + ], value = "uv run ci/scripts/low-vers.py pyproject.toml --all-extras -o ci/scanpy-low-vers.txt" }, ] overrides.matrix.deps.python = [ - { if = [ "min-vers" ], value = "3.11" }, + { if = [ "low-vers" ], value = "3.11" }, { if = [ "stable", "pre" ], value = "3.13" }, ] overrides.matrix.deps.extra-dependencies = [ { if = [ "pre" ], value = "anndata[dev,test] @ git+https://github.com/scverse/anndata.git" }, ] overrides.matrix.deps.features = [ - { if = [ "stable", "pre", "min-vers" ], value = "test" }, + { if = [ "stable", "pre", "low-vers" ], value = "test" }, ] [[envs.hatch-test.matrix]] -deps = [ "stable", "pre", "min-vers", "min-extras" ] +deps = [ "stable", "pre", "low-vers", "few-extras" ]