anndata 0.11.3__tar.gz → 0.12.0rc1__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 (200) hide show
  1. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/ISSUE_TEMPLATE/bug-report.yml +10 -2
  2. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/benchmark.yml +7 -3
  3. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/codespell.yml +5 -4
  4. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/publish.yml +3 -0
  5. anndata-0.12.0rc1/.github/workflows/test-cpu.yml +123 -0
  6. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/test-gpu.yml +16 -9
  7. {anndata-0.11.3 → anndata-0.12.0rc1}/.gitignore +1 -2
  8. {anndata-0.11.3 → anndata-0.12.0rc1}/.pre-commit-config.yaml +9 -9
  9. {anndata-0.11.3 → anndata-0.12.0rc1}/.readthedocs.yml +1 -1
  10. anndata-0.12.0rc1/.taplo.toml +5 -0
  11. anndata-0.12.0rc1/.vscode/launch.json +26 -0
  12. anndata-0.12.0rc1/.vscode/settings.json +27 -0
  13. {anndata-0.11.3 → anndata-0.12.0rc1}/LICENSE +2 -1
  14. {anndata-0.11.3 → anndata-0.12.0rc1}/PKG-INFO +75 -27
  15. {anndata-0.11.3 → anndata-0.12.0rc1}/README.md +5 -4
  16. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/asv.conf.json +1 -23
  17. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/benchmarks/anndata.py +8 -2
  18. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/benchmarks/utils.py +2 -3
  19. anndata-0.12.0rc1/biome.jsonc +18 -0
  20. {anndata-0.11.3 → anndata-0.12.0rc1}/ci/scripts/min-deps.py +8 -8
  21. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/api.md +54 -2
  22. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/conf.py +40 -34
  23. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/extensions/no_skip_abc_members.py +1 -1
  24. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/fileformat-prose.md +1 -1
  25. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.11.0.md +1 -1
  26. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.11.1.md +1 -1
  27. anndata-0.12.0rc1/docs/release-notes/0.11.4.md +14 -0
  28. anndata-0.12.0rc1/docs/release-notes/0.12.0rc1.md +4 -0
  29. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/tutorials/index.md +2 -0
  30. anndata-0.12.0rc1/docs/tutorials/zarr-v3.md +105 -0
  31. {anndata-0.11.3 → anndata-0.12.0rc1}/hatch.toml +11 -11
  32. {anndata-0.11.3 → anndata-0.12.0rc1}/pyproject.toml +65 -51
  33. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/__init__.py +5 -33
  34. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/aligned_df.py +19 -3
  35. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/aligned_mapping.py +5 -7
  36. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/anndata.py +213 -116
  37. anndata-0.12.0rc1/src/anndata/_core/extensions.py +276 -0
  38. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/file_backing.py +16 -12
  39. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/index.py +37 -24
  40. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/merge.py +350 -88
  41. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/raw.py +7 -6
  42. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/sparse_dataset.py +73 -46
  43. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/storage.py +24 -11
  44. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/views.py +10 -2
  45. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/h5ad.py +27 -21
  46. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/read.py +19 -12
  47. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/specs/__init__.py +2 -2
  48. anndata-0.12.0rc1/src/anndata/_io/specs/lazy_methods.py +346 -0
  49. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/specs/methods.py +244 -73
  50. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/specs/registry.py +59 -37
  51. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/utils.py +33 -12
  52. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/write.py +18 -3
  53. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/zarr.py +46 -10
  54. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_settings.py +63 -39
  55. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_types.py +36 -20
  56. anndata-0.12.0rc1/src/anndata/_version.py +37 -0
  57. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/abc.py +4 -5
  58. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/compat/__init__.py +25 -60
  59. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/__init__.py +4 -3
  60. anndata-0.12.0rc1/src/anndata/experimental/backed/__init__.py +5 -0
  61. anndata-0.12.0rc1/src/anndata/experimental/backed/_compat.py +43 -0
  62. anndata-0.12.0rc1/src/anndata/experimental/backed/_io.py +159 -0
  63. anndata-0.12.0rc1/src/anndata/experimental/backed/_lazy_arrays.py +187 -0
  64. anndata-0.12.0rc1/src/anndata/experimental/backed/_xarray.py +146 -0
  65. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/merge.py +45 -37
  66. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/multi_files/_anncollection.py +31 -11
  67. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/pytorch/_annloader.py +39 -11
  68. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/io.py +1 -14
  69. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/logging.py +12 -7
  70. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/tests/helpers.py +209 -94
  71. anndata-0.12.0rc1/src/anndata/types.py +22 -0
  72. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/typing.py +7 -9
  73. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/utils.py +19 -13
  74. anndata-0.12.0rc1/src/testing/anndata/_doctest.py +16 -0
  75. {anndata-0.11.3 → anndata-0.12.0rc1}/src/testing/anndata/_pytest.py +8 -16
  76. anndata-0.12.0rc1/src/testing/anndata/py.typed +0 -0
  77. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/conftest.py +57 -1
  78. anndata-0.12.0rc1/tests/lazy/conftest.py +247 -0
  79. anndata-0.12.0rc1/tests/lazy/test_concat.py +320 -0
  80. anndata-0.12.0rc1/tests/lazy/test_read.py +157 -0
  81. anndata-0.12.0rc1/tests/lazy/test_write.py +46 -0
  82. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_backed_dense.py +2 -6
  83. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_backed_hdf5.py +6 -4
  84. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_backed_sparse.py +89 -54
  85. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_base.py +22 -3
  86. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_concatenate.py +39 -26
  87. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_concatenate_disk.py +8 -9
  88. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_dask.py +17 -10
  89. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_deprecations.py +6 -16
  90. anndata-0.12.0rc1/tests/test_extensions.py +230 -0
  91. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_helpers.py +3 -34
  92. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_backwards_compat.py +9 -6
  93. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_conversion.py +3 -2
  94. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_dispatched.py +56 -26
  95. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_elementwise.py +75 -54
  96. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_partial.py +22 -17
  97. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_utils.py +3 -7
  98. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_layers.py +23 -16
  99. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_readwrite.py +159 -50
  100. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_settings.py +4 -16
  101. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_structured_arrays.py +28 -22
  102. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_views.py +12 -13
  103. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_x.py +14 -13
  104. anndata-0.11.3/.azure-pipelines.yml +0 -129
  105. anndata-0.11.3/src/anndata/_io/specs/lazy_methods.py +0 -184
  106. anndata-0.11.3/src/anndata/_version.py +0 -16
  107. anndata-0.11.3/src/anndata/compat/exceptiongroups.py +0 -14
  108. {anndata-0.11.3 → anndata-0.12.0rc1}/.cirun.yml +0 -0
  109. {anndata-0.11.3 → anndata-0.12.0rc1}/.codecov.yml +0 -0
  110. {anndata-0.11.3 → anndata-0.12.0rc1}/.editorconfig +0 -0
  111. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  112. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
  113. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  114. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/check-pr-milestoned.yml +0 -0
  115. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/close-stale.yml +0 -0
  116. {anndata-0.11.3 → anndata-0.12.0rc1}/.github/workflows/label-stale.yml +0 -0
  117. {anndata-0.11.3 → anndata-0.12.0rc1}/.gitmodules +0 -0
  118. {anndata-0.11.3 → anndata-0.12.0rc1}/.prettierignore +0 -0
  119. {anndata-0.11.3 → anndata-0.12.0rc1}/.prettierrc.yaml +0 -0
  120. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/README.md +0 -0
  121. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/benchmarks/__init__.py +0 -0
  122. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/benchmarks/readwrite.py +0 -0
  123. {anndata-0.11.3 → anndata-0.12.0rc1}/benchmarks/benchmarks/sparse_dataset.py +0 -0
  124. {anndata-0.11.3 → anndata-0.12.0rc1}/ci/constraints.txt +0 -0
  125. {anndata-0.11.3 → anndata-0.12.0rc1}/ci/scripts/towncrier_automation.py +0 -0
  126. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/Makefile +0 -0
  127. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/_key_contributors.rst +0 -0
  128. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/_static/img/anndata_schema.svg +0 -0
  129. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/_templates/autosummary/class.rst +0 -0
  130. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/benchmark-read-write.ipynb +0 -0
  131. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/benchmarks.md +0 -0
  132. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/concatenation.rst +0 -0
  133. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/contributing.md +0 -0
  134. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/extensions/patch_myst_cite.py +0 -0
  135. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/index.md +0 -0
  136. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/interoperability.md +0 -0
  137. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/news.md +0 -0
  138. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/references.rst +0 -0
  139. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.0.md +0 -0
  140. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.1.md +0 -0
  141. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.2.md +0 -0
  142. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.3.md +0 -0
  143. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.4.md +0 -0
  144. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.5.md +0 -0
  145. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.6.md +0 -0
  146. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.7.md +0 -0
  147. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.8.md +0 -0
  148. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.10.9.md +0 -0
  149. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.11.2.md +0 -0
  150. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.11.3.md +0 -0
  151. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.4.0.md +0 -0
  152. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.5.0.md +0 -0
  153. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.6.0.md +0 -0
  154. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.6.x.md +0 -0
  155. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.0.md +0 -0
  156. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.2.md +0 -0
  157. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.3.md +0 -0
  158. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.4.md +0 -0
  159. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.5.md +0 -0
  160. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.6.md +0 -0
  161. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.7.md +0 -0
  162. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.7.8.md +0 -0
  163. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.8.0.md +0 -0
  164. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.9.0.md +0 -0
  165. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.9.1.md +0 -0
  166. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/0.9.2.md +0 -0
  167. {anndata-0.11.3 → anndata-0.12.0rc1}/docs/release-notes/index.md +0 -0
  168. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/__init__.py +0 -0
  169. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_core/access.py +0 -0
  170. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_io/__init__.py +0 -0
  171. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/_warnings.py +0 -0
  172. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/_dispatch_io.py +0 -0
  173. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/multi_files/__init__.py +0 -0
  174. {anndata-0.11.3 → anndata-0.12.0rc1}/src/anndata/experimental/pytorch/__init__.py +0 -0
  175. {anndata-0.11.3/src/testing/anndata → anndata-0.12.0rc1/src/anndata/tests}/__init__.py +0 -0
  176. /anndata-0.11.3/src/testing/anndata/py.typed → /anndata-0.12.0rc1/src/testing/anndata/__init__.py +0 -0
  177. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/adata-comments.tsv +0 -0
  178. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/adata.csv +0 -0
  179. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/archives/readme.md +0 -0
  180. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
  181. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
  182. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
  183. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
  184. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/excel.xlsx +0 -0
  185. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/data/umi_tools.tsv.gz +0 -0
  186. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_anncollection.py +0 -0
  187. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_annot.py +0 -0
  188. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_awkward.py +0 -0
  189. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_dask_view_mem.py +0 -0
  190. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_get_vector.py +0 -0
  191. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_gpu.py +0 -0
  192. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_inplace_subset.py +0 -0
  193. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_io_warnings.py +0 -0
  194. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_obsmvarm.py +0 -0
  195. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_obspvarp.py +0 -0
  196. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_raw.py +0 -0
  197. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_repr.py +0 -0
  198. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_transpose.py +0 -0
  199. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_uns.py +0 -0
  200. {anndata-0.11.3 → anndata-0.12.0rc1}/tests/test_utils.py +0 -0
@@ -53,10 +53,18 @@ body:
53
53
  description: |
54
54
  Which version of anndata and other related software you used.
55
55
 
56
- Please install `session-info`, run the following command, then paste the results into the text box below.
56
+ Please install `session-info2`, run the following command in a notebook,
57
+ click the “Copy as Markdown” button,
58
+ then paste the results into the text box below.
57
59
 
58
60
  ```python
59
- >>> import anndata, session_info; session_info.show(html=False, dependencies=True)
61
+ In[1]: import anndata, session_info2; session_info2.session_info(dependencies=True)
62
+ ```
63
+
64
+ Alternatively, run this in a console:
65
+
66
+ ```python
67
+ >>> import session_info2; print(session_info2.session_info(dependencies=True)._repr_mimebundle_()["text/markdown"])
60
68
  ```
61
69
  render: python
62
70
  validations:
@@ -6,12 +6,16 @@ on:
6
6
  pull_request:
7
7
  branches: [main]
8
8
 
9
+ env:
10
+ FORCE_COLOR: "1"
11
+
12
+ defaults:
13
+ run:
14
+ shell: bash -el {0}
15
+
9
16
  jobs:
10
17
  benchmark:
11
18
  runs-on: ${{ matrix.os }}
12
- defaults:
13
- run:
14
- shell: bash -el {0} # -e to fail on error, -l for mamba
15
19
 
16
20
  strategy:
17
21
  fail-fast: false
@@ -16,7 +16,8 @@ jobs:
16
16
  runs-on: ubuntu-latest
17
17
 
18
18
  steps:
19
- - name: Checkout
20
- uses: actions/checkout@v4
21
- - name: Codespell
22
- uses: codespell-project/actions-codespell@v2
19
+ - uses: actions/checkout@v4
20
+ with:
21
+ fetch-depth: 0
22
+ filter: blob:none
23
+ - uses: codespell-project/actions-codespell@v2
@@ -12,6 +12,9 @@ jobs:
12
12
  id-token: write # to authenticate as Trusted Publisher to pypi.org
13
13
  steps:
14
14
  - uses: actions/checkout@v4
15
+ with:
16
+ fetch-depth: 0
17
+ filter: blob:none
15
18
  - uses: actions/setup-python@v5
16
19
  with:
17
20
  python-version: "3.x"
@@ -0,0 +1,123 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - "[0-9]+.[0-9]+.x"
8
+ pull_request:
9
+
10
+ env:
11
+ PYTEST_ADDOPTS: "-v --color=yes"
12
+ FORCE_COLOR: "1"
13
+
14
+ defaults:
15
+ run:
16
+ shell: bash -el {0}
17
+
18
+ # Cancel the job if new commits are pushed
19
+ # https://stackoverflow.com/questions/66335225/how-to-cancel-previous-runs-in-the-pr-when-you-push-new-commitsupdate-the-curre
20
+ concurrency:
21
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
22
+ cancel-in-progress: true
23
+
24
+ jobs:
25
+ pytest:
26
+ runs-on: ubuntu-latest
27
+ strategy:
28
+ matrix:
29
+ include:
30
+ - python-version: '3.13'
31
+ test-type: coverage
32
+ - python-version: '3.11'
33
+ test-type: standard
34
+ - python-version: '3.13'
35
+ dependencies-version: pre-release
36
+ test-type: strict-warning
37
+ - python-version: '3.11'
38
+ dependencies-version: minimum
39
+ test-type: coverage
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ with:
43
+ fetch-depth: 0
44
+ filter: blob:none
45
+
46
+ - name: Set up Python ${{ matrix.python-version }}
47
+ uses: actions/setup-python@v5
48
+ with:
49
+ python-version: ${{ matrix.python-version }}
50
+
51
+ - name: Install UV
52
+ uses: astral-sh/setup-uv@v5
53
+ with:
54
+ enable-cache: true
55
+ cache-dependency-glob: pyproject.toml
56
+
57
+ - name: Install dependencies
58
+ if: matrix.dependencies-version == null
59
+ run: uv pip install --system --compile "anndata[dev,test-full] @ ." -c ci/constraints.txt
60
+
61
+ - name: Install minimum dependencies
62
+ if: matrix.dependencies-version == 'minimum'
63
+ run: |
64
+ uv pip install --system --compile tomli packaging
65
+ deps=$(python3 ci/scripts/min-deps.py pyproject.toml --extra dev test)
66
+ uv pip install --system --compile $deps "anndata @ ."
67
+
68
+ - name: Install dependencies release candidates
69
+ if: matrix.dependencies-version == 'pre-release'
70
+ run: uv pip install -v --system --compile --pre "anndata[dev,test-full] @ ." -c ci/constraints.txt
71
+
72
+ - name: Display installed versions
73
+ run: uv pip list
74
+
75
+ - name: Run Pytest
76
+ if: matrix.test-type == 'standard'
77
+ run: pytest -n auto
78
+
79
+ - name: Run Pytest (coverage)
80
+ if: matrix.test-type == 'coverage'
81
+ run: coverage run -m pytest -n auto --cov --cov-report=xml
82
+
83
+ - name: Run Pytest (treat warnings as errors)
84
+ if: matrix.test-type == 'strict-warning'
85
+ run: pytest --strict-warnings -n auto
86
+
87
+ - uses: codecov/codecov-action@v4
88
+ if: matrix.test-type == 'coverage'
89
+ with:
90
+ token: ${{ secrets.CODECOV_TOKEN }}
91
+ fail_ci_if_error: true
92
+ files: test-data/coverage.xml
93
+
94
+ check-build:
95
+ runs-on: ubuntu-22.04
96
+ steps:
97
+ - uses: actions/checkout@v4
98
+ with:
99
+ fetch-depth: 0
100
+ filter: blob:none
101
+
102
+ - name: Set up Python 3.13
103
+ uses: actions/setup-python@v5
104
+ with:
105
+ python-version: '3.13'
106
+
107
+ - name: Install build tools and requirements
108
+ run: |
109
+ python -m pip install --upgrade pip
110
+ pip install build twine
111
+
112
+ - name: Display installed versions
113
+ run: pip list
114
+
115
+ - name: Build & Twine check
116
+ run: |
117
+ python -m build --sdist --wheel .
118
+ twine check dist/*
119
+
120
+ - name: Check runtime version
121
+ run: |
122
+ pip install dist/*.whl
123
+ python -c 'import anndata; print(anndata.__version__)'
@@ -9,6 +9,14 @@ on:
9
9
  - opened
10
10
  - synchronize
11
11
 
12
+ env:
13
+ PYTEST_ADDOPTS: "-v --color=yes"
14
+ FORCE_COLOR: "1"
15
+
16
+ defaults:
17
+ run:
18
+ shell: bash -el {0}
19
+
12
20
  # Cancel the job if new commits are pushed
13
21
  # https://stackoverflow.com/questions/66335225/how-to-cancel-previous-runs-in-the-pr-when-you-push-new-commitsupdate-the-curre
14
22
  concurrency:
@@ -39,14 +47,11 @@ jobs:
39
47
  # At time of writing, a typical run takes about 5 minutes
40
48
  timeout-minutes: 30
41
49
 
42
- defaults:
43
- run:
44
- shell: bash -el {0}
45
-
46
50
  steps:
47
51
  - uses: actions/checkout@v4
48
52
  with:
49
53
  fetch-depth: 0
54
+ filter: blob:none
50
55
 
51
56
  - name: Nvidia SMI sanity check
52
57
  run: nvidia-smi
@@ -64,12 +69,14 @@ jobs:
64
69
  - name: Install Python
65
70
  uses: actions/setup-python@v5
66
71
  with:
67
- python-version: ${{ env.max_python_version }}
72
+ # https://github.com/cupy/cupy/issues/8651 cupy does not support python3.13 yet
73
+ python-version: "3.12"
68
74
 
69
75
  - name: Install UV
70
- uses: hynek/setup-cached-uv@v2
76
+ uses: astral-sh/setup-uv@v5
71
77
  with:
72
- cache-dependency-path: pyproject.toml
78
+ enable-cache: true
79
+ cache-dependency-glob: pyproject.toml
73
80
 
74
81
  - name: Install AnnData
75
82
  run: uv pip install --system -e ".[dev,test,cu12]" -c ci/constraints.txt
@@ -78,13 +85,13 @@ jobs:
78
85
  run: pip list
79
86
 
80
87
  - name: Run test
81
- run: pytest -m gpu --cov --cov-report=xml --cov-context=test
88
+ run: coverage run -m pytest -m gpu -n auto --cov --cov-report=xml
82
89
 
83
90
  - uses: codecov/codecov-action@v4
84
91
  with:
85
92
  token: ${{ secrets.CODECOV_TOKEN }}
86
93
  fail_ci_if_error: true
87
- verbose: true
94
+ files: test-data/coverage.xml
88
95
 
89
96
  - name: Remove 'run-gpu-ci' Label
90
97
  if: always()
@@ -7,11 +7,11 @@ __pycache__/
7
7
  /*cache/
8
8
  /node_modules/
9
9
  /data/
10
+ /venv/
10
11
 
11
12
  # Distribution / packaging
12
13
  /dist/
13
14
  /ci/min-deps.txt
14
- /src/anndata/_version.py
15
15
  /requirements*.lock
16
16
  /.python-version
17
17
 
@@ -28,7 +28,6 @@ __pycache__/
28
28
 
29
29
  # IDEs
30
30
  /.idea/
31
- /.vscode/
32
31
 
33
32
  # Benchmark
34
33
  .asv
@@ -1,18 +1,18 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.8.1
3
+ rev: v0.11.4
4
4
  hooks:
5
5
  - id: ruff
6
- types_or: [python, pyi, jupyter]
7
6
  args: ["--fix"]
8
7
  - id: ruff-format
9
- types_or: [python, pyi, jupyter]
10
- - repo: https://github.com/pre-commit/mirrors-prettier
11
- rev: v4.0.0-alpha.8
8
+ - repo: https://github.com/biomejs/pre-commit
9
+ rev: v1.9.4
12
10
  hooks:
13
- - id: prettier
14
- exclude_types:
15
- - markdown
11
+ - id: biome-format
12
+ - repo: https://github.com/ComPWA/taplo-pre-commit
13
+ rev: v0.9.3
14
+ hooks:
15
+ - id: taplo-format
16
16
  - repo: https://github.com/pre-commit/pre-commit-hooks
17
17
  rev: v5.0.0
18
18
  hooks:
@@ -27,7 +27,7 @@ repos:
27
27
  - id: no-commit-to-branch
28
28
  args: ["--branch=main"]
29
29
  - repo: https://github.com/codespell-project/codespell
30
- rev: v2.3.0
30
+ rev: v2.4.1
31
31
  hooks:
32
32
  - id: codespell
33
33
  additional_dependencies:
@@ -2,7 +2,7 @@ version: 2
2
2
  build:
3
3
  os: ubuntu-20.04
4
4
  tools:
5
- python: "3.12"
5
+ python: "3.13"
6
6
  jobs:
7
7
  post_checkout:
8
8
  # unshallow so version can be derived from tag
@@ -0,0 +1,5 @@
1
+ [formatting]
2
+ array_auto_collapse = false
3
+ column_width = 120
4
+ compact_arrays = false
5
+ indent_string = ' '
@@ -0,0 +1,26 @@
1
+ {
2
+ "version": "0.2.0",
3
+ "configurations": [
4
+ {
5
+ "name": "Python: Build Docs",
6
+ "type": "debugpy",
7
+ "request": "launch",
8
+ "module": "sphinx",
9
+ "args": ["-M", "html", ".", "_build"],
10
+ "cwd": "${workspaceFolder}/docs",
11
+ "console": "internalConsole",
12
+ "justMyCode": false,
13
+ },
14
+ {
15
+ "name": "Python: Debug Test",
16
+ "type": "debugpy",
17
+ "request": "launch",
18
+ "program": "${file}",
19
+ "purpose": ["debug-test"],
20
+ "console": "internalConsole",
21
+ "justMyCode": false,
22
+ "env": { "PYTEST_ADDOPTS": "--color=yes" },
23
+ "presentation": { "hidden": true },
24
+ },
25
+ ],
26
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "[python][toml][json][jsonc]": {
3
+ "editor.formatOnSave": true,
4
+ "editor.codeActionsOnSave": {
5
+ "source.organizeImports": "explicit",
6
+ "source.fixAll": "explicit",
7
+ },
8
+ },
9
+ "[python]": {
10
+ "editor.defaultFormatter": "charliermarsh.ruff",
11
+ },
12
+ "[toml]": {
13
+ "editor.defaultFormatter": "tamasfe.even-better-toml",
14
+ },
15
+ "[json][jsonc]": {
16
+ "editor.defaultFormatter": "biomejs.biome",
17
+ },
18
+ "python.analysis.typeCheckingMode": "basic",
19
+ "python.testing.pytestEnabled": true,
20
+ "python.testing.pytestArgs": [
21
+ "--color=yes",
22
+ "-vv",
23
+ "--strict-warnings",
24
+ //"-nauto",
25
+ ],
26
+ "python.terminal.activateEnvironment": true,
27
+ }
@@ -1,6 +1,7 @@
1
1
  BSD 3-Clause License
2
2
 
3
- Copyright (c) 2017-2018 P. Angerer, F. Alexander Wolf, Theis Lab
3
+ Copyright (c) 2025, scverse®
4
+ Copyright (c) 2017-2018, P. Angerer, F. Alexander Wolf, Theis Lab
4
5
  All rights reserved.
5
6
 
6
7
  Redistribution and use in source and binary forms, with or without
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anndata
3
- Version: 0.11.3
3
+ Version: 0.12.0rc1
4
4
  Summary: Annotated data.
5
5
  Project-URL: Documentation, https://anndata.readthedocs.io/
6
6
  Project-URL: Source, https://github.com/scverse/anndata
7
7
  Project-URL: Home-page, https://github.com/scverse/anndata
8
8
  Author: Philipp Angerer, Alex Wolf, Isaac Virshup, Sergei Rybakov
9
- Maintainer-email: Isaac Virshup <ivirshup@gmail.com>, Philipp Angerer <philipp.angerer@helmholtz-munich.de>, Alex Wolf <f.alex.wolf@gmx.de>
9
+ Maintainer-email: Isaac Virshup <ivirshup@gmail.com>, Philipp Angerer <philipp.angerer@helmholtz-munich.de>, Ilan Gold <ilan.gold@helmholtz-munich.de>
10
10
  License-Expression: BSD-3-Clause
11
11
  License-File: LICENSE
12
12
  Classifier: Environment :: Console
@@ -18,74 +18,121 @@ Classifier: Operating System :: MacOS :: MacOS X
18
18
  Classifier: Operating System :: Microsoft :: Windows
19
19
  Classifier: Operating System :: POSIX :: Linux
20
20
  Classifier: Programming Language :: Python :: 3
21
- Classifier: Programming Language :: Python :: 3.10
22
21
  Classifier: Programming Language :: Python :: 3.11
23
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
24
24
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
25
25
  Classifier: Topic :: Scientific/Engineering :: Visualization
26
- Requires-Python: >=3.10
26
+ Requires-Python: >=3.11
27
27
  Requires-Dist: array-api-compat!=1.5,>1.4
28
- Requires-Dist: exceptiongroup; python_version < '3.11'
29
- Requires-Dist: h5py>=3.7
28
+ Requires-Dist: h5py>=3.8
29
+ Requires-Dist: legacy-api-wrap
30
30
  Requires-Dist: natsort
31
- Requires-Dist: numpy>=1.23
32
- Requires-Dist: packaging>=20.0
33
- Requires-Dist: pandas!=2.1.0rc0,!=2.1.2,>=1.4
34
- Requires-Dist: scipy>1.8
31
+ Requires-Dist: numpy>=1.25
32
+ Requires-Dist: packaging>=24.2
33
+ Requires-Dist: pandas!=2.1.0rc0,!=2.1.2,>=2.0.0
34
+ Requires-Dist: scipy>1.11
35
+ Requires-Dist: zarr!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,>=2.18.7
35
36
  Provides-Extra: cu11
36
37
  Requires-Dist: cupy-cuda11x; extra == 'cu11'
37
38
  Provides-Extra: cu12
38
39
  Requires-Dist: cupy-cuda12x; extra == 'cu12'
39
40
  Provides-Extra: dask
40
- Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,>=2022.09.2; extra == 'dask'
41
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'dask'
41
42
  Provides-Extra: dev
42
- Requires-Dist: pytest-xdist; extra == 'dev'
43
- Requires-Dist: setuptools-scm; extra == 'dev'
43
+ Requires-Dist: awkward>=2.3; extra == 'dev'
44
+ Requires-Dist: boltons; extra == 'dev'
45
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'dev'
46
+ Requires-Dist: dask[distributed]; extra == 'dev'
47
+ Requires-Dist: filelock; extra == 'dev'
48
+ Requires-Dist: hatch-vcs; extra == 'dev'
49
+ Requires-Dist: httpx; extra == 'dev'
50
+ Requires-Dist: joblib; extra == 'dev'
51
+ Requires-Dist: loompy>=3.0.5; extra == 'dev'
52
+ Requires-Dist: matplotlib; extra == 'dev'
53
+ Requires-Dist: openpyxl; extra == 'dev'
54
+ Requires-Dist: pyarrow; extra == 'dev'
55
+ Requires-Dist: pytest-cov; extra == 'dev'
56
+ Requires-Dist: pytest-memray; extra == 'dev'
57
+ Requires-Dist: pytest-mock; extra == 'dev'
58
+ Requires-Dist: pytest-randomly; extra == 'dev'
59
+ Requires-Dist: pytest-xdist[psutil]; extra == 'dev'
60
+ Requires-Dist: pytest<8.3.4,>=8.2; extra == 'dev'
61
+ Requires-Dist: scanpy>=1.10; extra == 'dev'
62
+ Requires-Dist: scikit-learn; extra == 'dev'
44
63
  Requires-Dist: towncrier>=24.8.0; extra == 'dev'
45
64
  Provides-Extra: dev-doc
46
65
  Requires-Dist: towncrier>=24.8.0; extra == 'dev-doc'
47
- Provides-Extra: dev-test
48
- Requires-Dist: pytest-xdist; extra == 'dev-test'
49
66
  Provides-Extra: doc
50
67
  Requires-Dist: awkward>=2.3; extra == 'doc'
68
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'doc'
51
69
  Requires-Dist: ipython; extra == 'doc'
70
+ Requires-Dist: myst-nb; extra == 'doc'
52
71
  Requires-Dist: myst-parser; extra == 'doc'
53
- Requires-Dist: nbsphinx; extra == 'doc'
54
72
  Requires-Dist: readthedocs-sphinx-search; extra == 'doc'
55
- Requires-Dist: scanpydoc[theme,typehints]>=0.14.1; extra == 'doc'
73
+ Requires-Dist: scanpydoc[theme,typehints]>=0.15.1; extra == 'doc'
56
74
  Requires-Dist: sphinx-autodoc-typehints>=2.2.0; extra == 'doc'
57
75
  Requires-Dist: sphinx-book-theme>=1.1.0; extra == 'doc'
58
76
  Requires-Dist: sphinx-copybutton; extra == 'doc'
59
77
  Requires-Dist: sphinx-design>=0.5.0; extra == 'doc'
60
78
  Requires-Dist: sphinx-issues; extra == 'doc'
61
79
  Requires-Dist: sphinx-toolbox>=3.8.0; extra == 'doc'
62
- Requires-Dist: sphinx>=7.4.6; extra == 'doc'
80
+ Requires-Dist: sphinx>=8.2.1; extra == 'doc'
63
81
  Requires-Dist: sphinxext-opengraph; extra == 'doc'
64
82
  Requires-Dist: towncrier>=24.8.0; extra == 'doc'
65
- Requires-Dist: zarr<3; extra == 'doc'
66
83
  Provides-Extra: gpu
67
84
  Requires-Dist: cupy; extra == 'gpu'
85
+ Provides-Extra: lazy
86
+ Requires-Dist: aiohttp; extra == 'lazy'
87
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'lazy'
88
+ Requires-Dist: requests; extra == 'lazy'
89
+ Requires-Dist: xarray>=2024.06.0; extra == 'lazy'
68
90
  Provides-Extra: test
69
91
  Requires-Dist: awkward>=2.3; extra == 'test'
70
92
  Requires-Dist: boltons; extra == 'test'
71
- Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,>=2022.09.2; extra == 'test'
93
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'test'
72
94
  Requires-Dist: dask[distributed]; extra == 'test'
95
+ Requires-Dist: filelock; extra == 'test'
73
96
  Requires-Dist: httpx; extra == 'test'
74
97
  Requires-Dist: joblib; extra == 'test'
75
98
  Requires-Dist: loompy>=3.0.5; extra == 'test'
76
99
  Requires-Dist: matplotlib; extra == 'test'
77
100
  Requires-Dist: openpyxl; extra == 'test'
78
101
  Requires-Dist: pyarrow; extra == 'test'
79
- Requires-Dist: pytest-cov>=2.10; extra == 'test'
102
+ Requires-Dist: pytest-cov; extra == 'test'
80
103
  Requires-Dist: pytest-memray; extra == 'test'
81
104
  Requires-Dist: pytest-mock; extra == 'test'
105
+ Requires-Dist: pytest-randomly; extra == 'test'
106
+ Requires-Dist: pytest-xdist[psutil]; extra == 'test'
82
107
  Requires-Dist: pytest<8.3.4,>=8.2; extra == 'test'
83
- Requires-Dist: scanpy>=1.9.8; extra == 'test'
108
+ Requires-Dist: scanpy>=1.10; extra == 'test'
84
109
  Requires-Dist: scikit-learn; extra == 'test'
85
- Requires-Dist: zarr<3; extra == 'test'
110
+ Provides-Extra: test-full
111
+ Requires-Dist: aiohttp; extra == 'test-full'
112
+ Requires-Dist: awkward>=2.3; extra == 'test-full'
113
+ Requires-Dist: boltons; extra == 'test-full'
114
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'test-full'
115
+ Requires-Dist: dask[distributed]; extra == 'test-full'
116
+ Requires-Dist: filelock; extra == 'test-full'
117
+ Requires-Dist: httpx; extra == 'test-full'
118
+ Requires-Dist: joblib; extra == 'test-full'
119
+ Requires-Dist: loompy>=3.0.5; extra == 'test-full'
120
+ Requires-Dist: matplotlib; extra == 'test-full'
121
+ Requires-Dist: openpyxl; extra == 'test-full'
122
+ Requires-Dist: pyarrow; extra == 'test-full'
123
+ Requires-Dist: pytest-cov; extra == 'test-full'
124
+ Requires-Dist: pytest-memray; extra == 'test-full'
125
+ Requires-Dist: pytest-mock; extra == 'test-full'
126
+ Requires-Dist: pytest-randomly; extra == 'test-full'
127
+ Requires-Dist: pytest-xdist[psutil]; extra == 'test-full'
128
+ Requires-Dist: pytest<8.3.4,>=8.2; extra == 'test-full'
129
+ Requires-Dist: requests; extra == 'test-full'
130
+ Requires-Dist: scanpy>=1.10; extra == 'test-full'
131
+ Requires-Dist: scikit-learn; extra == 'test-full'
132
+ Requires-Dist: xarray>=2024.06.0; extra == 'test-full'
86
133
  Description-Content-Type: text/markdown
87
134
 
88
- [![Build Status](https://dev.azure.com/scverse/anndata/_apis/build/status/scverse.anndata?branchName=main)](https://dev.azure.com/scverse/anndata/_build)
135
+ [![Tests](https://github.com/scverse/anndata/actions/workflows/test-cpu.yml/badge.svg)](https://github.com/scverse/anndata/actions)
89
136
  [![Conda](https://img.shields.io/conda/vn/conda-forge/anndata.svg)](https://anaconda.org/conda-forge/anndata)
90
137
  [![Coverage](https://codecov.io/gh/scverse/anndata/branch/main/graph/badge.svg?token=IN1mJN1Wi8)](https://codecov.io/gh/scverse/anndata)
91
138
  [![Docs](https://readthedocs.com/projects/icb-anndata/badge/?version=latest)](https://anndata.readthedocs.io)
@@ -112,16 +159,17 @@ anndata is a Python package for handling annotated data matrices in memory and o
112
159
 
113
160
  [//]: # (numfocus-fiscal-sponsor-attribution)
114
161
 
115
- anndata is part of the scverse project ([website](https://scverse.org), [governance](https://scverse.org/about/roles)) and is fiscally sponsored by [NumFOCUS](https://numfocus.org/).
116
- Please consider making a tax-deductible [donation](https://numfocus.org/donate-to-scverse) to help the project pay for developer time, professional services, travel, workshops, and a variety of other needs.
117
-
162
+ anndata is part of the scverse® project ([website](https://scverse.org), [governance](https://scverse.org/about/roles)) and is fiscally sponsored by [NumFOCUS](https://numfocus.org/).
163
+ If you like scverse® and want to support our mission, please consider making a tax-deductible [donation](https://numfocus.org/donate-to-scverse) to help the project pay for developer time, professional services, travel, workshops, and a variety of other needs.
118
164
 
165
+ <div align="center">
119
166
  <a href="https://numfocus.org/project/scverse">
120
167
  <img
121
168
  src="https://raw.githubusercontent.com/numfocus/templates/master/images/numfocus-logo.png"
122
169
  width="200"
123
170
  >
124
171
  </a>
172
+ </div>
125
173
 
126
174
  ## Public API
127
175
 
@@ -1,4 +1,4 @@
1
- [![Build Status](https://dev.azure.com/scverse/anndata/_apis/build/status/scverse.anndata?branchName=main)](https://dev.azure.com/scverse/anndata/_build)
1
+ [![Tests](https://github.com/scverse/anndata/actions/workflows/test-cpu.yml/badge.svg)](https://github.com/scverse/anndata/actions)
2
2
  [![Conda](https://img.shields.io/conda/vn/conda-forge/anndata.svg)](https://anaconda.org/conda-forge/anndata)
3
3
  [![Coverage](https://codecov.io/gh/scverse/anndata/branch/main/graph/badge.svg?token=IN1mJN1Wi8)](https://codecov.io/gh/scverse/anndata)
4
4
  [![Docs](https://readthedocs.com/projects/icb-anndata/badge/?version=latest)](https://anndata.readthedocs.io)
@@ -25,16 +25,17 @@ anndata is a Python package for handling annotated data matrices in memory and o
25
25
 
26
26
  [//]: # (numfocus-fiscal-sponsor-attribution)
27
27
 
28
- anndata is part of the scverse project ([website](https://scverse.org), [governance](https://scverse.org/about/roles)) and is fiscally sponsored by [NumFOCUS](https://numfocus.org/).
29
- Please consider making a tax-deductible [donation](https://numfocus.org/donate-to-scverse) to help the project pay for developer time, professional services, travel, workshops, and a variety of other needs.
30
-
28
+ anndata is part of the scverse® project ([website](https://scverse.org), [governance](https://scverse.org/about/roles)) and is fiscally sponsored by [NumFOCUS](https://numfocus.org/).
29
+ If you like scverse® and want to support our mission, please consider making a tax-deductible [donation](https://numfocus.org/donate-to-scverse) to help the project pay for developer time, professional services, travel, workshops, and a variety of other needs.
31
30
 
31
+ <div align="center">
32
32
  <a href="https://numfocus.org/project/scverse">
33
33
  <img
34
34
  src="https://raw.githubusercontent.com/numfocus/templates/master/images/numfocus-logo.png"
35
35
  width="200"
36
36
  >
37
37
  </a>
38
+ </div>
38
39
 
39
40
  ## Public API
40
41