anndata 0.12.2__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 (208) hide show
  1. anndata-0.12.3/.github/dependabot.yml +9 -0
  2. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/benchmark.yml +7 -4
  3. anndata-0.12.2/.github/workflows/check-pr-milestoned.yml → anndata-0.12.3/.github/workflows/check-pr.yml +5 -1
  4. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/publish.yml +1 -1
  5. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/test-cpu.yml +37 -32
  6. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/test-gpu.yml +14 -17
  7. {anndata-0.12.2 → anndata-0.12.3}/.pre-commit-config.yaml +2 -2
  8. {anndata-0.12.2 → anndata-0.12.3}/.readthedocs.yml +1 -1
  9. {anndata-0.12.2 → anndata-0.12.3}/PKG-INFO +6 -7
  10. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/asv.conf.json +1 -1
  11. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/benchmarks/anndata.py +10 -12
  12. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/benchmarks/readwrite.py +5 -3
  13. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/benchmarks/sparse_dataset.py +10 -12
  14. {anndata-0.12.2 → anndata-0.12.3}/docs/conf.py +2 -1
  15. anndata-0.12.3/docs/release-notes/0.12.3.md +14 -0
  16. {anndata-0.12.2 → anndata-0.12.3}/docs/tutorials/zarr-v3.md +0 -5
  17. {anndata-0.12.2 → anndata-0.12.3}/pyproject.toml +23 -16
  18. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/__init__.py +23 -18
  19. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/anndata.py +8 -7
  20. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/merge.py +28 -39
  21. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/sparse_dataset.py +8 -8
  22. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/views.py +1 -1
  23. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/h5ad.py +18 -27
  24. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/specs/lazy_methods.py +1 -1
  25. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/specs/methods.py +33 -40
  26. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/specs/registry.py +17 -20
  27. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/utils.py +2 -7
  28. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/zarr.py +16 -7
  29. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_settings.py +8 -0
  30. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_settings.pyi +1 -0
  31. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/compat/__init__.py +3 -11
  32. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/merge.py +86 -50
  33. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/multi_files/_anncollection.py +2 -2
  34. {anndata-0.12.2 → anndata-0.12.3}/src/testing/anndata/_pytest.py +2 -6
  35. {anndata-0.12.2 → anndata-0.12.3}/tests/conftest.py +2 -2
  36. {anndata-0.12.2 → anndata-0.12.3}/tests/lazy/test_read.py +4 -3
  37. {anndata-0.12.2 → anndata-0.12.3}/tests/test_awkward.py +43 -45
  38. {anndata-0.12.2 → anndata-0.12.3}/tests/test_backed_hdf5.py +65 -18
  39. {anndata-0.12.2 → anndata-0.12.3}/tests/test_backed_sparse.py +19 -6
  40. {anndata-0.12.2 → anndata-0.12.3}/tests/test_base.py +4 -4
  41. {anndata-0.12.2 → anndata-0.12.3}/tests/test_concatenate.py +101 -113
  42. {anndata-0.12.2 → anndata-0.12.3}/tests/test_concatenate_disk.py +12 -2
  43. {anndata-0.12.2 → anndata-0.12.3}/tests/test_dask.py +31 -0
  44. {anndata-0.12.2 → anndata-0.12.3}/tests/test_dask_view_mem.py +3 -1
  45. {anndata-0.12.2 → anndata-0.12.3}/tests/test_deprecations.py +6 -0
  46. {anndata-0.12.2 → anndata-0.12.3}/tests/test_extensions.py +3 -3
  47. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_dispatched.py +20 -0
  48. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_elementwise.py +1 -4
  49. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_partial.py +1 -6
  50. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_warnings.py +5 -18
  51. {anndata-0.12.2 → anndata-0.12.3}/tests/test_readwrite.py +41 -36
  52. {anndata-0.12.2 → anndata-0.12.3}/tests/test_views.py +21 -21
  53. anndata-0.12.2/src/anndata/_version.py +0 -62
  54. {anndata-0.12.2 → anndata-0.12.3}/.cirun.yml +0 -0
  55. {anndata-0.12.2 → anndata-0.12.3}/.codecov.yml +0 -0
  56. {anndata-0.12.2 → anndata-0.12.3}/.editorconfig +0 -0
  57. {anndata-0.12.2 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
  58. {anndata-0.12.2 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  59. {anndata-0.12.2 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
  60. {anndata-0.12.2 → anndata-0.12.3}/.github/ISSUE_TEMPLATE/question.yml +0 -0
  61. {anndata-0.12.2 → anndata-0.12.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  62. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/close-stale.yml +0 -0
  63. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/codespell.yml +0 -0
  64. {anndata-0.12.2 → anndata-0.12.3}/.github/workflows/label-stale.yml +0 -0
  65. {anndata-0.12.2 → anndata-0.12.3}/.gitignore +0 -0
  66. {anndata-0.12.2 → anndata-0.12.3}/.gitmodules +0 -0
  67. {anndata-0.12.2 → anndata-0.12.3}/.prettierignore +0 -0
  68. {anndata-0.12.2 → anndata-0.12.3}/.prettierrc.yaml +0 -0
  69. {anndata-0.12.2 → anndata-0.12.3}/.taplo.toml +0 -0
  70. {anndata-0.12.2 → anndata-0.12.3}/.vscode/launch.json +0 -0
  71. {anndata-0.12.2 → anndata-0.12.3}/.vscode/settings.json +0 -0
  72. {anndata-0.12.2 → anndata-0.12.3}/LICENSE +0 -0
  73. {anndata-0.12.2 → anndata-0.12.3}/README.md +0 -0
  74. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/README.md +0 -0
  75. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/benchmarks/__init__.py +0 -0
  76. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/benchmarks/dataset2d.py +0 -0
  77. {anndata-0.12.2 → anndata-0.12.3}/benchmarks/benchmarks/utils.py +0 -0
  78. {anndata-0.12.2 → anndata-0.12.3}/biome.jsonc +0 -0
  79. {anndata-0.12.2 → anndata-0.12.3}/ci/constraints.txt +0 -0
  80. {anndata-0.12.2 → anndata-0.12.3}/ci/scripts/min-deps.py +0 -0
  81. {anndata-0.12.2 → anndata-0.12.3}/ci/scripts/towncrier_automation.py +0 -0
  82. {anndata-0.12.2 → anndata-0.12.3}/docs/Makefile +0 -0
  83. {anndata-0.12.2 → anndata-0.12.3}/docs/_key_contributors.rst +0 -0
  84. {anndata-0.12.2 → anndata-0.12.3}/docs/_static/img/anndata_schema.svg +0 -0
  85. {anndata-0.12.2 → anndata-0.12.3}/docs/_templates/autosummary/class.rst +0 -0
  86. {anndata-0.12.2 → anndata-0.12.3}/docs/api.md +0 -0
  87. {anndata-0.12.2 → anndata-0.12.3}/docs/benchmark-read-write.ipynb +0 -0
  88. {anndata-0.12.2 → anndata-0.12.3}/docs/benchmarks.md +0 -0
  89. {anndata-0.12.2 → anndata-0.12.3}/docs/concatenation.rst +0 -0
  90. {anndata-0.12.2 → anndata-0.12.3}/docs/contributing.md +0 -0
  91. {anndata-0.12.2 → anndata-0.12.3}/docs/extensions/autosummary_skip_inherited.py +0 -0
  92. {anndata-0.12.2 → anndata-0.12.3}/docs/extensions/no_skip_abc_members.py +0 -0
  93. {anndata-0.12.2 → anndata-0.12.3}/docs/extensions/patch_myst_cite.py +0 -0
  94. {anndata-0.12.2 → anndata-0.12.3}/docs/fileformat-prose.md +0 -0
  95. {anndata-0.12.2 → anndata-0.12.3}/docs/index.md +0 -0
  96. {anndata-0.12.2 → anndata-0.12.3}/docs/interoperability.md +0 -0
  97. {anndata-0.12.2 → anndata-0.12.3}/docs/news.md +0 -0
  98. {anndata-0.12.2 → anndata-0.12.3}/docs/references.rst +0 -0
  99. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.0.md +0 -0
  100. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.1.md +0 -0
  101. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.2.md +0 -0
  102. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.3.md +0 -0
  103. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.4.md +0 -0
  104. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.5.md +0 -0
  105. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.6.md +0 -0
  106. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.7.md +0 -0
  107. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.8.md +0 -0
  108. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.10.9.md +0 -0
  109. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.11.0.md +0 -0
  110. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.11.1.md +0 -0
  111. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.11.2.md +0 -0
  112. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.11.3.md +0 -0
  113. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.11.4.md +0 -0
  114. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.12.0.md +0 -0
  115. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.12.1.md +0 -0
  116. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.12.2.md +0 -0
  117. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.4.0.md +0 -0
  118. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.5.0.md +0 -0
  119. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.6.0.md +0 -0
  120. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.6.x.md +0 -0
  121. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.0.md +0 -0
  122. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.2.md +0 -0
  123. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.3.md +0 -0
  124. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.4.md +0 -0
  125. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.5.md +0 -0
  126. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.6.md +0 -0
  127. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.7.md +0 -0
  128. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.7.8.md +0 -0
  129. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.8.0.md +0 -0
  130. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.9.0.md +0 -0
  131. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.9.1.md +0 -0
  132. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/0.9.2.md +0 -0
  133. {anndata-0.12.2 → anndata-0.12.3}/docs/release-notes/index.md +0 -0
  134. {anndata-0.12.2 → anndata-0.12.3}/docs/tutorials/index.md +0 -0
  135. {anndata-0.12.2 → anndata-0.12.3}/hatch.toml +0 -0
  136. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/__init__.py +0 -0
  137. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/access.py +0 -0
  138. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/aligned_df.py +0 -0
  139. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/aligned_mapping.py +0 -0
  140. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/extensions.py +0 -0
  141. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/file_backing.py +0 -0
  142. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/index.py +0 -0
  143. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/raw.py +0 -0
  144. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/storage.py +0 -0
  145. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_core/xarray.py +0 -0
  146. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/__init__.py +0 -0
  147. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/read.py +0 -0
  148. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/specs/__init__.py +0 -0
  149. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_io/write.py +0 -0
  150. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_types.py +0 -0
  151. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/_warnings.py +0 -0
  152. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/abc.py +0 -0
  153. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/__init__.py +0 -0
  154. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/_dispatch_io.py +0 -0
  155. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/backed/__init__.py +0 -0
  156. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/backed/_compat.py +0 -0
  157. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/backed/_io.py +0 -0
  158. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/backed/_lazy_arrays.py +0 -0
  159. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/multi_files/__init__.py +0 -0
  160. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/pytorch/__init__.py +0 -0
  161. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/experimental/pytorch/_annloader.py +0 -0
  162. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/io.py +0 -0
  163. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/logging.py +0 -0
  164. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/tests/__init__.py +0 -0
  165. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/tests/helpers.py +0 -0
  166. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/types.py +0 -0
  167. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/typing.py +0 -0
  168. {anndata-0.12.2 → anndata-0.12.3}/src/anndata/utils.py +0 -0
  169. {anndata-0.12.2 → anndata-0.12.3}/src/testing/anndata/__init__.py +0 -0
  170. {anndata-0.12.2 → anndata-0.12.3}/src/testing/anndata/_doctest.py +0 -0
  171. {anndata-0.12.2 → anndata-0.12.3}/src/testing/anndata/py.typed +0 -0
  172. {anndata-0.12.2 → anndata-0.12.3}/tests/data/adata-comments.tsv +0 -0
  173. {anndata-0.12.2 → anndata-0.12.3}/tests/data/adata.csv +0 -0
  174. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/readme.md +0 -0
  175. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.11.4/adata.h5ad +0 -0
  176. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.11.4/adata.zarr.zip +0 -0
  177. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.11.4/readme.md +0 -0
  178. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
  179. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
  180. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
  181. {anndata-0.12.2 → anndata-0.12.3}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
  182. {anndata-0.12.2 → anndata-0.12.3}/tests/data/excel.xlsx +0 -0
  183. {anndata-0.12.2 → anndata-0.12.3}/tests/data/umi_tools.tsv.gz +0 -0
  184. {anndata-0.12.2 → anndata-0.12.3}/tests/lazy/conftest.py +0 -0
  185. {anndata-0.12.2 → anndata-0.12.3}/tests/lazy/test_concat.py +0 -0
  186. {anndata-0.12.2 → anndata-0.12.3}/tests/lazy/test_write.py +0 -0
  187. {anndata-0.12.2 → anndata-0.12.3}/tests/test_anncollection.py +0 -0
  188. {anndata-0.12.2 → anndata-0.12.3}/tests/test_annot.py +0 -0
  189. {anndata-0.12.2 → anndata-0.12.3}/tests/test_backed_dense.py +0 -0
  190. {anndata-0.12.2 → anndata-0.12.3}/tests/test_get_vector.py +0 -0
  191. {anndata-0.12.2 → anndata-0.12.3}/tests/test_gpu.py +0 -0
  192. {anndata-0.12.2 → anndata-0.12.3}/tests/test_helpers.py +0 -0
  193. {anndata-0.12.2 → anndata-0.12.3}/tests/test_inplace_subset.py +0 -0
  194. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_backwards_compat.py +0 -0
  195. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_conversion.py +0 -0
  196. {anndata-0.12.2 → anndata-0.12.3}/tests/test_io_utils.py +0 -0
  197. {anndata-0.12.2 → anndata-0.12.3}/tests/test_layers.py +0 -0
  198. {anndata-0.12.2 → anndata-0.12.3}/tests/test_obsmvarm.py +0 -0
  199. {anndata-0.12.2 → anndata-0.12.3}/tests/test_obspvarp.py +0 -0
  200. {anndata-0.12.2 → anndata-0.12.3}/tests/test_raw.py +0 -0
  201. {anndata-0.12.2 → anndata-0.12.3}/tests/test_repr.py +0 -0
  202. {anndata-0.12.2 → anndata-0.12.3}/tests/test_settings.py +0 -0
  203. {anndata-0.12.2 → anndata-0.12.3}/tests/test_structured_arrays.py +0 -0
  204. {anndata-0.12.2 → anndata-0.12.3}/tests/test_transpose.py +0 -0
  205. {anndata-0.12.2 → anndata-0.12.3}/tests/test_uns.py +0 -0
  206. {anndata-0.12.2 → anndata-0.12.3}/tests/test_utils.py +0 -0
  207. {anndata-0.12.2 → anndata-0.12.3}/tests/test_x.py +0 -0
  208. {anndata-0.12.2 → 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
@@ -41,6 +36,7 @@ jobs:
41
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,10 +44,11 @@ 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
@@ -59,43 +56,56 @@ jobs:
59
56
  - name: Install system dependencies
60
57
  run: sudo apt install -y hdf5-tools
61
58
 
62
- - name: Set up Python ${{ matrix.env.python }}
63
- uses: actions/setup-python@v5
64
- with:
65
- python-version: ${{ matrix.env.python }}
66
-
67
59
  - name: Install UV
68
- uses: astral-sh/setup-uv@v5
60
+ uses: astral-sh/setup-uv@v6
69
61
  with:
70
62
  enable-cache: true
71
- cache-dependency-glob: pyproject.toml
63
+ python-version: ${{ matrix.env.python }}
72
64
 
73
65
  - name: Install dependencies
74
- 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 }}
75
70
 
76
71
  - name: Run tests
77
- 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 }}" ${{ matrix.env.args }}
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
78
87
 
79
88
  - name: Upload coverage data
80
89
  uses: codecov/codecov-action@v5
81
90
  with:
82
91
  token: ${{ secrets.CODECOV_TOKEN }}
83
- env_vars: ENV_NAME
92
+ env_vars: ENV_NAME,IO_MARK
84
93
  fail_ci_if_error: true
85
94
  files: test-data/coverage.xml
86
95
 
87
96
  build:
88
- runs-on: ubuntu-22.04
97
+ runs-on: ubuntu-24.04
89
98
  steps:
90
- - uses: actions/checkout@v4
99
+ - uses: actions/checkout@v5
91
100
  with:
92
101
  fetch-depth: 0
93
102
  filter: blob:none
94
103
 
95
- - name: Set up Python 3.13
104
+ - name: Set up Python
96
105
  uses: actions/setup-python@v5
97
106
  with:
98
- python-version: '3.13'
107
+ python-version: '3.x'
108
+ cache: pip
99
109
 
100
110
  - name: Install build tools and requirements
101
111
  run: |
@@ -110,11 +120,6 @@ jobs:
110
120
  python -m build --sdist --wheel .
111
121
  twine check dist/*
112
122
 
113
- - name: Check runtime version
114
- run: |
115
- pip install dist/*.whl
116
- python -c 'import anndata; print(anndata.__version__)'
117
-
118
123
  check:
119
124
  if: always()
120
125
  needs:
@@ -123,6 +128,6 @@ jobs:
123
128
  - build
124
129
  runs-on: ubuntu-latest
125
130
  steps:
126
- - uses: re-actors/alls-green@release/v1
127
- with:
128
- 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.2
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,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`)
@@ -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.
@@ -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,7 +144,12 @@ addopts = [
146
144
  filterwarnings = [
147
145
  "ignore::anndata._warnings.OldFormatWarning",
148
146
  "ignore::anndata._warnings.ExperimentalFeatureWarning",
149
- "ignore:.*first_column_names:FutureWarning:scanpy", # scanpy 1.10.x
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
+
150
153
  ]
151
154
  # When `--strict-warnings` is used, all warnings are treated as errors, except those:
152
155
  filterwarnings_when_strict = [
@@ -177,6 +180,7 @@ markers = [ "gpu: mark test to run on GPU", "zarr_io: mark tests that involve za
177
180
  src = [ "src" ]
178
181
 
179
182
  [tool.ruff.format]
183
+ preview = true
180
184
  docstring-code-format = true
181
185
 
182
186
  [tool.ruff.lint]
@@ -250,10 +254,13 @@ single_file = false
250
254
  package_dir = "src"
251
255
  issue_format = "{{pr}}`{issue}`"
252
256
  title_format = "(v{version})=\n### {version} {{small}}`{project_date}`"
253
- fragment.bugfix.name = "Bug fixes"
254
- fragment.doc.name = "Documentation"
255
- fragment.feature.name = "Features"
256
- fragment.misc.name = "Miscellaneous improvements"
257
- fragment.performance.name = "Performance"
258
- fragment.breaking.name = "Breaking changes"
259
- 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!:”)
@@ -12,7 +12,6 @@ from ._core.extensions import register_anndata_namespace
12
12
  from ._core.merge import concat
13
13
  from ._core.raw import Raw
14
14
  from ._settings import settings
15
- from ._version import __version__
16
15
  from ._warnings import (
17
16
  ExperimentalFeatureWarning,
18
17
  ImplicitModificationWarning,
@@ -28,22 +27,6 @@ from . import abc, experimental, typing, io, types # isort: skip
28
27
  # We use these in tests by attribute access
29
28
  from . import logging # noqa: F401 # isort: skip
30
29
 
31
- _DEPRECATED_IO = (
32
- "read_loom",
33
- "read_hdf",
34
- "read_excel",
35
- "read_umi_tools",
36
- "read_csv",
37
- "read_text",
38
- "read_mtx",
39
- )
40
- _DEPRECATED = {method: f"io.{method}" for method in _DEPRECATED_IO}
41
-
42
-
43
- def __getattr__(attr_name: str) -> Any:
44
- return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)
45
-
46
-
47
30
  __all__ = [
48
31
  "AnnData",
49
32
  "ExperimentalFeatureWarning",
@@ -51,7 +34,6 @@ __all__ = [
51
34
  "OldFormatWarning",
52
35
  "Raw",
53
36
  "WriteWarning",
54
- "__version__",
55
37
  "abc",
56
38
  "concat",
57
39
  "experimental",
@@ -63,3 +45,26 @@ __all__ = [
63
45
  "types",
64
46
  "typing",
65
47
  ]
48
+
49
+ _DEPRECATED_IO = (
50
+ "read_loom",
51
+ "read_hdf",
52
+ "read_excel",
53
+ "read_umi_tools",
54
+ "read_csv",
55
+ "read_text",
56
+ "read_mtx",
57
+ )
58
+ _DEPRECATED = {method: f"io.{method}" for method in _DEPRECATED_IO}
59
+
60
+
61
+ def __getattr__(attr_name: str) -> Any:
62
+ if attr_name == "__version__":
63
+ import warnings
64
+ from importlib.metadata import version
65
+
66
+ msg = "`__version__` is deprecated, use `importlib.metadata.version('anndata')` instead."
67
+ warnings.warn(msg, FutureWarning, stacklevel=2)
68
+ return version("anndata")
69
+
70
+ return module_get_attr_redirect(attr_name, deprecated_mapping=_DEPRECATED)