anndata 0.11.3__tar.gz → 0.12.0__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 (211) hide show
  1. {anndata-0.11.3 → anndata-0.12.0}/.github/ISSUE_TEMPLATE/bug-report.yml +10 -2
  2. anndata-0.12.0/.github/ISSUE_TEMPLATE/config.yml +5 -0
  3. anndata-0.12.0/.github/ISSUE_TEMPLATE/question.yml +14 -0
  4. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/benchmark.yml +7 -3
  5. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/codespell.yml +5 -4
  6. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/publish.yml +3 -0
  7. anndata-0.12.0/.github/workflows/test-cpu.yml +125 -0
  8. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/test-gpu.yml +16 -9
  9. {anndata-0.11.3 → anndata-0.12.0}/.gitignore +2 -2
  10. {anndata-0.11.3 → anndata-0.12.0}/.pre-commit-config.yaml +13 -9
  11. {anndata-0.11.3 → anndata-0.12.0}/.readthedocs.yml +1 -1
  12. anndata-0.12.0/.taplo.toml +5 -0
  13. anndata-0.12.0/.vscode/launch.json +26 -0
  14. anndata-0.12.0/.vscode/settings.json +27 -0
  15. {anndata-0.11.3 → anndata-0.12.0}/LICENSE +2 -1
  16. {anndata-0.11.3 → anndata-0.12.0}/PKG-INFO +60 -32
  17. {anndata-0.11.3 → anndata-0.12.0}/README.md +5 -4
  18. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/asv.conf.json +1 -23
  19. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/benchmarks/anndata.py +8 -2
  20. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/benchmarks/readwrite.py +9 -8
  21. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/benchmarks/sparse_dataset.py +15 -11
  22. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/benchmarks/utils.py +2 -19
  23. anndata-0.12.0/biome.jsonc +18 -0
  24. {anndata-0.11.3 → anndata-0.12.0}/ci/scripts/min-deps.py +17 -11
  25. {anndata-0.11.3 → anndata-0.12.0}/docs/api.md +55 -2
  26. {anndata-0.11.3 → anndata-0.12.0}/docs/conf.py +64 -35
  27. anndata-0.12.0/docs/extensions/autosummary_skip_inherited.py +55 -0
  28. {anndata-0.11.3 → anndata-0.12.0}/docs/extensions/no_skip_abc_members.py +2 -2
  29. {anndata-0.11.3 → anndata-0.12.0}/docs/fileformat-prose.md +1 -1
  30. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.11.0.md +1 -1
  31. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.11.1.md +2 -2
  32. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.11.2.md +1 -1
  33. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.11.3.md +1 -1
  34. anndata-0.12.0/docs/release-notes/0.11.4.md +14 -0
  35. anndata-0.12.0/docs/release-notes/0.12.0.md +6 -0
  36. anndata-0.12.0/docs/release-notes/0.12.0rc1.md +26 -0
  37. anndata-0.12.0/docs/release-notes/0.12.0rc2.md +14 -0
  38. anndata-0.12.0/docs/release-notes/0.12.0rc3.md +6 -0
  39. anndata-0.12.0/docs/release-notes/0.12.0rc4.md +19 -0
  40. {anndata-0.11.3 → anndata-0.12.0}/docs/tutorials/index.md +2 -0
  41. anndata-0.12.0/docs/tutorials/zarr-v3.md +122 -0
  42. anndata-0.12.0/hatch.toml +41 -0
  43. {anndata-0.11.3 → anndata-0.12.0}/pyproject.toml +105 -79
  44. anndata-0.12.0/src/anndata/__init__.py +65 -0
  45. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/access.py +1 -1
  46. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/aligned_df.py +51 -8
  47. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/aligned_mapping.py +13 -8
  48. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/anndata.py +302 -203
  49. anndata-0.12.0/src/anndata/_core/extensions.py +276 -0
  50. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/file_backing.py +22 -12
  51. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/index.py +37 -26
  52. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/merge.py +503 -130
  53. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/raw.py +8 -10
  54. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/sparse_dataset.py +101 -62
  55. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/storage.py +20 -12
  56. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/views.py +23 -9
  57. anndata-0.12.0/src/anndata/_core/xarray.py +404 -0
  58. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/__init__.py +3 -3
  59. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/h5ad.py +34 -31
  60. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/read.py +60 -37
  61. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/specs/__init__.py +8 -8
  62. anndata-0.12.0/src/anndata/_io/specs/lazy_methods.py +370 -0
  63. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/specs/methods.py +256 -89
  64. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/specs/registry.py +76 -42
  65. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/utils.py +41 -24
  66. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/write.py +29 -17
  67. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_io/zarr.py +40 -19
  68. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_settings.py +71 -40
  69. anndata-0.12.0/src/anndata/_settings.pyi +49 -0
  70. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_types.py +67 -40
  71. anndata-0.12.0/src/anndata/_version.py +62 -0
  72. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_warnings.py +0 -6
  73. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/abc.py +5 -6
  74. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/compat/__init__.py +74 -128
  75. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/__init__.py +23 -9
  76. anndata-0.12.0/src/anndata/experimental/backed/__init__.py +7 -0
  77. anndata-0.12.0/src/anndata/experimental/backed/_compat.py +18 -0
  78. anndata-0.12.0/src/anndata/experimental/backed/_io.py +156 -0
  79. anndata-0.12.0/src/anndata/experimental/backed/_lazy_arrays.py +197 -0
  80. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/merge.py +56 -48
  81. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/multi_files/_anncollection.py +55 -57
  82. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/pytorch/_annloader.py +40 -16
  83. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/io.py +4 -17
  84. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/logging.py +12 -7
  85. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/tests/helpers.py +246 -166
  86. anndata-0.12.0/src/anndata/types.py +22 -0
  87. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/typing.py +9 -10
  88. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/utils.py +47 -33
  89. anndata-0.12.0/src/testing/anndata/_doctest.py +16 -0
  90. {anndata-0.11.3 → anndata-0.12.0}/src/testing/anndata/_pytest.py +13 -17
  91. anndata-0.12.0/src/testing/anndata/py.typed +0 -0
  92. {anndata-0.11.3 → anndata-0.12.0}/tests/conftest.py +69 -1
  93. anndata-0.12.0/tests/lazy/conftest.py +260 -0
  94. anndata-0.12.0/tests/lazy/test_concat.py +323 -0
  95. anndata-0.12.0/tests/lazy/test_read.py +184 -0
  96. anndata-0.12.0/tests/lazy/test_write.py +46 -0
  97. {anndata-0.11.3 → anndata-0.12.0}/tests/test_awkward.py +2 -1
  98. {anndata-0.11.3 → anndata-0.12.0}/tests/test_backed_dense.py +2 -6
  99. {anndata-0.11.3 → anndata-0.12.0}/tests/test_backed_hdf5.py +15 -9
  100. {anndata-0.11.3 → anndata-0.12.0}/tests/test_backed_sparse.py +107 -92
  101. {anndata-0.11.3 → anndata-0.12.0}/tests/test_base.py +62 -29
  102. {anndata-0.11.3 → anndata-0.12.0}/tests/test_concatenate.py +247 -89
  103. {anndata-0.11.3 → anndata-0.12.0}/tests/test_concatenate_disk.py +18 -12
  104. {anndata-0.11.3 → anndata-0.12.0}/tests/test_dask.py +17 -10
  105. {anndata-0.11.3 → anndata-0.12.0}/tests/test_dask_view_mem.py +5 -7
  106. {anndata-0.11.3 → anndata-0.12.0}/tests/test_deprecations.py +9 -20
  107. anndata-0.12.0/tests/test_extensions.py +229 -0
  108. {anndata-0.11.3 → anndata-0.12.0}/tests/test_helpers.py +4 -35
  109. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_backwards_compat.py +7 -7
  110. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_conversion.py +7 -6
  111. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_dispatched.py +78 -40
  112. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_elementwise.py +106 -87
  113. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_partial.py +25 -20
  114. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_utils.py +5 -9
  115. {anndata-0.11.3 → anndata-0.12.0}/tests/test_io_warnings.py +14 -20
  116. {anndata-0.11.3 → anndata-0.12.0}/tests/test_layers.py +23 -16
  117. {anndata-0.11.3 → anndata-0.12.0}/tests/test_obsmvarm.py +27 -1
  118. {anndata-0.11.3 → anndata-0.12.0}/tests/test_readwrite.py +212 -71
  119. {anndata-0.11.3 → anndata-0.12.0}/tests/test_repr.py +1 -1
  120. {anndata-0.11.3 → anndata-0.12.0}/tests/test_settings.py +50 -27
  121. {anndata-0.11.3 → anndata-0.12.0}/tests/test_structured_arrays.py +6 -9
  122. {anndata-0.11.3 → anndata-0.12.0}/tests/test_transpose.py +1 -3
  123. {anndata-0.11.3 → anndata-0.12.0}/tests/test_utils.py +4 -2
  124. {anndata-0.11.3 → anndata-0.12.0}/tests/test_views.py +17 -23
  125. {anndata-0.11.3 → anndata-0.12.0}/tests/test_x.py +17 -16
  126. anndata-0.12.0/tests/test_xarray.py +320 -0
  127. anndata-0.11.3/.azure-pipelines.yml +0 -129
  128. anndata-0.11.3/.github/ISSUE_TEMPLATE/config.yml +0 -8
  129. anndata-0.11.3/hatch.toml +0 -34
  130. anndata-0.11.3/src/anndata/__init__.py +0 -98
  131. anndata-0.11.3/src/anndata/_io/specs/lazy_methods.py +0 -184
  132. anndata-0.11.3/src/anndata/_version.py +0 -16
  133. anndata-0.11.3/src/anndata/compat/exceptiongroups.py +0 -14
  134. {anndata-0.11.3 → anndata-0.12.0}/.cirun.yml +0 -0
  135. {anndata-0.11.3 → anndata-0.12.0}/.codecov.yml +0 -0
  136. {anndata-0.11.3 → anndata-0.12.0}/.editorconfig +0 -0
  137. {anndata-0.11.3 → anndata-0.12.0}/.github/ISSUE_TEMPLATE/enhancement-request.yml +0 -0
  138. {anndata-0.11.3 → anndata-0.12.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  139. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/check-pr-milestoned.yml +0 -0
  140. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/close-stale.yml +0 -0
  141. {anndata-0.11.3 → anndata-0.12.0}/.github/workflows/label-stale.yml +0 -0
  142. {anndata-0.11.3 → anndata-0.12.0}/.gitmodules +0 -0
  143. {anndata-0.11.3 → anndata-0.12.0}/.prettierignore +0 -0
  144. {anndata-0.11.3 → anndata-0.12.0}/.prettierrc.yaml +0 -0
  145. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/README.md +0 -0
  146. {anndata-0.11.3 → anndata-0.12.0}/benchmarks/benchmarks/__init__.py +0 -0
  147. {anndata-0.11.3 → anndata-0.12.0}/ci/constraints.txt +0 -0
  148. {anndata-0.11.3 → anndata-0.12.0}/ci/scripts/towncrier_automation.py +0 -0
  149. {anndata-0.11.3 → anndata-0.12.0}/docs/Makefile +0 -0
  150. {anndata-0.11.3 → anndata-0.12.0}/docs/_key_contributors.rst +0 -0
  151. {anndata-0.11.3 → anndata-0.12.0}/docs/_static/img/anndata_schema.svg +0 -0
  152. {anndata-0.11.3 → anndata-0.12.0}/docs/_templates/autosummary/class.rst +0 -0
  153. {anndata-0.11.3 → anndata-0.12.0}/docs/benchmark-read-write.ipynb +0 -0
  154. {anndata-0.11.3 → anndata-0.12.0}/docs/benchmarks.md +0 -0
  155. {anndata-0.11.3 → anndata-0.12.0}/docs/concatenation.rst +0 -0
  156. {anndata-0.11.3 → anndata-0.12.0}/docs/contributing.md +0 -0
  157. {anndata-0.11.3 → anndata-0.12.0}/docs/extensions/patch_myst_cite.py +0 -0
  158. {anndata-0.11.3 → anndata-0.12.0}/docs/index.md +0 -0
  159. {anndata-0.11.3 → anndata-0.12.0}/docs/interoperability.md +0 -0
  160. {anndata-0.11.3 → anndata-0.12.0}/docs/news.md +0 -0
  161. {anndata-0.11.3 → anndata-0.12.0}/docs/references.rst +0 -0
  162. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.0.md +0 -0
  163. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.1.md +0 -0
  164. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.2.md +0 -0
  165. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.3.md +0 -0
  166. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.4.md +0 -0
  167. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.5.md +0 -0
  168. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.6.md +0 -0
  169. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.7.md +0 -0
  170. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.8.md +0 -0
  171. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.10.9.md +0 -0
  172. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.4.0.md +0 -0
  173. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.5.0.md +0 -0
  174. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.6.0.md +0 -0
  175. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.6.x.md +0 -0
  176. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.0.md +0 -0
  177. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.2.md +0 -0
  178. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.3.md +0 -0
  179. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.4.md +0 -0
  180. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.5.md +0 -0
  181. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.6.md +0 -0
  182. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.7.md +0 -0
  183. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.7.8.md +0 -0
  184. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.8.0.md +0 -0
  185. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.9.0.md +0 -0
  186. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.9.1.md +0 -0
  187. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/0.9.2.md +0 -0
  188. {anndata-0.11.3 → anndata-0.12.0}/docs/release-notes/index.md +0 -0
  189. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/_core/__init__.py +0 -0
  190. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/_dispatch_io.py +0 -0
  191. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/multi_files/__init__.py +0 -0
  192. {anndata-0.11.3 → anndata-0.12.0}/src/anndata/experimental/pytorch/__init__.py +0 -0
  193. {anndata-0.11.3/src/testing/anndata → anndata-0.12.0/src/anndata/tests}/__init__.py +0 -0
  194. /anndata-0.11.3/src/testing/anndata/py.typed → /anndata-0.12.0/src/testing/anndata/__init__.py +0 -0
  195. {anndata-0.11.3 → anndata-0.12.0}/tests/data/adata-comments.tsv +0 -0
  196. {anndata-0.11.3 → anndata-0.12.0}/tests/data/adata.csv +0 -0
  197. {anndata-0.11.3 → anndata-0.12.0}/tests/data/archives/readme.md +0 -0
  198. {anndata-0.11.3 → anndata-0.12.0}/tests/data/archives/v0.7.0/adata.h5ad +0 -0
  199. {anndata-0.11.3 → anndata-0.12.0}/tests/data/archives/v0.7.0/adata.zarr.zip +0 -0
  200. {anndata-0.11.3 → anndata-0.12.0}/tests/data/archives/v0.7.8/adata.h5ad +0 -0
  201. {anndata-0.11.3 → anndata-0.12.0}/tests/data/archives/v0.7.8/adata.zarr.zip +0 -0
  202. {anndata-0.11.3 → anndata-0.12.0}/tests/data/excel.xlsx +0 -0
  203. {anndata-0.11.3 → anndata-0.12.0}/tests/data/umi_tools.tsv.gz +0 -0
  204. {anndata-0.11.3 → anndata-0.12.0}/tests/test_anncollection.py +0 -0
  205. {anndata-0.11.3 → anndata-0.12.0}/tests/test_annot.py +0 -0
  206. {anndata-0.11.3 → anndata-0.12.0}/tests/test_get_vector.py +0 -0
  207. {anndata-0.11.3 → anndata-0.12.0}/tests/test_gpu.py +0 -0
  208. {anndata-0.11.3 → anndata-0.12.0}/tests/test_inplace_subset.py +0 -0
  209. {anndata-0.11.3 → anndata-0.12.0}/tests/test_obspvarp.py +0 -0
  210. {anndata-0.11.3 → anndata-0.12.0}/tests/test_raw.py +0 -0
  211. {anndata-0.11.3 → anndata-0.12.0}/tests/test_uns.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:
@@ -0,0 +1,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Scverse Community Forum
4
+ url: https://discourse.scverse.org/
5
+ about: If you have questions about “How to do X”, please ask them here.
@@ -0,0 +1,14 @@
1
+ name: Technical question
2
+ description: You wonder about a design decision or implementation detail?
3
+ #title: ...
4
+ labels:
5
+ - question
6
+ #assignees: []
7
+ body:
8
+ - type: textarea
9
+ id: description
10
+ attributes:
11
+ label: Question
12
+ description: If you have *usage* question, please visit the [Scverse Community Forum](https://discourse.scverse.org/) instead.
13
+ validations:
14
+ required: true
@@ -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,125 @@
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
+ FORCE_COLOR: "1"
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
19
+ concurrency:
20
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
21
+ cancel-in-progress: true
22
+
23
+ jobs:
24
+ get-environments:
25
+ runs-on: ubuntu-latest
26
+ outputs:
27
+ envs: ${{ steps.get-envs.outputs.envs }}
28
+ steps:
29
+ - uses: actions/checkout@v4
30
+ with:
31
+ filter: blob:none
32
+ fetch-depth: 0
33
+ - uses: astral-sh/setup-uv@v5
34
+ with:
35
+ enable-cache: false
36
+ - id: get-envs
37
+ run: |
38
+ ENVS_JSON=$(NO_COLOR=1 uvx hatch env show --json | jq -c 'to_entries
39
+ | map(
40
+ select(.key | startswith("hatch-test"))
41
+ | { name: .key, python: .value.python }
42
+ )')
43
+ echo "envs=${ENVS_JSON}" | tee $GITHUB_OUTPUT
44
+ test:
45
+ needs: get-environments
46
+ runs-on: ubuntu-latest
47
+ strategy:
48
+ matrix:
49
+ env: ${{ fromJSON(needs.get-environments.outputs.envs) }}
50
+ io_mark: ["zarr_io", "not zarr_io"]
51
+ env: # environment variable for use in codecov’s env_vars tagging
52
+ ENV_NAME: ${{ matrix.env.name }}
53
+ steps:
54
+ - uses: actions/checkout@v4
55
+ with:
56
+ fetch-depth: 0
57
+ filter: blob:none
58
+
59
+ - name: Set up Python ${{ matrix.env.python }}
60
+ uses: actions/setup-python@v5
61
+ with:
62
+ python-version: ${{ matrix.env.python }}
63
+
64
+ - name: Install UV
65
+ uses: astral-sh/setup-uv@v5
66
+ with:
67
+ enable-cache: true
68
+ cache-dependency-glob: pyproject.toml
69
+
70
+ - name: Install dependencies
71
+ run: uvx hatch -v env create ${{ matrix.env.name }}
72
+
73
+ - 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}}"
75
+
76
+ - name: Upload coverage data
77
+ uses: codecov/codecov-action@v5
78
+ with:
79
+ token: ${{ secrets.CODECOV_TOKEN }}
80
+ env_vars: ENV_NAME
81
+ fail_ci_if_error: true
82
+ files: test-data/coverage.xml
83
+
84
+ build:
85
+ runs-on: ubuntu-22.04
86
+ steps:
87
+ - uses: actions/checkout@v4
88
+ with:
89
+ fetch-depth: 0
90
+ filter: blob:none
91
+
92
+ - name: Set up Python 3.13
93
+ uses: actions/setup-python@v5
94
+ with:
95
+ python-version: '3.13'
96
+
97
+ - name: Install build tools and requirements
98
+ run: |
99
+ python -m pip install --upgrade pip
100
+ pip install build twine
101
+
102
+ - name: Display installed versions
103
+ run: pip list
104
+
105
+ - name: Build & Twine check
106
+ run: |
107
+ python -m build --sdist --wheel .
108
+ twine check dist/*
109
+
110
+ - name: Check runtime version
111
+ run: |
112
+ pip install dist/*.whl
113
+ python -c 'import anndata; print(anndata.__version__)'
114
+
115
+ check:
116
+ if: always()
117
+ needs:
118
+ - get-environments
119
+ - test
120
+ - build
121
+ runs-on: ubuntu-latest
122
+ steps:
123
+ - uses: re-actors/alls-green@release/v1
124
+ with:
125
+ jobs: ${{ toJSON(needs) }}
@@ -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,12 @@ __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
+ /ci/pre-deps.txt
15
16
  /requirements*.lock
16
17
  /.python-version
17
18
 
@@ -28,7 +29,6 @@ __pycache__/
28
29
 
29
30
  # IDEs
30
31
  /.idea/
31
- /.vscode/
32
32
 
33
33
  # Benchmark
34
34
  .asv
@@ -1,18 +1,22 @@
1
1
  repos:
2
2
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.8.1
3
+ rev: v0.12.3
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
+ # The following can be removed once PLR0917 is out of preview
9
+ - name: ruff preview rules
10
+ id: ruff
11
+ args: ["--preview", "--select=PLR0917"]
12
+ - repo: https://github.com/biomejs/pre-commit
13
+ rev: v2.1.1
12
14
  hooks:
13
- - id: prettier
14
- exclude_types:
15
- - markdown
15
+ - id: biome-format
16
+ - repo: https://github.com/ComPWA/taplo-pre-commit
17
+ rev: v0.9.3
18
+ hooks:
19
+ - id: taplo-format
16
20
  - repo: https://github.com/pre-commit/pre-commit-hooks
17
21
  rev: v5.0.0
18
22
  hooks:
@@ -27,7 +31,7 @@ repos:
27
31
  - id: no-commit-to-branch
28
32
  args: ["--branch=main"]
29
33
  - repo: https://github.com/codespell-project/codespell
30
- rev: v2.3.0
34
+ rev: v2.4.1
31
35
  hooks:
32
36
  - id: codespell
33
37
  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.0
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,101 @@ 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
27
- Requires-Dist: array-api-compat!=1.5,>1.4
28
- Requires-Dist: exceptiongroup; python_version < '3.11'
29
- Requires-Dist: h5py>=3.7
26
+ Requires-Python: >=3.11
27
+ Requires-Dist: array-api-compat>=1.7.1
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.26
32
+ Requires-Dist: packaging>=24.2
33
+ Requires-Dist: pandas!=2.1.2,>=2.1.0
34
+ Requires-Dist: scipy>=1.12
35
+ Requires-Dist: zarr!=3.0.*,>=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: hatch-vcs; extra == 'dev'
44
44
  Requires-Dist: towncrier>=24.8.0; extra == 'dev'
45
45
  Provides-Extra: dev-doc
46
46
  Requires-Dist: towncrier>=24.8.0; extra == 'dev-doc'
47
- Provides-Extra: dev-test
48
- Requires-Dist: pytest-xdist; extra == 'dev-test'
49
47
  Provides-Extra: doc
50
48
  Requires-Dist: awkward>=2.3; extra == 'doc'
49
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'doc'
51
50
  Requires-Dist: ipython; extra == 'doc'
51
+ Requires-Dist: myst-nb; extra == 'doc'
52
52
  Requires-Dist: myst-parser; extra == 'doc'
53
- Requires-Dist: nbsphinx; extra == 'doc'
54
- Requires-Dist: readthedocs-sphinx-search; extra == 'doc'
55
- Requires-Dist: scanpydoc[theme,typehints]>=0.14.1; extra == 'doc'
53
+ Requires-Dist: scanpydoc[theme,typehints]>=0.15.3; extra == 'doc'
56
54
  Requires-Dist: sphinx-autodoc-typehints>=2.2.0; extra == 'doc'
57
55
  Requires-Dist: sphinx-book-theme>=1.1.0; extra == 'doc'
58
56
  Requires-Dist: sphinx-copybutton; extra == 'doc'
59
57
  Requires-Dist: sphinx-design>=0.5.0; extra == 'doc'
60
- Requires-Dist: sphinx-issues; extra == 'doc'
58
+ Requires-Dist: sphinx-issues>=5.0.1; extra == 'doc'
61
59
  Requires-Dist: sphinx-toolbox>=3.8.0; extra == 'doc'
62
- Requires-Dist: sphinx>=7.4.6; extra == 'doc'
60
+ Requires-Dist: sphinx>=8.2.1; extra == 'doc'
63
61
  Requires-Dist: sphinxext-opengraph; extra == 'doc'
64
62
  Requires-Dist: towncrier>=24.8.0; extra == 'doc'
65
- Requires-Dist: zarr<3; extra == 'doc'
66
63
  Provides-Extra: gpu
67
64
  Requires-Dist: cupy; extra == 'gpu'
65
+ Provides-Extra: lazy
66
+ Requires-Dist: aiohttp; extra == 'lazy'
67
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'lazy'
68
+ Requires-Dist: requests; extra == 'lazy'
69
+ Requires-Dist: xarray>=2025.06.1; extra == 'lazy'
68
70
  Provides-Extra: test
69
- Requires-Dist: awkward>=2.3; extra == 'test'
71
+ Requires-Dist: aiohttp; extra == 'test'
72
+ Requires-Dist: awkward>=2.3.2; extra == 'test'
70
73
  Requires-Dist: boltons; extra == 'test'
71
- Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,>=2022.09.2; extra == 'test'
74
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'test'
72
75
  Requires-Dist: dask[distributed]; extra == 'test'
73
- Requires-Dist: httpx; extra == 'test'
76
+ Requires-Dist: filelock; extra == 'test'
77
+ Requires-Dist: httpx<1.0; extra == 'test'
74
78
  Requires-Dist: joblib; extra == 'test'
75
79
  Requires-Dist: loompy>=3.0.5; extra == 'test'
76
80
  Requires-Dist: matplotlib; extra == 'test'
77
81
  Requires-Dist: openpyxl; extra == 'test'
78
82
  Requires-Dist: pyarrow; extra == 'test'
79
- Requires-Dist: pytest-cov>=2.10; extra == 'test'
83
+ Requires-Dist: pytest-cov; extra == 'test'
80
84
  Requires-Dist: pytest-memray; extra == 'test'
81
85
  Requires-Dist: pytest-mock; extra == 'test'
86
+ Requires-Dist: pytest-randomly; extra == 'test'
87
+ Requires-Dist: pytest-xdist[psutil]; extra == 'test'
82
88
  Requires-Dist: pytest<8.3.4,>=8.2; extra == 'test'
83
- Requires-Dist: scanpy>=1.9.8; extra == 'test'
89
+ Requires-Dist: requests; extra == 'test'
90
+ Requires-Dist: scanpy>=1.10; extra == 'test'
84
91
  Requires-Dist: scikit-learn; extra == 'test'
85
- Requires-Dist: zarr<3; extra == 'test'
92
+ Requires-Dist: xarray>=2025.06.1; extra == 'test'
93
+ Provides-Extra: test-min
94
+ Requires-Dist: awkward>=2.3.2; extra == 'test-min'
95
+ Requires-Dist: boltons; extra == 'test-min'
96
+ Requires-Dist: dask[array]!=2024.8.*,!=2024.9.*,<2025.2.0,>=2023.5.1; extra == 'test-min'
97
+ Requires-Dist: dask[distributed]; extra == 'test-min'
98
+ Requires-Dist: filelock; extra == 'test-min'
99
+ Requires-Dist: httpx<1.0; extra == 'test-min'
100
+ Requires-Dist: joblib; extra == 'test-min'
101
+ Requires-Dist: loompy>=3.0.5; extra == 'test-min'
102
+ Requires-Dist: matplotlib; extra == 'test-min'
103
+ Requires-Dist: openpyxl; extra == 'test-min'
104
+ Requires-Dist: pyarrow; extra == 'test-min'
105
+ Requires-Dist: pytest-cov; extra == 'test-min'
106
+ Requires-Dist: pytest-memray; extra == 'test-min'
107
+ Requires-Dist: pytest-mock; extra == 'test-min'
108
+ Requires-Dist: pytest-randomly; extra == 'test-min'
109
+ Requires-Dist: pytest-xdist[psutil]; extra == 'test-min'
110
+ Requires-Dist: pytest<8.3.4,>=8.2; extra == 'test-min'
111
+ Requires-Dist: scanpy>=1.10; extra == 'test-min'
112
+ Requires-Dist: scikit-learn; extra == 'test-min'
86
113
  Description-Content-Type: text/markdown
87
114
 
88
- [![Build Status](https://dev.azure.com/scverse/anndata/_apis/build/status/scverse.anndata?branchName=main)](https://dev.azure.com/scverse/anndata/_build)
115
+ [![Tests](https://github.com/scverse/anndata/actions/workflows/test-cpu.yml/badge.svg)](https://github.com/scverse/anndata/actions)
89
116
  [![Conda](https://img.shields.io/conda/vn/conda-forge/anndata.svg)](https://anaconda.org/conda-forge/anndata)
90
117
  [![Coverage](https://codecov.io/gh/scverse/anndata/branch/main/graph/badge.svg?token=IN1mJN1Wi8)](https://codecov.io/gh/scverse/anndata)
91
118
  [![Docs](https://readthedocs.com/projects/icb-anndata/badge/?version=latest)](https://anndata.readthedocs.io)
@@ -112,16 +139,17 @@ anndata is a Python package for handling annotated data matrices in memory and o
112
139
 
113
140
  [//]: # (numfocus-fiscal-sponsor-attribution)
114
141
 
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
-
142
+ 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/).
143
+ 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
144
 
145
+ <div align="center">
119
146
  <a href="https://numfocus.org/project/scverse">
120
147
  <img
121
148
  src="https://raw.githubusercontent.com/numfocus/templates/master/images/numfocus-logo.png"
122
149
  width="200"
123
150
  >
124
151
  </a>
152
+ </div>
125
153
 
126
154
  ## Public API
127
155
 
@@ -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