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.
Files changed (209) hide show
  1. anndata-0.12.3/.github/dependabot.yml +9 -0
  2. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/benchmark.yml +7 -4
  3. anndata-0.12.1/.github/workflows/check-pr-milestoned.yml → anndata-0.12.3/.github/workflows/check-pr.yml +5 -1
  4. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/publish.yml +1 -1
  5. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/test-cpu.yml +40 -32
  6. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/test-gpu.yml +14 -17
  7. {anndata-0.12.1 → anndata-0.12.3}/.pre-commit-config.yaml +2 -2
  8. {anndata-0.12.1 → anndata-0.12.3}/.readthedocs.yml +1 -1
  9. {anndata-0.12.1 → anndata-0.12.3}/PKG-INFO +6 -7
  10. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/asv.conf.json +1 -1
  11. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/anndata.py +10 -12
  12. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/readwrite.py +5 -3
  13. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/sparse_dataset.py +10 -12
  14. {anndata-0.12.1 → anndata-0.12.3}/docs/conf.py +2 -1
  15. anndata-0.12.3/docs/release-notes/0.12.2.md +6 -0
  16. anndata-0.12.3/docs/release-notes/0.12.3.md +14 -0
  17. {anndata-0.12.1 → anndata-0.12.3}/docs/tutorials/zarr-v3.md +2 -7
  18. {anndata-0.12.1 → anndata-0.12.3}/hatch.toml +1 -0
  19. {anndata-0.12.1 → anndata-0.12.3}/pyproject.toml +25 -15
  20. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/__init__.py +23 -18
  21. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/anndata.py +30 -12
  22. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/index.py +6 -13
  23. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/merge.py +28 -39
  24. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/raw.py +5 -3
  25. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/sparse_dataset.py +8 -8
  26. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/views.py +21 -15
  27. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/xarray.py +13 -12
  28. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/h5ad.py +65 -49
  29. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/read.py +17 -6
  30. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/lazy_methods.py +1 -1
  31. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/methods.py +38 -45
  32. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/registry.py +17 -20
  33. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/utils.py +2 -7
  34. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/zarr.py +16 -13
  35. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_settings.py +9 -1
  36. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_settings.pyi +1 -0
  37. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/compat/__init__.py +32 -15
  38. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/merge.py +86 -50
  39. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/multi_files/_anncollection.py +2 -2
  40. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/tests/helpers.py +44 -26
  41. {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/_pytest.py +2 -6
  42. {anndata-0.12.1 → anndata-0.12.3}/tests/conftest.py +4 -3
  43. anndata-0.12.3/tests/data/archives/v0.11.4/adata.h5ad +0 -0
  44. anndata-0.12.3/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
  45. anndata-0.12.3/tests/data/archives/v0.11.4/readme.md +10 -0
  46. {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/test_read.py +4 -3
  47. {anndata-0.12.1 → anndata-0.12.3}/tests/test_awkward.py +43 -45
  48. {anndata-0.12.1 → anndata-0.12.3}/tests/test_backed_hdf5.py +66 -19
  49. {anndata-0.12.1 → anndata-0.12.3}/tests/test_backed_sparse.py +28 -11
  50. {anndata-0.12.1 → anndata-0.12.3}/tests/test_base.py +5 -5
  51. {anndata-0.12.1 → anndata-0.12.3}/tests/test_concatenate.py +101 -113
  52. {anndata-0.12.1 → anndata-0.12.3}/tests/test_concatenate_disk.py +12 -2
  53. {anndata-0.12.1 → anndata-0.12.3}/tests/test_dask.py +31 -0
  54. {anndata-0.12.1 → anndata-0.12.3}/tests/test_dask_view_mem.py +3 -1
  55. {anndata-0.12.1 → anndata-0.12.3}/tests/test_deprecations.py +6 -0
  56. {anndata-0.12.1 → anndata-0.12.3}/tests/test_extensions.py +3 -3
  57. anndata-0.12.3/tests/test_io_backwards_compat.py +77 -0
  58. {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_dispatched.py +20 -0
  59. {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_elementwise.py +1 -16
  60. {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_partial.py +1 -12
  61. {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_warnings.py +5 -18
  62. {anndata-0.12.1 → anndata-0.12.3}/tests/test_readwrite.py +86 -46
  63. {anndata-0.12.1 → anndata-0.12.3}/tests/test_structured_arrays.py +10 -1
  64. {anndata-0.12.1 → anndata-0.12.3}/tests/test_views.py +54 -36
  65. anndata-0.12.1/src/anndata/_version.py +0 -62
  66. anndata-0.12.1/tests/test_io_backwards_compat.py +0 -54
  67. {anndata-0.12.1 → anndata-0.12.3}/.cirun.yml +0 -0
  68. {anndata-0.12.1 → anndata-0.12.3}/.codecov.yml +0 -0
  69. {anndata-0.12.1 → anndata-0.12.3}/.editorconfig +0 -0
  70. {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  71. {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  72. {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
  73. {anndata-0.12.1 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  74. {anndata-0.12.1 → anndata-0.12.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  75. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/close-stale.yml +0 -0
  76. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/codespell.yml +0 -0
  77. {anndata-0.12.1 → anndata-0.12.3}/.github/workflows/label-stale.yml +0 -0
  78. {anndata-0.12.1 → anndata-0.12.3}/.gitignore +0 -0
  79. {anndata-0.12.1 → anndata-0.12.3}/.gitmodules +0 -0
  80. {anndata-0.12.1 → anndata-0.12.3}/.prettierignore +0 -0
  81. {anndata-0.12.1 → anndata-0.12.3}/.prettierrc.yaml +0 -0
  82. {anndata-0.12.1 → anndata-0.12.3}/.taplo.toml +0 -0
  83. {anndata-0.12.1 → anndata-0.12.3}/.vscode/launch.json +0 -0
  84. {anndata-0.12.1 → anndata-0.12.3}/.vscode/settings.json +0 -0
  85. {anndata-0.12.1 → anndata-0.12.3}/LICENSE +0 -0
  86. {anndata-0.12.1 → anndata-0.12.3}/README.md +0 -0
  87. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/README.md +0 -0
  88. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/__init__.py +0 -0
  89. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/dataset2d.py +0 -0
  90. {anndata-0.12.1 → anndata-0.12.3}/benchmarks/benchmarks/utils.py +0 -0
  91. {anndata-0.12.1 → anndata-0.12.3}/biome.jsonc +0 -0
  92. {anndata-0.12.1 → anndata-0.12.3}/ci/constraints.txt +0 -0
  93. {anndata-0.12.1 → anndata-0.12.3}/ci/scripts/min-deps.py +0 -0
  94. {anndata-0.12.1 → anndata-0.12.3}/ci/scripts/towncrier_automation.py +0 -0
  95. {anndata-0.12.1 → anndata-0.12.3}/docs/Makefile +0 -0
  96. {anndata-0.12.1 → anndata-0.12.3}/docs/_key_contributors.rst +0 -0
  97. {anndata-0.12.1 → anndata-0.12.3}/docs/_static/img/anndata_schema.svg +0 -0
  98. {anndata-0.12.1 → anndata-0.12.3}/docs/_templates/autosummary/class.rst +0 -0
  99. {anndata-0.12.1 → anndata-0.12.3}/docs/api.md +0 -0
  100. {anndata-0.12.1 → anndata-0.12.3}/docs/benchmark-read-write.ipynb +0 -0
  101. {anndata-0.12.1 → anndata-0.12.3}/docs/benchmarks.md +0 -0
  102. {anndata-0.12.1 → anndata-0.12.3}/docs/concatenation.rst +0 -0
  103. {anndata-0.12.1 → anndata-0.12.3}/docs/contributing.md +0 -0
  104. {anndata-0.12.1 → anndata-0.12.3}/docs/extensions/autosummary_skip_inherited.py +0 -0
  105. {anndata-0.12.1 → anndata-0.12.3}/docs/extensions/no_skip_abc_members.py +0 -0
  106. {anndata-0.12.1 → anndata-0.12.3}/docs/extensions/patch_myst_cite.py +0 -0
  107. {anndata-0.12.1 → anndata-0.12.3}/docs/fileformat-prose.md +0 -0
  108. {anndata-0.12.1 → anndata-0.12.3}/docs/index.md +0 -0
  109. {anndata-0.12.1 → anndata-0.12.3}/docs/interoperability.md +0 -0
  110. {anndata-0.12.1 → anndata-0.12.3}/docs/news.md +0 -0
  111. {anndata-0.12.1 → anndata-0.12.3}/docs/references.rst +0 -0
  112. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.0.md +0 -0
  113. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.1.md +0 -0
  114. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.2.md +0 -0
  115. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.3.md +0 -0
  116. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.4.md +0 -0
  117. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.5.md +0 -0
  118. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.6.md +0 -0
  119. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.7.md +0 -0
  120. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.8.md +0 -0
  121. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.10.9.md +0 -0
  122. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.0.md +0 -0
  123. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.1.md +0 -0
  124. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.2.md +0 -0
  125. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.3.md +0 -0
  126. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.11.4.md +0 -0
  127. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.12.0.md +0 -0
  128. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.12.1.md +0 -0
  129. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.4.0.md +0 -0
  130. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.5.0.md +0 -0
  131. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.6.0.md +0 -0
  132. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.6.x.md +0 -0
  133. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.0.md +0 -0
  134. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.2.md +0 -0
  135. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.3.md +0 -0
  136. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.4.md +0 -0
  137. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.5.md +0 -0
  138. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.6.md +0 -0
  139. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.7.md +0 -0
  140. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.7.8.md +0 -0
  141. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.8.0.md +0 -0
  142. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.9.0.md +0 -0
  143. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.9.1.md +0 -0
  144. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/0.9.2.md +0 -0
  145. {anndata-0.12.1 → anndata-0.12.3}/docs/release-notes/index.md +0 -0
  146. {anndata-0.12.1 → anndata-0.12.3}/docs/tutorials/index.md +0 -0
  147. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/__init__.py +0 -0
  148. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/access.py +0 -0
  149. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/aligned_df.py +0 -0
  150. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/aligned_mapping.py +0 -0
  151. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/extensions.py +0 -0
  152. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/file_backing.py +0 -0
  153. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_core/storage.py +0 -0
  154. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/__init__.py +0 -0
  155. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/specs/__init__.py +0 -0
  156. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_io/write.py +0 -0
  157. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_types.py +0 -0
  158. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/_warnings.py +0 -0
  159. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/abc.py +0 -0
  160. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/__init__.py +0 -0
  161. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/_dispatch_io.py +0 -0
  162. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/__init__.py +0 -0
  163. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/_compat.py +0 -0
  164. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/_io.py +0 -0
  165. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/backed/_lazy_arrays.py +0 -0
  166. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/multi_files/__init__.py +0 -0
  167. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/pytorch/__init__.py +0 -0
  168. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/experimental/pytorch/_annloader.py +0 -0
  169. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/io.py +0 -0
  170. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/logging.py +0 -0
  171. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/tests/__init__.py +0 -0
  172. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/types.py +0 -0
  173. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/typing.py +0 -0
  174. {anndata-0.12.1 → anndata-0.12.3}/src/anndata/utils.py +0 -0
  175. {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/__init__.py +0 -0
  176. {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/_doctest.py +0 -0
  177. {anndata-0.12.1 → anndata-0.12.3}/src/testing/anndata/py.typed +0 -0
  178. {anndata-0.12.1 → anndata-0.12.3}/tests/data/adata-comments.tsv +0 -0
  179. {anndata-0.12.1 → anndata-0.12.3}/tests/data/adata.csv +0 -0
  180. {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/readme.md +0 -0
  181. {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
  182. {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
  183. {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
  184. {anndata-0.12.1 → anndata-0.12.3}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
  185. {anndata-0.12.1 → anndata-0.12.3}/tests/data/excel.xlsx +0 -0
  186. {anndata-0.12.1 → anndata-0.12.3}/tests/data/umi_tools.tsv.gz +0 -0
  187. {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/conftest.py +0 -0
  188. {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/test_concat.py +0 -0
  189. {anndata-0.12.1 → anndata-0.12.3}/tests/lazy/test_write.py +0 -0
  190. {anndata-0.12.1 → anndata-0.12.3}/tests/test_anncollection.py +0 -0
  191. {anndata-0.12.1 → anndata-0.12.3}/tests/test_annot.py +0 -0
  192. {anndata-0.12.1 → anndata-0.12.3}/tests/test_backed_dense.py +0 -0
  193. {anndata-0.12.1 → anndata-0.12.3}/tests/test_get_vector.py +0 -0
  194. {anndata-0.12.1 → anndata-0.12.3}/tests/test_gpu.py +0 -0
  195. {anndata-0.12.1 → anndata-0.12.3}/tests/test_helpers.py +0 -0
  196. {anndata-0.12.1 → anndata-0.12.3}/tests/test_inplace_subset.py +0 -0
  197. {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_conversion.py +0 -0
  198. {anndata-0.12.1 → anndata-0.12.3}/tests/test_io_utils.py +0 -0
  199. {anndata-0.12.1 → anndata-0.12.3}/tests/test_layers.py +0 -0
  200. {anndata-0.12.1 → anndata-0.12.3}/tests/test_obsmvarm.py +0 -0
  201. {anndata-0.12.1 → anndata-0.12.3}/tests/test_obspvarp.py +0 -0
  202. {anndata-0.12.1 → anndata-0.12.3}/tests/test_raw.py +0 -0
  203. {anndata-0.12.1 → anndata-0.12.3}/tests/test_repr.py +0 -0
  204. {anndata-0.12.1 → anndata-0.12.3}/tests/test_settings.py +0 -0
  205. {anndata-0.12.1 → anndata-0.12.3}/tests/test_transpose.py +0 -0
  206. {anndata-0.12.1 → anndata-0.12.3}/tests/test_uns.py +0 -0
  207. {anndata-0.12.1 → anndata-0.12.3}/tests/test_utils.py +0 -0
  208. {anndata-0.12.1 → anndata-0.12.3}/tests/test_x.py +0 -0
  209. {anndata-0.12.1 → anndata-0.12.3}/tests/test_xarray.py +0 -0
@@ -0,0 +1,9 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ labels:
8
+ - no milestone
9
+ - skip-gpu-ci
@@ -11,7 +11,10 @@ env:
11
11
 
12
12
  defaults:
13
13
  run:
14
- shell: bash -el {0}
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@v4
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
- libmambapy<2
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 Milestone"
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 }}
@@ -11,7 +11,7 @@ jobs:
11
11
  permissions:
12
12
  id-token: write # to authenticate as Trusted Publisher to pypi.org
13
13
  steps:
14
- - uses: actions/checkout@v4
14
+ - uses: actions/checkout@v5
15
15
  with:
16
16
  fetch-depth: 0
17
17
  filter: blob:none
@@ -10,12 +10,7 @@ on:
10
10
  env:
11
11
  FORCE_COLOR: "1"
12
12
 
13
- defaults:
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@v4
24
+ - uses: actions/checkout@v5
30
25
  with:
31
26
  filter: blob:none
32
27
  fetch-depth: 0
33
- - uses: astral-sh/setup-uv@v5
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 variable for use in codecov’s env_vars tagging
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@v4
51
+ - uses: actions/checkout@v5
55
52
  with:
56
53
  fetch-depth: 0
57
54
  filter: blob:none
58
55
 
59
- - name: Set up Python ${{ matrix.env.python }}
60
- uses: actions/setup-python@v5
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@v5
60
+ uses: astral-sh/setup-uv@v6
66
61
  with:
67
62
  enable-cache: true
68
- cache-dependency-glob: pyproject.toml
63
+ python-version: ${{ matrix.env.python }}
69
64
 
70
65
  - name: Install dependencies
71
- run: uvx hatch -v env create ${{ matrix.env.name }}
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
- run: uvx hatch run ${{ matrix.env.name }}:run-cov -v --color=yes -n auto --cov --cov-report=xml --junitxml=test-data/test-results.xml -m "${{matrix.io_mark}}"
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-22.04
97
+ runs-on: ubuntu-24.04
86
98
  steps:
87
- - uses: actions/checkout@v4
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 3.13
104
+ - name: Set up Python
93
105
  uses: actions/setup-python@v5
94
106
  with:
95
- python-version: '3.13'
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
- - uses: re-actors/alls-green@release/v1
124
- with:
125
- jobs: ${{ toJSON(needs) }}
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@v5
66
+ uses: astral-sh/setup-uv@v6
77
67
  with:
78
68
  enable-cache: true
79
- cache-dependency-glob: pyproject.toml
69
+ python-version: ${{ env.max_python_version }}
80
70
 
81
71
  - name: Install AnnData
82
- run: uv pip install --system -e ".[dev,test,cu12]" -c ci/constraints.txt
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
- run: coverage run -m pytest -m gpu -n auto --cov --cov-report=xml
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@v4
87
+ - uses: codecov/codecov-action@v5
91
88
  with:
92
89
  token: ${{ secrets.CODECOV_TOKEN }}
93
90
  fail_ci_if_error: true
@@ -1,8 +1,8 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.12.4
3
+ rev: v0.13.0
4
4
  hooks:
5
- - id: ruff
5
+ - id: ruff-check
6
6
  args: ["--fix"]
7
7
  - id: ruff-format
8
8
  # The following can be removed once PLR0917 is out of preview
@@ -1,6 +1,6 @@
1
1
  version: 2
2
2
  build:
3
- os: ubuntu-20.04
3
+ os: ubuntu-24.04
4
4
  tools:
5
5
  python: "3.13"
6
6
  jobs:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anndata
3
- Version: 0.12.1
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.*,<2025.2.0,>=2023.5.1; extra == 'dask'
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.*,<2025.2.0,>=2023.5.1; extra == 'doc'
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.*,<2025.2.0,>=2023.5.1; extra == 'lazy'
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.*,<2025.2.0,>=2023.5.1; extra == 'test'
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.*,<2025.2.0,>=2023.5.1; extra == 'test-min'
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": "mamba",
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
- tracemalloc.Filter(
19
- inclusive=False,
20
- filename_pattern="<frozen importlib._bootstrap>",
21
- ),
22
- tracemalloc.Filter(
23
- inclusive=False,
24
- filename_pattern="<unknown>",
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
- (sedate(self.adata.write_h5ad), (self.writepth,), {"compression": "gzip"})
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
- "0:1000": slice(0, 1000),
27
- "0:9000": slice(0, 9000),
28
- ":9000:-1": slice(None, 9000, -1),
29
- "::-2": slice(None, None, 2),
30
- "array": np.array([0, 5000, 9999]),
31
- "arange": np.arange(0, 1000),
32
- "first": 0,
33
- "alternating": make_alternating_mask(10),
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
- python=("https://docs.python.org/3", None),
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,6 @@
1
+ (v0.12.2)=
2
+ ### 0.12.2 {small}`2025-08-11`
3
+
4
+ ### Bug fixes
5
+
6
+ - Revert accidental change where {attr}`~anndata.AnnData.X` got written to disk when it was `None` {user}`flying-sheep` ({pr}`2054`)
@@ -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
- ad.settings.zarr_write_format = 3 # Absolutely crucial! Sharding is only for the v3 file format!
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 = [ "dask[array]>=2023.5.1,!=2024.8.*,!=2024.9.*,<2025.2.0" ]
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 = "true"
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
- fragment.bugfix.name = "Bug fixes"
251
- fragment.doc.name = "Documentation"
252
- fragment.feature.name = "Features"
253
- fragment.misc.name = "Miscellaneous improvements"
254
- fragment.performance.name = "Performance"
255
- fragment.breaking.name = "Breaking changes"
256
- fragment.dev.name = "Development Process"
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!:”)