anndata 0.12.1__tar.gz → 0.12.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- anndata-0.12.3/.github/dependabot.yml +9 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/benchmark.yml +7 -4
- anndata-0.12.1/.github/workflows/check-pr-milestoned.yml → anndata-0.12.3/.github/workflows/check-pr.yml +5 -1
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/publish.yml +1 -1
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/test-cpu.yml +40 -32
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/test-gpu.yml +14 -17
- {anndata-0.12.1 → anndata-0.12.3}/.pre-commit-config.yaml +2 -2
- {anndata-0.12.1 → anndata-0.12.3}/.readthedocs.yml +1 -1
- {anndata-0.12.1 → anndata-0.12.3}/PKG-INFO +6 -7
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/asv.conf.json +1 -1
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/anndata.py +10 -12
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/readwrite.py +5 -3
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/sparse_dataset.py +10 -12
- {anndata-0.12.1 → anndata-0.12.3}/docs/conf.py +2 -1
- anndata-0.12.3/docs/release-notes/0.12.2.md +6 -0
- anndata-0.12.3/docs/release-notes/0.12.3.md +14 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/tutorials/zarr-v3.md +2 -7
- {anndata-0.12.1 → anndata-0.12.3}/hatch.toml +1 -0
- {anndata-0.12.1 → anndata-0.12.3}/pyproject.toml +25 -15
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/__init__.py +23 -18
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/anndata.py +30 -12
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/index.py +6 -13
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/merge.py +28 -39
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/raw.py +5 -3
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/sparse_dataset.py +8 -8
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/views.py +21 -15
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/xarray.py +13 -12
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/h5ad.py +65 -49
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/read.py +17 -6
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/lazy_methods.py +1 -1
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/methods.py +38 -45
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/registry.py +17 -20
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/utils.py +2 -7
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/zarr.py +16 -13
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_settings.py +9 -1
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_settings.pyi +1 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/compat/__init__.py +32 -15
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/merge.py +86 -50
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/multi_files/_anncollection.py +2 -2
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/tests/helpers.py +44 -26
- {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/_pytest.py +2 -6
- {anndata-0.12.1 → anndata-0.12.3}/tests/conftest.py +4 -3
- anndata-0.12.3/tests/data/archives/v0.11.4/adata.h5ad +0 -0
- anndata-0.12.3/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
- anndata-0.12.3/tests/data/archives/v0.11.4/readme.md +10 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/test_read.py +4 -3
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_awkward.py +43 -45
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_backed_hdf5.py +66 -19
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_backed_sparse.py +28 -11
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_base.py +5 -5
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_concatenate.py +101 -113
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_concatenate_disk.py +12 -2
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_dask.py +31 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_dask_view_mem.py +3 -1
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_deprecations.py +6 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_extensions.py +3 -3
- anndata-0.12.3/tests/test_io_backwards_compat.py +77 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_dispatched.py +20 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_elementwise.py +1 -16
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_partial.py +1 -12
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_warnings.py +5 -18
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_readwrite.py +86 -46
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_structured_arrays.py +10 -1
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_views.py +54 -36
- anndata-0.12.1/src/anndata/_version.py +0 -62
- anndata-0.12.1/tests/test_io_backwards_compat.py +0 -54
- {anndata-0.12.1 → anndata-0.12.3}/.cirun.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.codecov.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.editorconfig +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/question.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/close-stale.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/codespell.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/label-stale.yml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.gitignore +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.gitmodules +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.prettierignore +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.prettierrc.yaml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.taplo.toml +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.vscode/launch.json +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/.vscode/settings.json +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/LICENSE +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/README.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/README.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/dataset2d.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/utils.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/biome.jsonc +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/ci/constraints.txt +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/ci/scripts/min-deps.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/ci/scripts/towncrier_automation.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/Makefile +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/_key_contributors.rst +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/_static/img/anndata_schema.svg +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/_templates/autosummary/class.rst +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/api.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/benchmark-read-write.ipynb +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/benchmarks.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/concatenation.rst +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/contributing.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/extensions/autosummary_skip_inherited.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/extensions/no_skip_abc_members.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/extensions/patch_myst_cite.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/fileformat-prose.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/index.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/interoperability.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/news.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/references.rst +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.1.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.2.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.3.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.4.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.5.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.6.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.7.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.8.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.9.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.1.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.2.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.3.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.4.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.12.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.12.1.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.4.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.5.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.6.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.6.x.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.2.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.3.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.4.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.5.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.6.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.7.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.8.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.8.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.9.0.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.9.1.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.9.2.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/index.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/docs/tutorials/index.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/access.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/aligned_df.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/aligned_mapping.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/extensions.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/file_backing.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/storage.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/write.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_types.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_warnings.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/abc.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/_dispatch_io.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/_compat.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/_io.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/_lazy_arrays.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/multi_files/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/pytorch/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/pytorch/_annloader.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/io.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/logging.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/tests/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/types.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/typing.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/anndata/utils.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/__init__.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/_doctest.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/py.typed +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/adata-comments.tsv +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/adata.csv +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/readme.md +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/excel.xlsx +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/data/umi_tools.tsv.gz +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/conftest.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/test_concat.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/test_write.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_anncollection.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_annot.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_backed_dense.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_get_vector.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_gpu.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_helpers.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_inplace_subset.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_conversion.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_utils.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_layers.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_obsmvarm.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_obspvarp.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_raw.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_repr.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_settings.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_transpose.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_uns.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_utils.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_x.py +0 -0
- {anndata-0.12.1 → anndata-0.12.3}/tests/test_xarray.py +0 -0
|
@@ -11,7 +11,10 @@ env:
|
|
|
11
11
|
|
|
12
12
|
defaults:
|
|
13
13
|
run:
|
|
14
|
-
|
|
14
|
+
# Add `-l` to GitHub’s default bash options to activate mamba environments
|
|
15
|
+
# https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax#exit-codes-and-error-action-preference
|
|
16
|
+
# https://github.com/mamba-org/setup-micromamba/#readme
|
|
17
|
+
shell: bash -elo pipefail {0}
|
|
15
18
|
|
|
16
19
|
jobs:
|
|
17
20
|
benchmark:
|
|
@@ -29,9 +32,10 @@ jobs:
|
|
|
29
32
|
ASV_DIR: "./benchmarks"
|
|
30
33
|
|
|
31
34
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
35
|
+
- uses: actions/checkout@v5
|
|
33
36
|
with:
|
|
34
37
|
fetch-depth: 0
|
|
38
|
+
# no blob filter so asv can checkout other commits
|
|
35
39
|
|
|
36
40
|
- run: git fetch origin main:main
|
|
37
41
|
if: ${{ github.ref_name != 'main' }}
|
|
@@ -42,11 +46,10 @@ jobs:
|
|
|
42
46
|
environment-name: asv
|
|
43
47
|
cache-environment: true
|
|
44
48
|
# Deps documented in https://asv.readthedocs.io/en/latest/installing.html
|
|
45
|
-
# libmambapy upper bound: https://github.com/airspeed-velocity/asv/issues/1438
|
|
46
49
|
create-args: >-
|
|
47
50
|
python=${{ matrix.python }}
|
|
48
51
|
asv
|
|
49
|
-
|
|
52
|
+
py_rattler
|
|
50
53
|
conda-build
|
|
51
54
|
|
|
52
55
|
- name: Cache datasets
|
|
@@ -24,7 +24,7 @@ env:
|
|
|
24
24
|
|
|
25
25
|
jobs:
|
|
26
26
|
check-milestone:
|
|
27
|
-
name: "Triage: Check
|
|
27
|
+
name: "Triage: Check PR title, milestone, and labels"
|
|
28
28
|
runs-on: ubuntu-latest
|
|
29
29
|
steps:
|
|
30
30
|
- name: Check if merging isn’t blocked
|
|
@@ -35,3 +35,7 @@ jobs:
|
|
|
35
35
|
uses: flying-sheep/check@v1
|
|
36
36
|
with:
|
|
37
37
|
success: ${{ github.event.pull_request.milestone != null || contains(env.LABELS, 'no milestone') }}
|
|
38
|
+
- name: Check if PR title is valid
|
|
39
|
+
uses: amannn/action-semantic-pull-request@v6
|
|
40
|
+
env: # Needs repo options: “Squash and merge” with commit message set to “PR title”
|
|
41
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
@@ -10,12 +10,7 @@ on:
|
|
|
10
10
|
env:
|
|
11
11
|
FORCE_COLOR: "1"
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
run:
|
|
15
|
-
shell: bash -el {0}
|
|
16
|
-
|
|
17
|
-
# Cancel the job if new commits are pushed
|
|
18
|
-
# https://stackoverflow.com/questions/66335225/how-to-cancel-previous-runs-in-the-pr-when-you-push-new-commitsupdate-the-curre
|
|
13
|
+
# Cancel the job if new commits are pushed: https://stackoverflow.com/q/66335225/247482
|
|
19
14
|
concurrency:
|
|
20
15
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
21
16
|
cancel-in-progress: true
|
|
@@ -26,11 +21,11 @@ jobs:
|
|
|
26
21
|
outputs:
|
|
27
22
|
envs: ${{ steps.get-envs.outputs.envs }}
|
|
28
23
|
steps:
|
|
29
|
-
- uses: actions/checkout@
|
|
24
|
+
- uses: actions/checkout@v5
|
|
30
25
|
with:
|
|
31
26
|
filter: blob:none
|
|
32
27
|
fetch-depth: 0
|
|
33
|
-
- uses: astral-sh/setup-uv@
|
|
28
|
+
- uses: astral-sh/setup-uv@v6
|
|
34
29
|
with:
|
|
35
30
|
enable-cache: false
|
|
36
31
|
- id: get-envs
|
|
@@ -38,9 +33,10 @@ jobs:
|
|
|
38
33
|
ENVS_JSON=$(NO_COLOR=1 uvx hatch env show --json | jq -c 'to_entries
|
|
39
34
|
| map(
|
|
40
35
|
select(.key | startswith("hatch-test"))
|
|
41
|
-
| { name: .key, python: .value.python }
|
|
36
|
+
| { name: .key, python: .value.python, args: (.value."extra-args" // [] | join(" ")) }
|
|
42
37
|
)')
|
|
43
38
|
echo "envs=${ENVS_JSON}" | tee $GITHUB_OUTPUT
|
|
39
|
+
|
|
44
40
|
test:
|
|
45
41
|
needs: get-environments
|
|
46
42
|
runs-on: ubuntu-latest
|
|
@@ -48,51 +44,68 @@ jobs:
|
|
|
48
44
|
matrix:
|
|
49
45
|
env: ${{ fromJSON(needs.get-environments.outputs.envs) }}
|
|
50
46
|
io_mark: ["zarr_io", "not zarr_io"]
|
|
51
|
-
env: # environment
|
|
47
|
+
env: # environment variables for use in codecov’s env_vars tagging
|
|
52
48
|
ENV_NAME: ${{ matrix.env.name }}
|
|
49
|
+
IO_MARK: ${{ matrix.io_mark }}
|
|
53
50
|
steps:
|
|
54
|
-
- uses: actions/checkout@
|
|
51
|
+
- uses: actions/checkout@v5
|
|
55
52
|
with:
|
|
56
53
|
fetch-depth: 0
|
|
57
54
|
filter: blob:none
|
|
58
55
|
|
|
59
|
-
- name:
|
|
60
|
-
|
|
61
|
-
with:
|
|
62
|
-
python-version: ${{ matrix.env.python }}
|
|
56
|
+
- name: Install system dependencies
|
|
57
|
+
run: sudo apt install -y hdf5-tools
|
|
63
58
|
|
|
64
59
|
- name: Install UV
|
|
65
|
-
uses: astral-sh/setup-uv@
|
|
60
|
+
uses: astral-sh/setup-uv@v6
|
|
66
61
|
with:
|
|
67
62
|
enable-cache: true
|
|
68
|
-
|
|
63
|
+
python-version: ${{ matrix.env.python }}
|
|
69
64
|
|
|
70
65
|
- name: Install dependencies
|
|
71
|
-
run:
|
|
66
|
+
run: |
|
|
67
|
+
# https://github.com/pallets/click/issues/3066
|
|
68
|
+
uv tool install --with='click!=8.3.0' hatch
|
|
69
|
+
hatch -v env create ${{ matrix.env.name }}
|
|
72
70
|
|
|
73
71
|
- name: Run tests
|
|
74
|
-
|
|
72
|
+
env:
|
|
73
|
+
COVERAGE_PROCESS_START: ${{ github.workspace }}/pyproject.toml
|
|
74
|
+
run: |
|
|
75
|
+
hatch run ${{ matrix.env.name }}:run-cov -v --color=yes -n auto --junitxml=test-data/test-results.xml -m "${{ matrix.io_mark }}" ${{ matrix.env.args }}
|
|
76
|
+
hatch run ${{ matrix.env.name }}:cov-combine
|
|
77
|
+
hatch run ${{ matrix.env.name }}:coverage xml
|
|
78
|
+
|
|
79
|
+
- name: Upload test results
|
|
80
|
+
if: ${{ !cancelled() }}
|
|
81
|
+
uses: codecov/test-results-action@v1
|
|
82
|
+
with:
|
|
83
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
84
|
+
env_vars: ENV_NAME,IO_MARK
|
|
85
|
+
fail_ci_if_error: true
|
|
86
|
+
file: test-data/test-results.xml
|
|
75
87
|
|
|
76
88
|
- name: Upload coverage data
|
|
77
89
|
uses: codecov/codecov-action@v5
|
|
78
90
|
with:
|
|
79
91
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
80
|
-
env_vars: ENV_NAME
|
|
92
|
+
env_vars: ENV_NAME,IO_MARK
|
|
81
93
|
fail_ci_if_error: true
|
|
82
94
|
files: test-data/coverage.xml
|
|
83
95
|
|
|
84
96
|
build:
|
|
85
|
-
runs-on: ubuntu-
|
|
97
|
+
runs-on: ubuntu-24.04
|
|
86
98
|
steps:
|
|
87
|
-
- uses: actions/checkout@
|
|
99
|
+
- uses: actions/checkout@v5
|
|
88
100
|
with:
|
|
89
101
|
fetch-depth: 0
|
|
90
102
|
filter: blob:none
|
|
91
103
|
|
|
92
|
-
- name: Set up Python
|
|
104
|
+
- name: Set up Python
|
|
93
105
|
uses: actions/setup-python@v5
|
|
94
106
|
with:
|
|
95
|
-
python-version: '3.
|
|
107
|
+
python-version: '3.x'
|
|
108
|
+
cache: pip
|
|
96
109
|
|
|
97
110
|
- name: Install build tools and requirements
|
|
98
111
|
run: |
|
|
@@ -107,11 +120,6 @@ jobs:
|
|
|
107
120
|
python -m build --sdist --wheel .
|
|
108
121
|
twine check dist/*
|
|
109
122
|
|
|
110
|
-
- name: Check runtime version
|
|
111
|
-
run: |
|
|
112
|
-
pip install dist/*.whl
|
|
113
|
-
python -c 'import anndata; print(anndata.__version__)'
|
|
114
|
-
|
|
115
123
|
check:
|
|
116
124
|
if: always()
|
|
117
125
|
needs:
|
|
@@ -120,6 +128,6 @@ jobs:
|
|
|
120
128
|
- build
|
|
121
129
|
runs-on: ubuntu-latest
|
|
122
130
|
steps:
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
131
|
+
- uses: re-actors/alls-green@release/v1
|
|
132
|
+
with:
|
|
133
|
+
jobs: ${{ toJSON(needs) }}
|
|
@@ -13,10 +13,6 @@ env:
|
|
|
13
13
|
PYTEST_ADDOPTS: "-v --color=yes"
|
|
14
14
|
FORCE_COLOR: "1"
|
|
15
15
|
|
|
16
|
-
defaults:
|
|
17
|
-
run:
|
|
18
|
-
shell: bash -el {0}
|
|
19
|
-
|
|
20
16
|
# Cancel the job if new commits are pushed
|
|
21
17
|
# https://stackoverflow.com/questions/66335225/how-to-cancel-previous-runs-in-the-pr-when-you-push-new-commitsupdate-the-curre
|
|
22
18
|
concurrency:
|
|
@@ -48,7 +44,7 @@ jobs:
|
|
|
48
44
|
timeout-minutes: 30
|
|
49
45
|
|
|
50
46
|
steps:
|
|
51
|
-
- uses: actions/checkout@v4
|
|
47
|
+
- uses: actions/checkout@v4 # TODO: upgrade once cirun image supports node 24
|
|
52
48
|
with:
|
|
53
49
|
fetch-depth: 0
|
|
54
50
|
filter: blob:none
|
|
@@ -66,28 +62,29 @@ jobs:
|
|
|
66
62
|
max_version=$(echo "$classifiers" | sort -V | tail -1)
|
|
67
63
|
echo "max_python_version=$max_version" >> $GITHUB_ENV
|
|
68
64
|
|
|
69
|
-
- name: Install Python
|
|
70
|
-
uses: actions/setup-python@v5
|
|
71
|
-
with:
|
|
72
|
-
# https://github.com/cupy/cupy/issues/8651 cupy does not support python3.13 yet
|
|
73
|
-
python-version: "3.12"
|
|
74
|
-
|
|
75
65
|
- name: Install UV
|
|
76
|
-
uses: astral-sh/setup-uv@
|
|
66
|
+
uses: astral-sh/setup-uv@v6
|
|
77
67
|
with:
|
|
78
68
|
enable-cache: true
|
|
79
|
-
|
|
69
|
+
python-version: ${{ env.max_python_version }}
|
|
80
70
|
|
|
81
71
|
- name: Install AnnData
|
|
82
|
-
run:
|
|
72
|
+
run: |
|
|
73
|
+
uv venv
|
|
74
|
+
uv pip install -e ".[dev,test,cu12]" -c ci/constraints.txt
|
|
83
75
|
|
|
84
76
|
- name: Env list
|
|
85
|
-
run: pip list
|
|
77
|
+
run: uv pip list
|
|
86
78
|
|
|
87
79
|
- name: Run test
|
|
88
|
-
|
|
80
|
+
env:
|
|
81
|
+
COVERAGE_PROCESS_START: ${{ github.workspace }}/pyproject.toml
|
|
82
|
+
run: |
|
|
83
|
+
uv run coverage run -m pytest -m gpu -n auto
|
|
84
|
+
uv run coverage combine
|
|
85
|
+
uv run coverage xml
|
|
89
86
|
|
|
90
|
-
- uses: codecov/codecov-action@
|
|
87
|
+
- uses: codecov/codecov-action@v5
|
|
91
88
|
with:
|
|
92
89
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
93
90
|
fail_ci_if_error: true
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: anndata
|
|
3
|
-
Version: 0.12.
|
|
3
|
+
Version: 0.12.3
|
|
4
4
|
Summary: Annotated data.
|
|
5
5
|
Project-URL: Documentation, https://anndata.readthedocs.io/
|
|
6
6
|
Project-URL: Source, https://github.com/scverse/anndata
|
|
@@ -38,15 +38,14 @@ Requires-Dist: cupy-cuda11x; extra == 'cu11'
|
|
|
38
38
|
Provides-Extra: cu12
|
|
39
39
|
Requires-Dist: cupy-cuda12x; extra == 'cu12'
|
|
40
40
|
Provides-Extra: dask
|
|
41
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
41
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'dask'
|
|
42
42
|
Provides-Extra: dev
|
|
43
|
-
Requires-Dist: hatch-vcs; extra == 'dev'
|
|
44
43
|
Requires-Dist: towncrier>=24.8.0; extra == 'dev'
|
|
45
44
|
Provides-Extra: dev-doc
|
|
46
45
|
Requires-Dist: towncrier>=24.8.0; extra == 'dev-doc'
|
|
47
46
|
Provides-Extra: doc
|
|
48
47
|
Requires-Dist: awkward>=2.3; extra == 'doc'
|
|
49
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
48
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'doc'
|
|
50
49
|
Requires-Dist: ipython; extra == 'doc'
|
|
51
50
|
Requires-Dist: myst-nb; extra == 'doc'
|
|
52
51
|
Requires-Dist: myst-parser; extra == 'doc'
|
|
@@ -64,14 +63,14 @@ Provides-Extra: gpu
|
|
|
64
63
|
Requires-Dist: cupy; extra == 'gpu'
|
|
65
64
|
Provides-Extra: lazy
|
|
66
65
|
Requires-Dist: aiohttp; extra == 'lazy'
|
|
67
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
66
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'lazy'
|
|
68
67
|
Requires-Dist: requests; extra == 'lazy'
|
|
69
68
|
Requires-Dist: xarray>=2025.06.1; extra == 'lazy'
|
|
70
69
|
Provides-Extra: test
|
|
71
70
|
Requires-Dist: aiohttp; extra == 'test'
|
|
72
71
|
Requires-Dist: awkward>=2.3.2; extra == 'test'
|
|
73
72
|
Requires-Dist: boltons; extra == 'test'
|
|
74
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
73
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'test'
|
|
75
74
|
Requires-Dist: dask[distributed]; extra == 'test'
|
|
76
75
|
Requires-Dist: filelock; extra == 'test'
|
|
77
76
|
Requires-Dist: httpx<1.0; extra == 'test'
|
|
@@ -93,7 +92,7 @@ Requires-Dist: xarray>=2025.06.1; extra == 'test'
|
|
|
93
92
|
Provides-Extra: test-min
|
|
94
93
|
Requires-Dist: awkward>=2.3.2; extra == 'test-min'
|
|
95
94
|
Requires-Dist: boltons; extra == 'test-min'
|
|
96
|
-
Requires-Dist: dask[array]!=2024.8.*,!=2024.9
|
|
95
|
+
Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*,>=2023.5.1; extra == 'test-min'
|
|
97
96
|
Requires-Dist: dask[distributed]; extra == 'test-min'
|
|
98
97
|
Requires-Dist: filelock; extra == 'test-min'
|
|
99
98
|
Requires-Dist: httpx<1.0; extra == 'test-min'
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
// If missing or the empty string, the tool will be automatically
|
|
37
37
|
// determined by looking for tools on the PATH environment
|
|
38
38
|
// variable.
|
|
39
|
-
"environment_type": "
|
|
39
|
+
"environment_type": "rattler",
|
|
40
40
|
// timeout in seconds for installing any dependencies in environment
|
|
41
41
|
// defaults to 10 min
|
|
42
42
|
//"install_timeout": 600,
|
|
@@ -13,18 +13,16 @@ class GarbargeCollectionSuite:
|
|
|
13
13
|
# custom because `memory_profiler` is a line-by-line profiler (also: https://github.com/pythonprofilers/memory_profiler/issues/402)
|
|
14
14
|
def track_peakmem_garbage_collection(self, *_):
|
|
15
15
|
def display_top(snapshot, key_type="lineno"):
|
|
16
|
-
snapshot = snapshot.filter_traces(
|
|
17
|
-
(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
)
|
|
27
|
-
)
|
|
16
|
+
snapshot = snapshot.filter_traces((
|
|
17
|
+
tracemalloc.Filter(
|
|
18
|
+
inclusive=False,
|
|
19
|
+
filename_pattern="<frozen importlib._bootstrap>",
|
|
20
|
+
),
|
|
21
|
+
tracemalloc.Filter(
|
|
22
|
+
inclusive=False,
|
|
23
|
+
filename_pattern="<unknown>",
|
|
24
|
+
),
|
|
25
|
+
))
|
|
28
26
|
top_stats = snapshot.statistics(key_type)
|
|
29
27
|
total = sum(stat.size for stat in top_stats)
|
|
30
28
|
return total
|
|
@@ -171,9 +171,11 @@ class H5ADWriteSuite:
|
|
|
171
171
|
self.adata.write_h5ad(self.writepth, compression="gzip")
|
|
172
172
|
|
|
173
173
|
def track_peakmem_write_compressed(self, *_):
|
|
174
|
-
return get_peak_mem(
|
|
175
|
-
|
|
176
|
-
|
|
174
|
+
return get_peak_mem((
|
|
175
|
+
sedate(self.adata.write_h5ad),
|
|
176
|
+
(self.writepth,),
|
|
177
|
+
{"compression": "gzip"},
|
|
178
|
+
))
|
|
177
179
|
|
|
178
180
|
|
|
179
181
|
class H5ADBackedWriteSuite(H5ADWriteSuite):
|
|
@@ -21,18 +21,16 @@ def make_alternating_mask(n):
|
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class SparseCSRContiguousSlice:
|
|
24
|
-
_slices = MappingProxyType(
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
)
|
|
24
|
+
_slices = MappingProxyType({
|
|
25
|
+
"0:1000": slice(0, 1000),
|
|
26
|
+
"0:9000": slice(0, 9000),
|
|
27
|
+
":9000:-1": slice(None, 9000, -1),
|
|
28
|
+
"::-2": slice(None, None, 2),
|
|
29
|
+
"array": np.array([0, 5000, 9999]),
|
|
30
|
+
"arange": np.arange(0, 1000),
|
|
31
|
+
"first": 0,
|
|
32
|
+
"alternating": make_alternating_mask(10),
|
|
33
|
+
})
|
|
36
34
|
params = (
|
|
37
35
|
[
|
|
38
36
|
(10_000, 10_000),
|
|
@@ -133,7 +133,8 @@ intersphinx_mapping = dict(
|
|
|
133
133
|
numpy=("https://numpy.org/doc/stable", None),
|
|
134
134
|
obstore=("https://developmentseed.org/obstore/latest/", None),
|
|
135
135
|
pandas=("https://pandas.pydata.org/pandas-docs/stable", None),
|
|
136
|
-
|
|
136
|
+
# TODO: switch to `/3` once docs are built with Python 3.14
|
|
137
|
+
python=("https://docs.python.org/3.13", None),
|
|
137
138
|
scipy=("https://docs.scipy.org/doc/scipy", None),
|
|
138
139
|
sklearn=("https://scikit-learn.org/stable", None),
|
|
139
140
|
xarray=("https://docs.xarray.dev/en/stable", None),
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
(v0.12.3)=
|
|
2
|
+
### 0.12.3 {small}`2025-10-16`
|
|
3
|
+
|
|
4
|
+
#### Miscellaneous changes
|
|
5
|
+
|
|
6
|
+
- Deprecate `AnnData.*_keys()` methods. {user}`flying-sheep` ({pr}`2102`)
|
|
7
|
+
|
|
8
|
+
#### Bug fixes
|
|
9
|
+
|
|
10
|
+
- Deprecate `__version__` and use standard {func}`~importlib.metadata.version` API {user}`flying-sheep` ({pr}`1318`)
|
|
11
|
+
- Allow writing of views of {class}`dask.array.Array` {user}`ilan-gold` ({pr}`2084`)
|
|
12
|
+
- Enable writing of views of {class}`~anndata.AnnData` in backed mode {user}`ilan-gold` ({pr}`2092`)
|
|
13
|
+
- Reallow writing of keys in `h5ad` files with forward slashes instead of erroring. Now a warning will be raised that the behavior will be disallowed in the future. To enable the new behavior, use {attr}`anndata.settings.disallow_forward_slash_in_h5ad`. {user}`ilan-gold` ({pr}`2097`)
|
|
14
|
+
- Respect off-axis merge options in {func}`anndata.experimental.concat_on_disk` {user}`ilan-gold` ({pr}`2122`)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# zarr-v3 Guide/Roadmap
|
|
2
2
|
|
|
3
|
-
`anndata` now uses the much improved {mod}`zarr` v3 package and also allows writing of datasets in the v3 format via {attr}`anndata.settings.zarr_write_format`, with the exception of structured arrays.
|
|
3
|
+
`anndata` now uses the much improved {mod}`zarr` v3 package and also allows writing of datasets in the v3 format via {attr}`anndata.settings.zarr_write_format` via {func}`anndata.io.write_zarr` or {meth}`anndata.AnnData.write_zarr`, with the exception of structured arrays.
|
|
4
4
|
Users should notice a significant performance improvement, especially for cloud data, but also likely for local data as well.
|
|
5
5
|
Here is a quick guide on some of our learnings so far:
|
|
6
6
|
|
|
@@ -48,7 +48,7 @@ import anndata as ad
|
|
|
48
48
|
from collections.abc import Mapping
|
|
49
49
|
from typing import Any
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
g = zarr.open_group(orig_path, mode="a", use_consolidated=False, zarr_version=3) # zarr_version 3 is default but note that sharding only works with v3!
|
|
52
52
|
|
|
53
53
|
def write_sharded(group: zarr.Group, adata: ad.AnnData):
|
|
54
54
|
def callback(
|
|
@@ -94,11 +94,6 @@ The default `zarr-python` v3 codec for the v3 format is no longer `blosc` but `z
|
|
|
94
94
|
While `zstd` is more widespread, you may find its performance to not meet your old expectations.
|
|
95
95
|
Therefore, we recommend passing in the {class}`zarr.codecs.BloscCodec` to `compressor` on {func}`~anndata.AnnData.write_zarr` if you wish to return to the old behavior.
|
|
96
96
|
|
|
97
|
-
There is currently a bug with `numcodecs` that prevents data written from other non-numcodecs `zstd` implementations from being read in by the default zarr pipeline (to which the above rust pipeline falls back if it cannot handle a datatype or indexing scheme, like `vlen-string`): {issue}`zarr-developers/numcodecs#424`.
|
|
98
|
-
Thus is may be advisable to use `BloscCodec` with `zarr` v3 file format data if you wish to use the rust-accelerated pipeline until this issue is resolved.
|
|
99
|
-
|
|
100
|
-
The same issue with `zstd` applies to data that may eventually be written by the GPU `zstd` implementation (see below).
|
|
101
|
-
|
|
102
97
|
## Dask
|
|
103
98
|
|
|
104
99
|
Zarr v3 should be compatible with dask, although the default behavior is to use zarr's chunking for dask's own. With sharding, this behavior may be undesirable as shards can often contain many small chunks, thereby slowing down i/o as dask will need to index into the zarr store for every chunk. Therefore it may be better to customize this behavior by passing `chunks=my_zarr_array.shards` as an argument to {func}`dask.array.from_zarr` or similar.
|
|
@@ -36,6 +36,7 @@ overrides.matrix.deps.python = [
|
|
|
36
36
|
overrides.matrix.deps.features = [
|
|
37
37
|
{ if = [ "stable", "pre" ], value = "test" },
|
|
38
38
|
]
|
|
39
|
+
overrides.matrix.deps.extra-args = { if = [ "stable", "pre" ], value = [ "--strict-warnings" ] }
|
|
39
40
|
|
|
40
41
|
[[envs.hatch-test.matrix]]
|
|
41
42
|
deps = [ "stable", "pre", "min" ]
|
|
@@ -57,8 +57,6 @@ Home-page = "https://github.com/scverse/anndata"
|
|
|
57
57
|
|
|
58
58
|
[project.optional-dependencies]
|
|
59
59
|
dev = [
|
|
60
|
-
# runtime dev version generation
|
|
61
|
-
"hatch-vcs",
|
|
62
60
|
"anndata[dev-doc]",
|
|
63
61
|
]
|
|
64
62
|
doc = [
|
|
@@ -82,7 +80,7 @@ dev-doc = [ "towncrier>=24.8.0" ] # release notes tool
|
|
|
82
80
|
test-min = [
|
|
83
81
|
"loompy>=3.0.5",
|
|
84
82
|
"pytest>=8.2,<8.3.4",
|
|
85
|
-
"pytest-cov",
|
|
83
|
+
"pytest-cov", # only for VS Code
|
|
86
84
|
"pytest-randomly",
|
|
87
85
|
"pytest-memray",
|
|
88
86
|
"pytest-mock",
|
|
@@ -109,7 +107,9 @@ cu11 = [ "cupy-cuda11x" ]
|
|
|
109
107
|
lazy = [ "xarray>=2025.06.1", "aiohttp", "requests", "anndata[dask]" ]
|
|
110
108
|
# https://github.com/dask/dask/issues/11290
|
|
111
109
|
# https://github.com/dask/dask/issues/11752
|
|
112
|
-
dask = [
|
|
110
|
+
dask = [
|
|
111
|
+
"dask[array]>=2023.5.1,!=2024.8.*,!=2024.9.*,!=2025.2.*,!=2025.3.*,!=2025.4.*,!=2025.5.*,!=2025.6.*,!=2025.7.*,!=2025.8.*",
|
|
112
|
+
]
|
|
113
113
|
|
|
114
114
|
[tool.hatch.version]
|
|
115
115
|
source = "vcs"
|
|
@@ -118,17 +118,15 @@ raw-options.version_scheme = "release-branch-semver"
|
|
|
118
118
|
packages = [ "src/anndata", "src/testing" ]
|
|
119
119
|
|
|
120
120
|
[tool.coverage.run]
|
|
121
|
-
data_file = "test-data/coverage"
|
|
121
|
+
data_file = "test-data/raw-coverage"
|
|
122
122
|
source_pkgs = [ "anndata" ]
|
|
123
123
|
omit = [ "src/anndata/_version.py", "**/test_*.py" ]
|
|
124
124
|
concurrency = [ "multiprocessing" ]
|
|
125
|
-
parallel =
|
|
126
|
-
|
|
125
|
+
parallel = true
|
|
127
126
|
[tool.coverage.xml]
|
|
128
127
|
output = "test-data/coverage.xml"
|
|
129
128
|
[tool.coverage.paths]
|
|
130
129
|
source = [ "./src", "**/site-packages" ]
|
|
131
|
-
|
|
132
130
|
[tool.coverage.report]
|
|
133
131
|
exclude_also = [
|
|
134
132
|
"if TYPE_CHECKING:",
|
|
@@ -146,6 +144,12 @@ addopts = [
|
|
|
146
144
|
filterwarnings = [
|
|
147
145
|
"ignore::anndata._warnings.OldFormatWarning",
|
|
148
146
|
"ignore::anndata._warnings.ExperimentalFeatureWarning",
|
|
147
|
+
"ignore:.*first_column_names:FutureWarning:scanpy", # scanpy 1.10.x
|
|
148
|
+
"ignore:Importing read_.* from `anndata` is deprecated:FutureWarning:scanpy",
|
|
149
|
+
"ignore:`__version__` is deprecated:FutureWarning:scanpy",
|
|
150
|
+
# https://github.com/matplotlib/matplotlib/pull/30589
|
|
151
|
+
"ignore:.*'(oneOf|parseString|resetCache|enablePackrat)'.*'(one_of|parse_string|reset_cache|enable_packrat)':DeprecationWarning:matplotlib",
|
|
152
|
+
|
|
149
153
|
]
|
|
150
154
|
# When `--strict-warnings` is used, all warnings are treated as errors, except those:
|
|
151
155
|
filterwarnings_when_strict = [
|
|
@@ -158,6 +162,8 @@ filterwarnings_when_strict = [
|
|
|
158
162
|
"default:The codec `vlen-utf8:UserWarning",
|
|
159
163
|
"default:The dtype `StringDType():UserWarning",
|
|
160
164
|
"default:Consolidated metadata is:UserWarning",
|
|
165
|
+
"default:.*Structured:zarr.core.dtype.common.UnstableSpecificationWarning",
|
|
166
|
+
"default:.*FixedLengthUTF32:zarr.core.dtype.common.UnstableSpecificationWarning",
|
|
161
167
|
]
|
|
162
168
|
python_files = "test_*.py"
|
|
163
169
|
testpaths = [
|
|
@@ -174,6 +180,7 @@ markers = [ "gpu: mark test to run on GPU", "zarr_io: mark tests that involve za
|
|
|
174
180
|
src = [ "src" ]
|
|
175
181
|
|
|
176
182
|
[tool.ruff.format]
|
|
183
|
+
preview = true
|
|
177
184
|
docstring-code-format = true
|
|
178
185
|
|
|
179
186
|
[tool.ruff.lint]
|
|
@@ -247,10 +254,13 @@ single_file = false
|
|
|
247
254
|
package_dir = "src"
|
|
248
255
|
issue_format = "{{pr}}`{issue}`"
|
|
249
256
|
title_format = "(v{version})=\n### {version} {{small}}`{project_date}`"
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
fragment.
|
|
254
|
-
fragment.
|
|
255
|
-
fragment.
|
|
256
|
-
fragment.
|
|
257
|
+
# Valid fragments should be a subset of conventional commit types (except for `breaking`):
|
|
258
|
+
# https://github.com/commitizen/conventional-commit-types/blob/master/index.json
|
|
259
|
+
# style, refactor, test, build, ci: should not go into changelog
|
|
260
|
+
fragment.feat.name = "Features"
|
|
261
|
+
fragment.fix.name = "Bug fixes"
|
|
262
|
+
fragment.docs.name = "Documentation"
|
|
263
|
+
fragment.perf.name = "Performance"
|
|
264
|
+
fragment.chore.name = "Miscellaneous changes"
|
|
265
|
+
fragment.revert.name = "Revert"
|
|
266
|
+
fragment.breaking.name = "Breaking changes" # add `!` to commit type (e.g. “feature!:”)
|