decoupler 2.2.0__tar.gz → 2.3.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 (199) hide show
  1. {decoupler-2.2.0 → decoupler-2.3.0}/.cruft.json +7 -4
  2. {decoupler-2.2.0 → decoupler-2.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +1 -2
  3. decoupler-2.3.0/.github/dependabot.yml +12 -0
  4. {decoupler-2.2.0 → decoupler-2.3.0}/.github/workflows/build.yaml +6 -2
  5. {decoupler-2.2.0 → decoupler-2.3.0}/.github/workflows/notebooks.yaml +7 -3
  6. {decoupler-2.2.0 → decoupler-2.3.0}/.github/workflows/release.yaml +9 -3
  7. {decoupler-2.2.0 → decoupler-2.3.0}/.github/workflows/test.yaml +17 -10
  8. {decoupler-2.2.0 → decoupler-2.3.0}/.pre-commit-config.yaml +9 -3
  9. {decoupler-2.2.0 → decoupler-2.3.0}/.readthedocs.yaml +2 -2
  10. {decoupler-2.2.0 → decoupler-2.3.0}/CHANGELOG.md +19 -0
  11. {decoupler-2.2.0 → decoupler-2.3.0}/PKG-INFO +20 -17
  12. {decoupler-2.2.0 → decoupler-2.3.0}/README.md +15 -12
  13. decoupler-2.3.0/docs/_static/images/logo.svg +35 -0
  14. {decoupler-2.2.0 → decoupler-2.3.0}/docs/conf.py +8 -7
  15. {decoupler-2.2.0 → decoupler-2.3.0}/docs/references.bib +14 -0
  16. {decoupler-2.2.0 → decoupler-2.3.0}/pyproject.toml +10 -8
  17. decoupler-2.3.0/src/decoupler/_skills/data/SKILL.md +144 -0
  18. decoupler-2.3.0/src/decoupler/_skills/data/references/contrast.md +86 -0
  19. decoupler-2.3.0/src/decoupler/_skills/data/references/resources.md +82 -0
  20. decoupler-2.3.0/src/decoupler/_skills/install.py +175 -0
  21. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/ds/_spatial.py +7 -1
  22. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_gsea.py +1 -1
  23. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_ora.py +10 -2
  24. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_query_set.py +5 -0
  25. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_waggr.py +6 -7
  26. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_dotplot.py +8 -3
  27. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pp/anndata.py +1 -1
  28. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_gsea.py +18 -0
  29. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_ora.py +70 -2
  30. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_query_set.py +9 -0
  31. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_waggr.py +19 -0
  32. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_dotplot.py +10 -0
  33. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pp/test_anndata.py +1 -1
  34. decoupler-2.3.0/tests/test_install_skills.py +214 -0
  35. decoupler-2.2.0/docs/_static/images/logo.svg +0 -65
  36. decoupler-2.2.0/docs/_templates/autosummary/class.rst +0 -61
  37. decoupler-2.2.0/docs/extensions/typed_returns.py +0 -32
  38. decoupler-2.2.0/src/decoupler/_skills/data/SKILL.md +0 -85
  39. decoupler-2.2.0/src/decoupler/_skills/data/references/benchmarking.md +0 -59
  40. decoupler-2.2.0/src/decoupler/_skills/data/references/calling-convention.md +0 -91
  41. decoupler-2.2.0/src/decoupler/_skills/data/references/datasets.md +0 -88
  42. decoupler-2.2.0/src/decoupler/_skills/data/references/getting-started.md +0 -82
  43. decoupler-2.2.0/src/decoupler/_skills/data/references/io-and-outputs.md +0 -80
  44. decoupler-2.2.0/src/decoupler/_skills/data/references/methods.md +0 -67
  45. decoupler-2.2.0/src/decoupler/_skills/data/references/multi-method.md +0 -72
  46. decoupler-2.2.0/src/decoupler/_skills/data/references/preprocessing.md +0 -66
  47. decoupler-2.2.0/src/decoupler/_skills/data/references/priors.md +0 -79
  48. decoupler-2.2.0/src/decoupler/_skills/data/references/ranking-and-plotting.md +0 -131
  49. decoupler-2.2.0/src/decoupler/_skills/install.py +0 -143
  50. decoupler-2.2.0/tests/test_install_skills.py +0 -158
  51. {decoupler-2.2.0 → decoupler-2.3.0}/.codecov.yaml +0 -0
  52. {decoupler-2.2.0 → decoupler-2.3.0}/.editorconfig +0 -0
  53. {decoupler-2.2.0 → decoupler-2.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  54. {decoupler-2.2.0 → decoupler-2.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  55. {decoupler-2.2.0 → decoupler-2.3.0}/.gitignore +0 -0
  56. {decoupler-2.2.0 → decoupler-2.3.0}/.gitmodules +0 -0
  57. {decoupler-2.2.0 → decoupler-2.3.0}/.vscode/extensions.json +0 -0
  58. {decoupler-2.2.0 → decoupler-2.3.0}/.vscode/launch.json +0 -0
  59. {decoupler-2.2.0 → decoupler-2.3.0}/.vscode/settings.json +0 -0
  60. {decoupler-2.2.0 → decoupler-2.3.0}/LICENSE +0 -0
  61. {decoupler-2.2.0 → decoupler-2.3.0}/biome.jsonc +0 -0
  62. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_static/.gitkeep +0 -0
  63. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_static/css/custom.css +0 -0
  64. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_static/images/logo.png +0 -0
  65. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_static/images/mlm.png +0 -0
  66. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_static/images/ora.png +0 -0
  67. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_static/images/ulm.png +0 -0
  68. {decoupler-2.2.0 → decoupler-2.3.0}/docs/_templates/.gitkeep +0 -0
  69. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/bm.md +0 -0
  70. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/ds.md +0 -0
  71. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/index.md +0 -0
  72. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/mt.md +0 -0
  73. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/op.md +0 -0
  74. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/pl.md +0 -0
  75. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/pp.md +0 -0
  76. {decoupler-2.2.0 → decoupler-2.3.0}/docs/api/tl.md +0 -0
  77. {decoupler-2.2.0 → decoupler-2.3.0}/docs/changelog.md +0 -0
  78. {decoupler-2.2.0 → decoupler-2.3.0}/docs/index.md +0 -0
  79. {decoupler-2.2.0 → decoupler-2.3.0}/docs/references.md +0 -0
  80. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_Method.py +0 -0
  81. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_Plotter.py +0 -0
  82. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/__init__.py +0 -0
  83. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_datatype.py +0 -0
  84. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_docs.py +0 -0
  85. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_download.py +0 -0
  86. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_log.py +0 -0
  87. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_odeps.py +0 -0
  88. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/_skills/__init__.py +0 -0
  89. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/__init__.py +0 -0
  90. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/_pp.py +0 -0
  91. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/_run.py +0 -0
  92. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/metric/_Metric.py +0 -0
  93. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/metric/__init__.py +0 -0
  94. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/metric/_auc.py +0 -0
  95. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/metric/_fscore.py +0 -0
  96. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/metric/_hmean.py +0 -0
  97. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/metric/_qrank.py +0 -0
  98. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/__init__.py +0 -0
  99. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/_auc.py +0 -0
  100. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/_bar.py +0 -0
  101. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/_format.py +0 -0
  102. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/_fscore.py +0 -0
  103. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/_qrank.py +0 -0
  104. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/bm/pl/_summary.py +0 -0
  105. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/ds/__init__.py +0 -0
  106. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/ds/_bulk.py +0 -0
  107. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/ds/_scell.py +0 -0
  108. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/ds/_toy.py +0 -0
  109. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/ds/_utils.py +0 -0
  110. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/__init__.py +0 -0
  111. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_aucell.py +0 -0
  112. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_consensus.py +0 -0
  113. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_decouple.py +0 -0
  114. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_gsva.py +0 -0
  115. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_mdt.py +0 -0
  116. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_methods.py +0 -0
  117. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_mlm.py +0 -0
  118. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_pv.py +0 -0
  119. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_run.py +0 -0
  120. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_udt.py +0 -0
  121. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_ulm.py +0 -0
  122. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_viper.py +0 -0
  123. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/mt/_zscore.py +0 -0
  124. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/__init__.py +0 -0
  125. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_collectri.py +0 -0
  126. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_dorothea.py +0 -0
  127. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_dtype.py +0 -0
  128. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_hallmark.py +0 -0
  129. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_progeny.py +0 -0
  130. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_resource.py +0 -0
  131. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/op/_translate.py +0 -0
  132. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/__init__.py +0 -0
  133. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_barplot.py +0 -0
  134. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_filter_by_expr.py +0 -0
  135. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_filter_by_prop.py +0 -0
  136. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_filter_samples.py +0 -0
  137. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_leading_edge.py +0 -0
  138. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_network.py +0 -0
  139. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_obsbar.py +0 -0
  140. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_obsm.py +0 -0
  141. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_order.py +0 -0
  142. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_order_targets.py +0 -0
  143. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_source_targets.py +0 -0
  144. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pl/_volcano.py +0 -0
  145. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pp/__init__.py +0 -0
  146. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pp/data.py +0 -0
  147. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/pp/net.py +0 -0
  148. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/tl/__init__.py +0 -0
  149. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/tl/_rankby_group.py +0 -0
  150. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/tl/_rankby_obsm.py +0 -0
  151. {decoupler-2.2.0 → decoupler-2.3.0}/src/decoupler/tl/_rankby_order.py +0 -0
  152. {decoupler-2.2.0 → decoupler-2.3.0}/tests/bm/test_benchmark.py +0 -0
  153. {decoupler-2.2.0 → decoupler-2.3.0}/tests/bm/test_pl.py +0 -0
  154. {decoupler-2.2.0 → decoupler-2.3.0}/tests/conftest.py +0 -0
  155. {decoupler-2.2.0 → decoupler-2.3.0}/tests/ds/test_bulk.py +0 -0
  156. {decoupler-2.2.0 → decoupler-2.3.0}/tests/ds/test_scell.py +0 -0
  157. {decoupler-2.2.0 → decoupler-2.3.0}/tests/ds/test_spatial.py +0 -0
  158. {decoupler-2.2.0 → decoupler-2.3.0}/tests/ds/test_toy.py +0 -0
  159. {decoupler-2.2.0 → decoupler-2.3.0}/tests/ds/test_utils.py +0 -0
  160. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_adj.py +0 -0
  161. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_aucell.py +0 -0
  162. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_consensus.py +0 -0
  163. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_decouple.py +0 -0
  164. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_gsva.py +0 -0
  165. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_mdt.py +0 -0
  166. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_methods.py +0 -0
  167. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_mlm.py +0 -0
  168. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_run.py +0 -0
  169. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_udt.py +0 -0
  170. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_ulm.py +0 -0
  171. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_viper.py +0 -0
  172. {decoupler-2.2.0 → decoupler-2.3.0}/tests/mt/test_zscore.py +0 -0
  173. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_collectri.py +0 -0
  174. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_dorothea.py +0 -0
  175. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_dtype.py +0 -0
  176. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_hallmark.py +0 -0
  177. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_progeny.py +0 -0
  178. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_resource.py +0 -0
  179. {decoupler-2.2.0 → decoupler-2.3.0}/tests/op/test_translate.py +0 -0
  180. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_Plotter.py +0 -0
  181. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_barplot.py +0 -0
  182. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_filter_by_expr.py +0 -0
  183. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_filter_by_prop.py +0 -0
  184. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_filter_samples.py +0 -0
  185. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_leading_edge.py +0 -0
  186. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_network.py +0 -0
  187. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_obsbar.py +0 -0
  188. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_obsm.py +0 -0
  189. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_order.py +0 -0
  190. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_order_targets.py +0 -0
  191. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_source_targets.py +0 -0
  192. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pl/test_volcano.py +0 -0
  193. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pp/test_data.py +0 -0
  194. {decoupler-2.2.0 → decoupler-2.3.0}/tests/pp/test_net.py +0 -0
  195. {decoupler-2.2.0 → decoupler-2.3.0}/tests/test_download.py +0 -0
  196. {decoupler-2.2.0 → decoupler-2.3.0}/tests/test_version.py +0 -0
  197. {decoupler-2.2.0 → decoupler-2.3.0}/tests/tl/test_rankby_group.py +0 -0
  198. {decoupler-2.2.0 → decoupler-2.3.0}/tests/tl/test_rankby_obsm.py +0 -0
  199. {decoupler-2.2.0 → decoupler-2.3.0}/tests/tl/test_rankby_order.py +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "template": "https://github.com/scverse/cookiecutter-scverse",
3
- "commit": "6ff5b92b5d44ea6d8a88e47538475718d467db95",
4
- "checkout": "v0.7.0",
3
+ "commit": "6518dfa1abde7379ea7255daf0ce09c23f2b4c94",
4
+ "checkout": "v0.8.0",
5
5
  "context": {
6
6
  "cookiecutter": {
7
7
  "project_name": "decoupler",
@@ -13,6 +13,7 @@
13
13
  "github_repo": "decoupler",
14
14
  "license": "BSD 3-Clause License",
15
15
  "ide_integration": true,
16
+ "issue_categorization": "",
16
17
  "_copy_without_render": [
17
18
  ".github/workflows/build.yaml",
18
19
  ".github/workflows/test.yaml",
@@ -36,8 +37,10 @@
36
37
  "trim_blocks": true
37
38
  },
38
39
  "_template": "https://github.com/scverse/cookiecutter-scverse",
39
- "_commit": "d383d94fadff9e4e6fdb59d77c68cb900d7cedec"
40
- }
40
+ "_commit": "4d6aa34fd5be7523ca3bd49fbd81a882dde01d1f"
41
+ },
42
+ "_commit": "6518dfa1abde7379ea7255daf0ce09c23f2b4c94",
43
+ "_template": "https://github.com/scverse/cookiecutter-scverse"
41
44
  },
42
45
  "directory": null
43
46
  }
@@ -9,8 +9,7 @@ body:
9
9
  detailing how to provide the necessary information for us to reproduce your bug. In brief:
10
10
  * Please provide exact steps how to reproduce the bug in a clean Python environment.
11
11
  * In case it's not clear what's causing this bug, please provide the data or the data generation procedure.
12
- * Sometimes it is not possible to share the data, but usually it is possible to replicate problems on publicly
13
- available datasets or to share a subset of your data.
12
+ * Replicate problems on public datasets or share data subsets when full sharing isn't possible.
14
13
 
15
14
  - type: textarea
16
15
  id: report
@@ -0,0 +1,12 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: github-actions
4
+ directory: /
5
+ schedule:
6
+ interval: weekly
7
+ cooldown:
8
+ default-days: 7
9
+ groups:
10
+ actions-deps:
11
+ patterns:
12
+ - "*"
@@ -10,16 +10,20 @@ concurrency:
10
10
  group: ${{ github.workflow }}-${{ github.ref }}
11
11
  cancel-in-progress: true
12
12
 
13
+ permissions:
14
+ contents: read
15
+
13
16
  jobs:
14
17
  package:
15
18
  runs-on: ubuntu-latest
16
19
  steps:
17
- - uses: actions/checkout@v5
20
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
21
  with:
19
22
  filter: blob:none
20
23
  fetch-depth: 0
24
+ persist-credentials: false
21
25
  - name: Install uv
22
- uses: astral-sh/setup-uv@v7
26
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
23
27
  - name: Build package
24
28
  run: uv build
25
29
  - name: Check package
@@ -10,6 +10,9 @@ concurrency:
10
10
  group: ${{ github.workflow }}-${{ github.ref }}
11
11
  cancel-in-progress: true
12
12
 
13
+ permissions:
14
+ contents: read
15
+
13
16
  jobs:
14
17
  test:
15
18
  runs-on: ubuntu-latest
@@ -37,17 +40,18 @@ jobs:
37
40
  ]
38
41
 
39
42
  steps:
40
- - uses: actions/checkout@v5
43
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
41
44
  with:
42
45
  filter: blob:none
43
46
  fetch-depth: 0
44
47
  submodules: "true"
48
+ persist-credentials: false
45
49
  - name: Set up Python
46
- uses: actions/setup-python@v5
50
+ uses: actions/setup-python@6d4fd22b20465ccc0f7354476588e8df7c9ca0e0 # v7.1.0
47
51
  with:
48
52
  python-version: "3.13"
49
53
  - name: Install uv
50
- uses: astral-sh/setup-uv@v7
54
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
51
55
  - name: Install dependencies
52
56
  run: |
53
57
  uv pip install --system .
@@ -5,6 +5,8 @@ on:
5
5
  types: [published]
6
6
 
7
7
  # Use "trusted publishing", see https://docs.pypi.org/trusted-publishers/
8
+ permissions: {}
9
+
8
10
  jobs:
9
11
  release:
10
12
  name: Upload release to PyPI
@@ -13,15 +15,19 @@ jobs:
13
15
  name: pypi
14
16
  url: https://pypi.org/p/decoupler
15
17
  permissions:
18
+ contents: read
16
19
  id-token: write # IMPORTANT: this permission is mandatory for trusted publishing
17
20
  steps:
18
- - uses: actions/checkout@v5
21
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
19
22
  with:
20
23
  filter: blob:none
21
24
  fetch-depth: 0
25
+ persist-credentials: false
22
26
  - name: Install uv
23
- uses: astral-sh/setup-uv@v7
27
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
28
+ with:
29
+ enable-cache: false
24
30
  - name: Build package
25
31
  run: uv build
26
32
  - name: Publish package distributions to PyPI
27
- uses: pypa/gh-action-pypi-publish@release/v1
33
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
@@ -13,7 +13,7 @@ concurrency:
13
13
  cancel-in-progress: true
14
14
 
15
15
  permissions:
16
- id-token: write
16
+ contents: read
17
17
 
18
18
  jobs:
19
19
  # Get the test environment from hatch as defined in pyproject.toml.
@@ -22,17 +22,18 @@ jobs:
22
22
  # Check [[tool.hatch.envs.hatch-test.matrix]] in pyproject.toml and https://hatch.pypa.io/latest/environment/ for
23
23
  # more details.
24
24
  get-environments:
25
- runs-on: ubuntu-latest
25
+ runs-on: ubuntu-slim
26
26
  outputs:
27
27
  envs: ${{ steps.get-envs.outputs.envs }}
28
28
  allowed-failures: ${{ steps.get-envs.outputs.allowed-failures }}
29
29
  steps:
30
- - uses: actions/checkout@v5
30
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
31
31
  with:
32
32
  filter: blob:none
33
33
  fetch-depth: 0
34
+ persist-credentials: false
34
35
  - name: Install uv
35
- uses: astral-sh/setup-uv@v7
36
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
36
37
  - name: Get test environments
37
38
  id: get-envs
38
39
  run: |
@@ -52,6 +53,9 @@ jobs:
52
53
  # Run tests through hatch. Spawns a separate runner for each environment defined in the hatch matrix obtained above.
53
54
  test:
54
55
  needs: get-environments
56
+ permissions:
57
+ id-token: write # for codecov OIDC
58
+ contents: read
55
59
 
56
60
  strategy:
57
61
  fail-fast: false
@@ -61,19 +65,22 @@ jobs:
61
65
 
62
66
  name: ${{ matrix.env.label }}
63
67
  runs-on: ${{ matrix.os }}
64
- continue-on-error: ${{ contains(matrix.env.name, 'pre') }}
68
+ continue-on-error: ${{ contains(matrix.env.name, 'pre') }} # make "all-green" pass even if pre-release job fails
65
69
 
66
70
  steps:
67
- - uses: actions/checkout@v5
71
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
68
72
  with:
69
73
  filter: blob:none
70
74
  fetch-depth: 0
75
+ persist-credentials: false
71
76
  - name: Install uv
72
- uses: astral-sh/setup-uv@v7
77
+ uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
73
78
  with:
74
79
  python-version: ${{ matrix.env.python }}
75
80
  - name: create hatch environment
76
81
  run: uvx hatch env create ${{ matrix.env.name }}
82
+ - name: list all all installed package versions
83
+ run: uvx hatch run ${{ matrix.env.name }}:uv pip list
77
84
  - name: run tests using hatch
78
85
  env:
79
86
  MPLBACKEND: agg
@@ -82,12 +89,12 @@ jobs:
82
89
  run: uvx hatch run ${{ matrix.env.name }}:run-cov -v --color=yes -n auto
83
90
  - name: generate coverage report
84
91
  run: |
85
- # See https://coverage.readthedocs.io/en/latest/config.html#run-patch
92
+ # See https://coverage.readthedocs.io/page/config.html#run-patch
86
93
  test -f .coverage || uvx hatch run ${{ matrix.env.name }}:cov-combine
87
94
  uvx hatch run ${{ matrix.env.name }}:cov-report # report visibly
88
95
  uvx hatch run ${{ matrix.env.name }}:coverage xml # create report for upload
89
96
  - name: Upload coverage
90
- uses: codecov/codecov-action@v6
97
+ uses: codecov/codecov-action@303a32d7a59b442fa8d48b6a1cc6825c09c847a5 # v7.1.1
91
98
  with:
92
99
  fail_ci_if_error: true
93
100
  use_oidc: true
@@ -102,7 +109,7 @@ jobs:
102
109
  - test
103
110
  runs-on: ubuntu-latest
104
111
  steps:
105
- - uses: re-actors/alls-green@release/v1
112
+ - uses: re-actors/alls-green@b5b5b37504aa4183270bd3d855c52a67f212be35 # v1.3.0
106
113
  with:
107
114
  allowed-failures: ${{ needs.get-environments.outputs.allowed-failures }}
108
115
  jobs: ${{ toJSON(needs) }}
@@ -7,16 +7,16 @@ default_stages:
7
7
  minimum_pre_commit_version: 2.16.0
8
8
  repos:
9
9
  - repo: https://github.com/biomejs/pre-commit
10
- rev: v2.5.2
10
+ rev: v2.5.15
11
11
  hooks:
12
12
  - id: biome-format
13
13
  exclude: ^\.cruft\.json$ # inconsistent indentation with cruft - file never to be modified manually.
14
14
  - repo: https://github.com/tox-dev/pyproject-fmt
15
- rev: v2.25.1
15
+ rev: v2.30.3
16
16
  hooks:
17
17
  - id: pyproject-fmt
18
18
  - repo: https://github.com/astral-sh/ruff-pre-commit
19
- rev: v0.15.20
19
+ rev: v0.17.1
20
20
  hooks:
21
21
  - id: ruff-check
22
22
  types_or: [python, pyi, jupyter]
@@ -36,3 +36,9 @@ repos:
36
36
  # Check that there are no merge conflicts (could be generated by template sync)
37
37
  - id: check-merge-conflict
38
38
  args: [--assume-in-merge]
39
+
40
+ - repo: https://github.com/zizmorcore/zizmor-pre-commit
41
+ rev: v1.24.1
42
+ hooks:
43
+ - id: zizmor
44
+ args: [--no-progress, --fix]
@@ -1,9 +1,9 @@
1
- # https://docs.readthedocs.io/en/stable/config-file/v2.html
1
+ # https://docs.readthedocs.io/page/config-file/v2.html
2
2
  version: 2
3
3
  build:
4
4
  os: ubuntu-24.04
5
5
  tools:
6
- python: "3.13"
6
+ python: "3.14"
7
7
  nodejs: latest
8
8
  jobs:
9
9
  create_environment:
@@ -8,6 +8,25 @@ and this project adheres to [Semantic Versioning][].
8
8
  [keep a changelog]: https://keepachangelog.com/en/1.0.0/
9
9
  [semantic versioning]: https://semver.org/spec/v2.0.0.html
10
10
 
11
+ ## 2.3.0
12
+
13
+ ### Changes
14
+ - Updated the bundled decoupler Agent Skill, and `decoupler-install-skills` now supports multiple agent frameworks
15
+ - `pp.filter_by_prop` now defaults to `min_prop=0.1` (was `0.2`) to match the value used in the vignettes
16
+ - `ds.msvisium` now returns log-normalized data (`sc.pp.normalize_total` + `sc.pp.log1p`), with the log-normalized matrix also stored in `adata.layers["norm"]`, instead of raw counts
17
+ - Dropped support for Python 3.11; decoupler now requires Python 3.12 or newer
18
+ - Updated to the scverse cookiecutter template v0.8.0 (hash-pinned GitHub Actions checked by zizmor, `prek` instead of `pre-commit`, `sphinx-design` instead of `sphinx-tabs`, shared Sphinx extensions from `scverse-misc`)
19
+
20
+ ### Bugfixes
21
+ - Fixed `mt.ora` selecting the bottom `nvar - n_up` features instead of the top `n_up` ones. Ranks are ascending, so the threshold is now `nvar - n_up`, restoring the behaviour of `decoupler<2`. With the default `n_up` (top 5%) this selected 95% of the features as observed, which also made `mt.ora` fail with `invalid contingency table` whenever `nvar - n_up` exceeded `n_bg` (#346)
22
+ - Fixed `n_bm` in `mt.ora` selecting the bottom `n_bm - 1` features instead of `n_bm`
23
+ - `mt.ora` now validates that `n_up` and `n_bm` do not overlap and that `n_bg` is large enough for the number of selected features, instead of failing inside the Fisher exact test
24
+ - `mt.query_set` now raises an informative error when `n_bg` is smaller than the number of features to test, instead of failing inside `scipy.stats.fisher_exact`
25
+ - Fixed `mt.gsea` not shuffling the permutation indices when `seed=0`, which produced identical permutations and invalid p-values (#355)
26
+ - Fixed `mt.waggr` folding its already two-sided permutation p-values as one-sided, which gave scores near 0 the smallest p-value (#373)
27
+ - Fixed `pl.dotplot` showing an empty size legend when all dots have the same size (#370)
28
+ - Fixed `ds.msvisium` failing with HTTP 403 by fetching the spot metadata from `cells.ucsc.edu` instead of the `cells-test.gi.ucsc.edu` mirror
29
+
11
30
  ## 2.2.0
12
31
 
13
32
  ### Added
@@ -1,8 +1,8 @@
1
- Metadata-Version: 2.4
1
+ Metadata-Version: 2.5
2
2
  Name: decoupler
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Python package to perform enrichment analysis from omics data.
5
- Project-URL: Documentation, https://decoupler.readthedocs.io/
5
+ Project-URL: Documentation, https://decoupler.scverse.org/
6
6
  Project-URL: Homepage, https://github.com/scverse/decoupler
7
7
  Project-URL: Source, https://github.com/scverse/decoupler
8
8
  Author: Pau Badia i Mompel
@@ -39,11 +39,11 @@ License: BSD 3-Clause License
39
39
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40
40
  License-File: LICENSE
41
41
  Classifier: Programming Language :: Python :: 3 :: Only
42
- Classifier: Programming Language :: Python :: 3.11
43
42
  Classifier: Programming Language :: Python :: 3.12
44
43
  Classifier: Programming Language :: Python :: 3.13
45
44
  Classifier: Programming Language :: Python :: 3.14
46
- Requires-Python: >=3.11
45
+ Classifier: Programming Language :: Python :: 3.15
46
+ Requires-Python: >=3.12
47
47
  Requires-Dist: adjusttext
48
48
  Requires-Dist: anndata
49
49
  Requires-Dist: docrep
@@ -107,7 +107,7 @@ in particular, the [API documentation][].
107
107
 
108
108
  ## Installation
109
109
 
110
- You need to have Python 3.11 or newer installed on your system.
110
+ You need to have Python 3.12 or newer installed on your system.
111
111
  If you don't have Python installed, we recommend installing [uv][].
112
112
 
113
113
  There are several alternative options to install decoupler:
@@ -136,19 +136,15 @@ mamba create -n=dcp conda-forge::decoupler-py
136
136
  pip install git+https://github.com/scverse/decoupler.git@main
137
137
  ```
138
138
 
139
- ## Claude Code Skill
139
+ ## Agent Skill
140
140
 
141
- decoupler ships an [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills) for [Claude Code](https://claude.com/claude-code) that teaches the agent to use the library correctly. Install it once into your personal skills directory:
141
+ decoupler ships an [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills) that teaches coding agents to use the library correctly. Install it into your agent's skills directory by choosing a framework with `--agent {claude,codex,agents,claude-science}` (or an explicit directory with `--dest`):
142
142
 
143
143
  ```bash
144
- decoupler-install-skills
144
+ decoupler-install-skills --agent claude
145
145
  ```
146
146
 
147
- This copies the skill to `~/.claude/skills/decoupler/`, making it available in **every** project (re-run with `--force` after upgrading). Once installed, just ask Claude Code to do decoupler tasks ("find the most active TFs in this cell cluster", "score hallmark gene sets with ora", "build a consensus across methods") and the skill is consulted automatically. To avoid copying into your home directory, point Claude Code at the bundled copy instead:
148
-
149
- ```bash
150
- export CLAUDE_SKILLS_PATH="$(decoupler-install-skills --print-path)"
151
- ```
147
+ Re-run with `--force` after upgrading, use `--check` to see whether an installed copy is up to date, or `--print-path` to show where the bundled copy lives inside the package.
152
148
 
153
149
  ## Release notes
154
150
 
@@ -159,6 +155,13 @@ See the [changelog][].
159
155
  For questions and help requests, you can reach out in the [scverse discourse][].
160
156
  If you found a bug, please use the [issue tracker][].
161
157
 
158
+ ## License
159
+ Enrichment methods inside decoupler can be used for academic or commercial purposes, except `viper` which holds a non-commercial license.
160
+
161
+ The data redistributed by OmniPath does not have a single license, each original resource has its own. By default, `decoupler`
162
+ assumes an academic license, but commercial or nonprofit licenses can be specified in the `license` parameter of `decoupler`'s OmniPath functions.
163
+ [Here](https://omnipathdb.org/info) one can find the license information of all the resources in OmniPath.
164
+
162
165
  ## Citation
163
166
 
164
167
  > Badia-i-Mompel P., Vélez Santiago J., Braunger J., Geiss C., Dimitrov D.,
@@ -172,9 +175,9 @@ to infer biological activities from omics data. Bioinformatics Advances.
172
175
  [scverse]: https://scverse.org/
173
176
  [issue tracker]: https://github.com/scverse/decoupler/issues
174
177
  [tests]: https://github.com/scverse/decoupler/actions/workflows/test.yaml
175
- [documentation]: https://decoupler.readthedocs.io
176
- [changelog]: https://decoupler.readthedocs.io/en/latest/changelog.html
177
- [api documentation]: https://decoupler.readthedocs.io/en/latest/api.html
178
+ [documentation]: https://decoupler.scverse.org/
179
+ [changelog]: https://decoupler.scverse.org/page/changelog.html
180
+ [api documentation]: https://decoupler.scverse.org/page/api.html
178
181
  [pypi]: https://pypi.org/project/decoupler
179
182
  [down]: https://pepy.tech/project/decoupler
180
183
  [conda]: https://anaconda.org/conda-forge/decoupler-py
@@ -50,7 +50,7 @@ in particular, the [API documentation][].
50
50
 
51
51
  ## Installation
52
52
 
53
- You need to have Python 3.11 or newer installed on your system.
53
+ You need to have Python 3.12 or newer installed on your system.
54
54
  If you don't have Python installed, we recommend installing [uv][].
55
55
 
56
56
  There are several alternative options to install decoupler:
@@ -79,19 +79,15 @@ mamba create -n=dcp conda-forge::decoupler-py
79
79
  pip install git+https://github.com/scverse/decoupler.git@main
80
80
  ```
81
81
 
82
- ## Claude Code Skill
82
+ ## Agent Skill
83
83
 
84
- decoupler ships an [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills) for [Claude Code](https://claude.com/claude-code) that teaches the agent to use the library correctly. Install it once into your personal skills directory:
84
+ decoupler ships an [Agent Skill](https://docs.claude.com/en/docs/claude-code/skills) that teaches coding agents to use the library correctly. Install it into your agent's skills directory by choosing a framework with `--agent {claude,codex,agents,claude-science}` (or an explicit directory with `--dest`):
85
85
 
86
86
  ```bash
87
- decoupler-install-skills
87
+ decoupler-install-skills --agent claude
88
88
  ```
89
89
 
90
- This copies the skill to `~/.claude/skills/decoupler/`, making it available in **every** project (re-run with `--force` after upgrading). Once installed, just ask Claude Code to do decoupler tasks ("find the most active TFs in this cell cluster", "score hallmark gene sets with ora", "build a consensus across methods") and the skill is consulted automatically. To avoid copying into your home directory, point Claude Code at the bundled copy instead:
91
-
92
- ```bash
93
- export CLAUDE_SKILLS_PATH="$(decoupler-install-skills --print-path)"
94
- ```
90
+ Re-run with `--force` after upgrading, use `--check` to see whether an installed copy is up to date, or `--print-path` to show where the bundled copy lives inside the package.
95
91
 
96
92
  ## Release notes
97
93
 
@@ -102,6 +98,13 @@ See the [changelog][].
102
98
  For questions and help requests, you can reach out in the [scverse discourse][].
103
99
  If you found a bug, please use the [issue tracker][].
104
100
 
101
+ ## License
102
+ Enrichment methods inside decoupler can be used for academic or commercial purposes, except `viper` which holds a non-commercial license.
103
+
104
+ The data redistributed by OmniPath does not have a single license, each original resource has its own. By default, `decoupler`
105
+ assumes an academic license, but commercial or nonprofit licenses can be specified in the `license` parameter of `decoupler`'s OmniPath functions.
106
+ [Here](https://omnipathdb.org/info) one can find the license information of all the resources in OmniPath.
107
+
105
108
  ## Citation
106
109
 
107
110
  > Badia-i-Mompel P., Vélez Santiago J., Braunger J., Geiss C., Dimitrov D.,
@@ -115,9 +118,9 @@ to infer biological activities from omics data. Bioinformatics Advances.
115
118
  [scverse]: https://scverse.org/
116
119
  [issue tracker]: https://github.com/scverse/decoupler/issues
117
120
  [tests]: https://github.com/scverse/decoupler/actions/workflows/test.yaml
118
- [documentation]: https://decoupler.readthedocs.io
119
- [changelog]: https://decoupler.readthedocs.io/en/latest/changelog.html
120
- [api documentation]: https://decoupler.readthedocs.io/en/latest/api.html
121
+ [documentation]: https://decoupler.scverse.org/
122
+ [changelog]: https://decoupler.scverse.org/page/changelog.html
123
+ [api documentation]: https://decoupler.scverse.org/page/api.html
121
124
  [pypi]: https://pypi.org/project/decoupler
122
125
  [down]: https://pepy.tech/project/decoupler
123
126
  [conda]: https://anaconda.org/conda-forge/decoupler-py
@@ -0,0 +1,35 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
3
+ <svg width="100%" height="100%" viewBox="0 0 882 863" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="color-scheme:light dark;fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
4
+ <g transform="matrix(1,0,0,1,-1021.15,-508.159)">
5
+ <g transform="matrix(3.17792,0,0,3.17792,-481.276,-809.715)">
6
+ <g transform="matrix(0.903428,0,0,0.903428,310.296,-296.923)">
7
+ <path d="M205.034,956.366L204.745,927.619L181.293,914.614L187.919,889.473L213.089,891.307L226.82,865.79L212.329,842.947L229.966,826.83L252.734,838.193L276.979,823.626L277.145,797.594L300.513,790.574L314.423,813.922L344.041,811.56L356.336,789.14L380.422,794.244L381.221,820.534L407.414,834.253L428.942,820.971L447.216,836.034L434.805,860.485L449.815,883.739L476.007,883.175L484.074,905.4L460.086,919.743L461.835,947.863L485.292,960.143L479.468,983.876L452.222,984.142L438.067,1009.97L453.854,1031.56L435.938,1048.96L411.732,1035.93L387.635,1051.1L389.054,1077.92L365.066,1084.91L350.446,1062L321.54,1063.78L308.89,1086.54L286.332,1081.13L284.248,1054.29L259.696,1040.78L237.458,1055.86L218.479,1038.13L230.639,1015.9L215.657,991.846L189.177,992.838L184.137,970.897L205.034,956.366Z" style="fill:none;"/>
8
+ <clipPath id="_clip3">
9
+ <path d="M205.034,956.366L204.745,927.619L181.293,914.614L187.919,889.473L213.089,891.307L226.82,865.79L212.329,842.947L229.966,826.83L252.734,838.193L276.979,823.626L277.145,797.594L300.513,790.574L314.423,813.922L344.041,811.56L356.336,789.14L380.422,794.244L381.221,820.534L407.414,834.253L428.942,820.971L447.216,836.034L434.805,860.485L449.815,883.739L476.007,883.175L484.074,905.4L460.086,919.743L461.835,947.863L485.292,960.143L479.468,983.876L452.222,984.142L438.067,1009.97L453.854,1031.56L435.938,1048.96L411.732,1035.93L387.635,1051.1L389.054,1077.92L365.066,1084.91L350.446,1062L321.54,1063.78L308.89,1086.54L286.332,1081.13L284.248,1054.29L259.696,1040.78L237.458,1055.86L218.479,1038.13L230.639,1015.9L215.657,991.846L189.177,992.838L184.137,970.897L205.034,956.366Z"/>
10
+ </clipPath>
11
+ <g clip-path="url(#_clip3)">
12
+ <path d="M410.885,3233.05L415.49,3252.29L437.595,3251.26L449.408,3270.41L439.18,3288.83L455.556,3304.25L473.925,3291.69L493.331,3302.37L494.908,3324.58L514.747,3329.2L525.06,3310.47L547.982,3308.96L560.023,3327.97L580.864,3321.9L579.591,3299.83L598.597,3287.79L618.581,3298.54L634.168,3283.38L621.186,3265.49L632.255,3245.16L654.728,3244.93L660.013,3224.26L640.427,3214.18L639.061,3192.03L658.861,3180.11L652.199,3160.7L630.256,3161.27L618.445,3143.03L628.724,3122.65L612.813,3109.5L595.094,3120.54L574.418,3109.79L573.801,3088.05L552.855,3083.5L542.642,3102.12L519.227,3104.03L507.987,3084.64L487.426,3090.67L487.443,3112.26L468.275,3123.88L449.523,3114.46L433.846,3128.18L446.048,3147.3L435.403,3167.31L414.319,3165.8L408.281,3187.62L428.022,3198.46L428.302,3221.19L410.885,3233.05ZM533.378,3139.43C541.744,3139.43 557.034,3142.67 564.201,3145.99C575.271,3151.13 587.045,3162.58 593.631,3176.37C598.895,3187.39 600.157,3200.11 600.157,3210.74C600.157,3228.86 590.764,3247.15 575.691,3258.91C563.68,3268.28 547.53,3273.12 533.509,3273.12C501.896,3273.12 473.307,3240.97 473.307,3208.42C473.307,3199.59 473.548,3189.96 477.226,3181.37C487.118,3158.27 510.335,3139.43 533.378,3139.43Z" transform="matrix(1.2125,0,0,1.2125,-314.382,-2949.99)" style="fill:url(#_GearShade);"/>
13
+ </g>
14
+ <path d="M205.034,956.366L204.745,927.619L181.293,914.614L187.919,889.473L213.089,891.307L226.82,865.79L212.329,842.947L229.966,826.83L252.734,838.193L276.979,823.626L277.145,797.594L300.513,790.574L314.423,813.922L344.041,811.56L356.336,789.14L380.422,794.244L381.221,820.534L407.414,834.253L428.942,820.971L447.216,836.034L434.805,860.485L449.815,883.739L476.007,883.175L484.074,905.4L460.086,919.743L461.835,947.863L485.292,960.143L479.468,983.876L452.222,984.142L438.067,1009.97L453.854,1031.56L435.938,1048.96L411.732,1035.93L387.635,1051.1L389.054,1077.92L365.066,1084.91L350.446,1062L321.54,1063.78L308.89,1086.54L286.332,1081.13L284.248,1054.29L259.696,1040.78L237.458,1055.86L218.479,1038.13L230.639,1015.9L215.657,991.846L189.177,992.838L184.137,970.897L205.034,956.366Z" style="fill:none;stroke:rgb(150,150,150);stroke-width:2.9px;"/>
15
+ </g>
16
+ <g transform="matrix(0.493725,0,0,0.515398,143.141,120.028)">
17
+ <circle cx="953.999" cy="834.926" r="141.691" style="fill:none;stroke:rgb(185,185,185);stroke-width:5.2px;"/>
18
+ </g>
19
+ <g transform="matrix(0.874551,0,0,0.886437,115.513,-670.307)">
20
+ <path d="M465.302,1356.02L475.899,1356.02L475.899,1379.56C475.899,1383.89 474.766,1387.41 472.499,1390.13C471.196,1391.7 469.538,1392.95 467.526,1393.87C465.515,1394.8 463.451,1395.26 461.335,1395.26C457.123,1395.26 453.571,1393.85 450.681,1391.01C447.791,1388.18 446.346,1384.7 446.346,1380.58C446.346,1376.6 447.781,1373.15 450.653,1370.24C453.524,1367.33 456.924,1365.88 460.853,1365.88C461.477,1365.88 462.421,1365.93 463.687,1366.05L463.687,1377.72C462.818,1377.04 461.949,1376.7 461.08,1376.7C459.985,1376.7 459.045,1377.1 458.261,1377.91C457.477,1378.71 457.085,1379.68 457.085,1380.81C457.085,1381.91 457.491,1382.85 458.303,1383.63C459.116,1384.41 460.088,1384.81 461.222,1384.81C463.942,1384.81 465.302,1382.93 465.302,1379.17L465.302,1356.02Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
21
+ <path d="M505.884,1382.28L489.818,1382.28C489.573,1381.47 489.45,1380.73 489.45,1380.05C489.45,1379.1 489.62,1378.17 489.96,1377.27L495.344,1377.27C494.966,1375.17 493.785,1374.12 491.802,1374.12C490.479,1374.12 489.403,1374.69 488.571,1375.81C487.74,1376.93 487.325,1378.37 487.325,1380.13C487.325,1381.96 487.726,1383.45 488.529,1384.58C489.332,1385.71 490.385,1386.28 491.688,1386.28C492.746,1386.28 493.766,1385.75 494.749,1384.69L500.784,1391.95C497.969,1394.16 494.843,1395.26 491.405,1395.26C487.211,1395.26 483.688,1393.85 480.836,1391.04C477.984,1388.23 476.557,1384.74 476.557,1380.58C476.557,1376.45 477.998,1372.95 480.878,1370.1C483.759,1367.25 487.296,1365.82 491.49,1365.82C495.589,1365.82 499.032,1367.21 501.818,1370C504.604,1372.79 505.998,1376.22 505.998,1380.3C505.998,1380.72 505.96,1381.38 505.884,1382.28Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
22
+ <path d="M524.252,1381.69L534.764,1381.29C534.462,1385.37 532.941,1388.73 530.202,1391.35C527.463,1393.98 524.129,1395.29 520.2,1395.29C516.044,1395.29 512.535,1393.85 509.673,1390.95C506.811,1388.06 505.38,1384.52 505.38,1380.33C505.38,1376.34 506.825,1372.93 509.716,1370.1C512.606,1367.27 516.072,1365.85 520.115,1365.85C523.647,1365.85 526.764,1366.96 529.465,1369.19C532.167,1371.42 533.848,1374.27 534.509,1377.72L523.77,1378.12C522.844,1376.91 521.673,1376.31 520.256,1376.31C519.047,1376.31 518.056,1376.7 517.281,1377.5C516.507,1378.29 516.119,1379.29 516.119,1380.5C516.119,1381.73 516.53,1382.76 517.352,1383.59C518.174,1384.42 519.199,1384.83 520.426,1384.83C522.221,1384.83 523.496,1383.79 524.252,1381.69Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
23
+ <path d="M549.419,1365.85C553.424,1365.85 556.857,1367.29 559.719,1370.17C562.581,1373.05 564.012,1376.5 564.012,1380.53C564.012,1384.61 562.562,1388.08 559.663,1390.95C556.763,1393.83 553.264,1395.26 549.164,1395.26C545.065,1395.26 541.561,1393.82 538.652,1390.94C535.743,1388.06 534.288,1384.59 534.288,1380.53C534.288,1376.39 535.743,1372.91 538.652,1370.09C541.561,1367.26 545.15,1365.85 549.419,1365.85ZM549.136,1376.31C548.003,1376.31 547.039,1376.72 546.246,1377.54C545.452,1378.36 545.056,1379.37 545.056,1380.56C545.056,1381.73 545.457,1382.73 546.26,1383.56C547.063,1384.39 548.022,1384.81 549.136,1384.81C550.269,1384.81 551.238,1384.39 552.04,1383.56C552.843,1382.73 553.245,1381.73 553.245,1380.56C553.245,1379.37 552.848,1378.36 552.055,1377.54C551.261,1376.72 550.288,1376.31 549.136,1376.31Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
24
+ <path d="M565.067,1366.84L575.664,1366.84L575.664,1382.79C575.664,1384.4 576.335,1385.2 577.676,1385.2C578.998,1385.2 579.659,1384.4 579.659,1382.79L579.659,1366.84L590.257,1366.84L590.257,1382.6C590.257,1386.26 589.038,1389.35 586.601,1391.88C584.165,1394.4 581.18,1395.66 577.647,1395.66C573.624,1395.66 570.384,1394.19 567.928,1391.27C566.021,1388.98 565.067,1385.81 565.067,1381.75L565.067,1366.84Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
25
+ <path d="M603.042,1405.15L592.445,1405.15L592.445,1381.58C592.445,1377.25 593.578,1373.73 595.845,1371.01C597.148,1369.44 598.806,1368.19 600.818,1367.27C602.829,1366.34 604.893,1365.88 607.009,1365.88C611.221,1365.88 614.773,1367.3 617.663,1370.13C620.553,1372.96 621.998,1376.44 621.998,1380.56C621.998,1384.56 620.563,1388.02 617.691,1390.93C614.82,1393.84 611.42,1395.29 607.491,1395.29C606.848,1395.29 605.904,1395.22 604.657,1395.09L604.657,1383.42C605.526,1384.12 606.395,1384.47 607.264,1384.47C608.36,1384.47 609.299,1384.06 610.083,1383.25C610.867,1382.43 611.259,1381.47 611.259,1380.36C611.259,1379.24 610.853,1378.29 610.041,1377.51C609.228,1376.73 608.256,1376.33 607.122,1376.33C604.402,1376.33 603.042,1378.21 603.042,1381.97L603.042,1405.15Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
26
+ <rect x="623.279" y="1356.02" width="10.597" height="38.678" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
27
+ <path d="M664.485,1382.28L648.419,1382.28C648.173,1381.47 648.051,1380.73 648.051,1380.05C648.051,1379.1 648.221,1378.17 648.561,1377.27L653.944,1377.27C653.566,1375.17 652.386,1374.12 650.402,1374.12C649.08,1374.12 648.003,1374.69 647.172,1375.81C646.341,1376.93 645.925,1378.37 645.925,1380.13C645.925,1381.96 646.327,1383.45 647.13,1384.58C647.932,1385.71 648.986,1386.28 650.289,1386.28C651.347,1386.28 652.367,1385.75 653.349,1384.69L659.385,1391.95C656.57,1394.16 653.444,1395.26 650.006,1395.26C645.812,1395.26 642.289,1393.85 639.437,1391.04C636.584,1388.23 635.158,1384.74 635.158,1380.58C635.158,1376.45 636.598,1372.95 639.479,1370.1C642.36,1367.25 645.897,1365.82 650.091,1365.82C654.19,1365.82 657.633,1367.21 660.419,1370C663.205,1372.79 664.598,1376.22 664.598,1380.3C664.598,1380.72 664.561,1381.38 664.485,1382.28Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
28
+ <path d="M681.011,1366.16L681.011,1377.5C680.274,1377.08 679.603,1376.87 678.999,1376.87C677.072,1376.87 676.109,1378.35 676.109,1381.29L676.109,1394.69L665.511,1394.69L665.511,1379.25C665.511,1375.17 666.626,1371.92 668.855,1369.49C671.084,1367.06 674.059,1365.85 677.78,1365.85C678.611,1365.85 679.688,1365.95 681.011,1366.16Z" style="fill:light-dark(rgb(61,54,54),rgb(230,230,230));fill-rule:nonzero;stroke:light-dark(white,rgb(61,54,54));stroke-width:0.36px;stroke-linecap:butt;stroke-miterlimit:2;"/>
29
+ </g>
30
+ </g>
31
+ </g>
32
+ <defs>
33
+ <radialGradient id="_GearShade" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(126.362,0,0,126.368,530.561,3207.23)"><stop offset="0.5" style="stop-color:rgb(247,247,247);stop-opacity:1"/><stop offset="0.591" style="stop-color:rgb(240,240,240);stop-opacity:1"/><stop offset="0.682" style="stop-color:rgb(230,230,230);stop-opacity:1"/><stop offset="0.773" style="stop-color:rgb(217,217,217);stop-opacity:1"/><stop offset="0.864" style="stop-color:rgb(206,206,206);stop-opacity:1"/><stop offset="0.955" style="stop-color:rgb(203,203,203);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(212,212,212);stop-opacity:1"/></radialGradient>
34
+ </defs>
35
+ </svg>
@@ -2,7 +2,7 @@
2
2
 
3
3
  # This file only contains a selection of the most common options. For a full
4
4
  # list see the documentation:
5
- # https://www.sphinx-doc.org/en/master/usage/configuration.html
5
+ # https://www.sphinx-doc.org/page/usage/configuration.html
6
6
 
7
7
  # -- Path setup --------------------------------------------------------------
8
8
  import shutil
@@ -57,11 +57,12 @@ extensions = [
57
57
  "sphinx.ext.autosummary",
58
58
  "sphinx.ext.napoleon",
59
59
  "sphinxcontrib.bibtex",
60
- "sphinx_autodoc_typehints",
61
- "sphinx_tabs.tabs",
62
60
  "sphinxcontrib.katex",
61
+ "sphinx_autodoc_typehints",
62
+ "sphinx_design",
63
63
  "IPython.sphinxext.ipython_console_highlighting",
64
64
  "sphinxext.opengraph",
65
+ "scverse_misc.sphinx_ext",
65
66
  *[p.stem for p in (HERE / "extensions").glob("*.py")],
66
67
  ]
67
68
 
@@ -87,6 +88,7 @@ nb_output_stderr = "remove"
87
88
  nb_execution_mode = "off"
88
89
  nb_merge_streams = True
89
90
  typehints_defaults = "braces"
91
+ always_use_bars_union = True # use `|` instead of `Union` in types even when building with Python ≤3.14
90
92
 
91
93
  source_suffix = {
92
94
  ".rst": "restructuredtext",
@@ -95,10 +97,9 @@ source_suffix = {
95
97
  }
96
98
 
97
99
  intersphinx_mapping = {
98
- # TODO: replace `3.13` with `3` once ReadTheDocs supports building with Python 3.14
99
- "python": ("https://docs.python.org/3.13", None),
100
- "anndata": ("https://anndata.readthedocs.io/en/stable/", None),
101
- "scanpy": ("https://scanpy.readthedocs.io/en/stable/", None),
100
+ "python": ("https://docs.python.org/3", None),
101
+ "anndata": ("https://anndata.scverse.org/en/stable/", None),
102
+ "scanpy": ("https://scanpy.scverse.org/en/stable/", None),
102
103
  "numpy": ("https://numpy.org/doc/stable/", None),
103
104
  "matplotlib": ("https://matplotlib.org/stable/", None),
104
105
  "pandas": ("https://pandas.pydata.org/pandas-docs/stable/", None),
@@ -472,3 +472,17 @@
472
472
  year = {2021},
473
473
  month = feb
474
474
  }
475
+
476
+ @article{phipson2010,
477
+ title = {Permutation P-values Should Never Be Zero: Calculating Exact P-values When Permutations Are Randomly Drawn},
478
+ volume = {9},
479
+ ISSN = {1544-6115},
480
+ url = {http://dx.doi.org/10.2202/1544-6115.1585},
481
+ DOI = {10.2202/1544-6115.1585},
482
+ number = {1},
483
+ journal = {Statistical Applications in Genetics and Molecular Biology},
484
+ publisher = {Walter de Gruyter GmbH},
485
+ author = {Phipson, Belinda and Smyth, Gordon K.},
486
+ year = {2010},
487
+ month = jan
488
+ }