genome-spy-python 0.7.0__tar.gz → 0.8.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 (586) hide show
  1. genome_spy_python-0.8.0/.agents/skills/contribute-genomespy/SKILL.md +21 -0
  2. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.github/workflows/ci.yml +113 -1
  3. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.github/workflows/docs.yml +2 -0
  4. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.github/workflows/release.yml +2 -0
  5. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.gitignore +8 -0
  6. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.pre-commit-config.yaml +8 -1
  7. genome_spy_python-0.8.0/AGENTS.md +101 -0
  8. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/CHANGELOG.md +27 -0
  9. genome_spy_python-0.8.0/LICENSES/SCANPY-BSD-3-Clause.txt +30 -0
  10. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/PKG-INFO +17 -1
  11. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/README.md +13 -0
  12. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/THIRD_PARTY_NOTICES.md +49 -0
  13. genome_spy_python-0.8.0/docs/_ext/genomespy_notebook.py +172 -0
  14. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/genomespy.css +5 -0
  15. genome_spy_python-0.8.0/docs/agents/embed-api.md +238 -0
  16. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/encodings.md +54 -0
  17. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/manifest.json +34 -2
  18. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/quickstart.md +2 -1
  19. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/rendering.md +2 -0
  20. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/conf.py +1 -0
  21. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/contributing/standards.md +3 -0
  22. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/index.md +1 -0
  23. genome_spy_python-0.8.0/docs/integrations/index.md +14 -0
  24. genome_spy_python-0.8.0/docs/integrations/scanpy/api.md +19 -0
  25. genome_spy_python-0.8.0/docs/integrations/scanpy/export.md +5 -0
  26. genome_spy_python-0.8.0/docs/integrations/scanpy/expression.md +2 -0
  27. genome_spy_python-0.8.0/docs/integrations/scanpy/index.md +65 -0
  28. genome_spy_python-0.8.0/docs/integrations/scanpy/linked_expression.md +2 -0
  29. genome_spy_python-0.8.0/docs/integrations/scanpy/paga.md +2 -0
  30. genome_spy_python-0.8.0/docs/integrations/scanpy/pca.md +2 -0
  31. genome_spy_python-0.8.0/docs/integrations/scanpy/profiles.md +2 -0
  32. genome_spy_python-0.8.0/docs/integrations/scanpy/quality.md +2 -0
  33. genome_spy_python-0.8.0/docs/integrations/scanpy/ranked.md +2 -0
  34. genome_spy_python-0.8.0/docs/integrations/scanpy/supported.md +75 -0
  35. genome_spy_python-0.8.0/docs/integrations/scanpy/tracks.md +2 -0
  36. genome_spy_python-0.8.0/docs/integrations/scanpy/umap.md +2 -0
  37. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/composition.py +44 -36
  38. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/composition.md +47 -45
  39. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/embed-api.md +3 -0
  40. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/index.md +2 -1
  41. genome_spy_python-0.8.0/integrations/README.md +101 -0
  42. genome_spy_python-0.8.0/integrations/scanpy/COMPATIBILITY.md +2023 -0
  43. genome_spy_python-0.8.0/integrations/scanpy/FUTURE.md +55 -0
  44. genome_spy_python-0.8.0/integrations/scanpy/PLAN.md +1896 -0
  45. genome_spy_python-0.8.0/integrations/scanpy/README.md +267 -0
  46. genome_spy_python-0.8.0/integrations/scanpy/STATUS.md +487 -0
  47. genome_spy_python-0.8.0/integrations/scanpy/guides/export.ipynb +184 -0
  48. genome_spy_python-0.8.0/integrations/scanpy/guides/expression.ipynb +447 -0
  49. genome_spy_python-0.8.0/integrations/scanpy/guides/linked_expression.ipynb +317 -0
  50. genome_spy_python-0.8.0/integrations/scanpy/guides/paga.ipynb +468 -0
  51. genome_spy_python-0.8.0/integrations/scanpy/guides/pca.ipynb +158 -0
  52. genome_spy_python-0.8.0/integrations/scanpy/guides/profiles.ipynb +436 -0
  53. genome_spy_python-0.8.0/integrations/scanpy/guides/quality.ipynb +234 -0
  54. genome_spy_python-0.8.0/integrations/scanpy/guides/ranked.ipynb +338 -0
  55. genome_spy_python-0.8.0/integrations/scanpy/guides/tracks.ipynb +246 -0
  56. genome_spy_python-0.8.0/integrations/scanpy/guides/umap.ipynb +790 -0
  57. genome_spy_python-0.8.0/integrations/scanpy/notebooks/scanpy_expression.ipynb +1618 -0
  58. genome_spy_python-0.8.0/integrations/scanpy/notebooks/scanpy_umap.ipynb +793 -0
  59. genome_spy_python-0.8.0/integrations/scanpy/prepare_guide_data.py +96 -0
  60. genome_spy_python-0.8.0/notebooks/penguin_python_roundtrip.ipynb +291 -0
  61. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/pyproject.toml +34 -1
  62. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/skills/create-genomespy-visualization/SKILL.md +3 -1
  63. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/__init__.py +1 -1
  64. genome_spy_python-0.8.0/src/genome_spy/integrations/__init__.py +3 -0
  65. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/__init__.py +10 -0
  66. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_data.py +151 -0
  67. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_dendrogram_chart.py +217 -0
  68. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_dendrogram_data.py +252 -0
  69. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/chart.py +553 -0
  70. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/data.py +551 -0
  71. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/density_data.py +209 -0
  72. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/interactions.py +160 -0
  73. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/scatter_data.py +427 -0
  74. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/selection.py +108 -0
  75. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/summary_builder.py +649 -0
  76. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/summary_chart.py +590 -0
  77. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding/summary_data.py +81 -0
  78. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/clustermap_chart.py +334 -0
  79. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/clustermap_data.py +247 -0
  80. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/colors.py +38 -0
  81. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/correlation_chart.py +162 -0
  82. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/dotplot_builder.py +368 -0
  83. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/dotplot_chart.py +298 -0
  84. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/grouped_builder.py +202 -0
  85. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/grouped_chart.py +570 -0
  86. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/grouped_data.py +549 -0
  87. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/heatmap_chart.py +345 -0
  88. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/matrix_chart.py +460 -0
  89. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/matrixplot_builder.py +301 -0
  90. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/matrixplot_chart.py +148 -0
  91. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/tracksplot_chart.py +277 -0
  92. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_grid_interactions.py +296 -0
  93. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_guards.py +95 -0
  94. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_labels.py +63 -0
  95. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_paga/__init__.py +0 -0
  96. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_paga/chart.py +523 -0
  97. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_paga/data.py +393 -0
  98. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_paga/path_chart.py +471 -0
  99. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_paga/path_data.py +188 -0
  100. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_qc/__init__.py +0 -0
  101. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_qc/highest_expr_chart.py +138 -0
  102. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_qc/highest_expr_data.py +102 -0
  103. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_qc/hvg_chart.py +222 -0
  104. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_qc/scrublet_chart.py +189 -0
  105. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_qc/scrublet_data.py +97 -0
  106. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_ranking/__init__.py +0 -0
  107. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_ranking/chart.py +103 -0
  108. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_ranking/data.py +455 -0
  109. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_style.py +599 -0
  110. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_timeseries/__init__.py +0 -0
  111. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_timeseries/chart.py +353 -0
  112. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_timeseries/data.py +292 -0
  113. genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/pl.py +4512 -0
  114. genome_spy_python-0.8.0/src/genome_spy/py.typed +0 -0
  115. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/static/widget.js +3 -0
  116. genome_spy_python-0.8.0/tests/__init__.py +0 -0
  117. genome_spy_python-0.8.0/tests/browser/__init__.py +1 -0
  118. genome_spy_python-0.8.0/tests/browser/test_docs_composition.py +165 -0
  119. genome_spy_python-0.8.0/tests/browser/test_docs_linked_expression.py +507 -0
  120. genome_spy_python-0.8.0/tests/browser/test_docs_notebook.py +790 -0
  121. genome_spy_python-0.8.0/tests/integrations/__init__.py +1 -0
  122. genome_spy_python-0.8.0/tests/integrations/scanpy/__init__.py +1 -0
  123. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/__init__.py +1 -0
  124. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/conftest.py +64 -0
  125. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/interactions.py +169 -0
  126. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/references.py +410 -0
  127. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/rendering.py +145 -0
  128. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_dendrogram.py +565 -0
  129. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_dpt.py +448 -0
  130. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_embedding_style.py +778 -0
  131. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_embeddings.py +795 -0
  132. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_grid_interactions.py +851 -0
  133. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_grouped_builders.py +191 -0
  134. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_grouped_expression.py +808 -0
  135. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_heatmaps.py +1452 -0
  136. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_linked_embeddings.py +1085 -0
  137. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_paga.py +764 -0
  138. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_paga_adjacency.py +430 -0
  139. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_paga_path.py +533 -0
  140. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_pca.py +173 -0
  141. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_profiles.py +1163 -0
  142. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_qc.py +584 -0
  143. genome_spy_python-0.8.0/tests/integrations/scanpy/browser/test_ranked.py +413 -0
  144. genome_spy_python-0.8.0/tests/integrations/scanpy/embedding_fixtures.py +288 -0
  145. genome_spy_python-0.8.0/tests/integrations/scanpy/expression_fixtures.py +337 -0
  146. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/README.md +19 -0
  147. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/api.json +505 -0
  148. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/clustermap.json +1387 -0
  149. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/dendrogram.json +2384 -0
  150. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/dotplot.json +1146 -0
  151. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/embedding.json +634 -0
  152. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/grouped.json +1735 -0
  153. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/heatmap.json +1353 -0
  154. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/matrix.json +303 -0
  155. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/matrixplot.json +1622 -0
  156. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/ranked.json +891 -0
  157. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/scatter.json +500 -0
  158. genome_spy_python-0.8.0/tests/integrations/scanpy/fixtures/umap.json +1114 -0
  159. genome_spy_python-0.8.0/tests/integrations/scanpy/grid_fixture_support.py +55 -0
  160. genome_spy_python-0.8.0/tests/integrations/scanpy/helpers.py +120 -0
  161. genome_spy_python-0.8.0/tests/integrations/scanpy/paga_fixtures.py +304 -0
  162. genome_spy_python-0.8.0/tests/integrations/scanpy/profile_fixtures.py +215 -0
  163. genome_spy_python-0.8.0/tests/integrations/scanpy/qc_fixtures.py +82 -0
  164. genome_spy_python-0.8.0/tests/integrations/scanpy/ranked_fixture.py +85 -0
  165. genome_spy_python-0.8.0/tests/integrations/scanpy/test_contract.py +419 -0
  166. genome_spy_python-0.8.0/tests/integrations/scanpy/test_dendrogram.py +502 -0
  167. genome_spy_python-0.8.0/tests/integrations/scanpy/test_dpt.py +404 -0
  168. genome_spy_python-0.8.0/tests/integrations/scanpy/test_embedding_style.py +1063 -0
  169. genome_spy_python-0.8.0/tests/integrations/scanpy/test_embeddings.py +1458 -0
  170. genome_spy_python-0.8.0/tests/integrations/scanpy/test_grid_interactions.py +327 -0
  171. genome_spy_python-0.8.0/tests/integrations/scanpy/test_grouped_builders.py +575 -0
  172. genome_spy_python-0.8.0/tests/integrations/scanpy/test_grouped_expression.py +1016 -0
  173. genome_spy_python-0.8.0/tests/integrations/scanpy/test_heatmaps.py +1167 -0
  174. genome_spy_python-0.8.0/tests/integrations/scanpy/test_linked_embeddings.py +774 -0
  175. genome_spy_python-0.8.0/tests/integrations/scanpy/test_notebooks.py +136 -0
  176. genome_spy_python-0.8.0/tests/integrations/scanpy/test_paga.py +1002 -0
  177. genome_spy_python-0.8.0/tests/integrations/scanpy/test_paga_adjacency.py +327 -0
  178. genome_spy_python-0.8.0/tests/integrations/scanpy/test_paga_path.py +582 -0
  179. genome_spy_python-0.8.0/tests/integrations/scanpy/test_pca.py +464 -0
  180. genome_spy_python-0.8.0/tests/integrations/scanpy/test_profiles.py +707 -0
  181. genome_spy_python-0.8.0/tests/integrations/scanpy/test_qc.py +776 -0
  182. genome_spy_python-0.8.0/tests/integrations/scanpy/test_ranked.py +741 -0
  183. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_agent_docs.py +44 -12
  184. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_chart.py +1 -1
  185. genome_spy_python-0.8.0/tests/test_distribution.py +81 -0
  186. genome_spy_python-0.8.0/tests/test_docs_linked_expression.py +58 -0
  187. genome_spy_python-0.8.0/tests/test_docs_notebook.py +731 -0
  188. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_docs_tutorial.py +29 -14
  189. genome_spy_python-0.8.0/tests/test_scanpy_imports.py +56 -0
  190. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_workflow_notebooks.py +30 -0
  191. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/widget.test.mjs +17 -2
  192. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/agent_docs.py +49 -9
  193. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/check_notebook_rendering.py +231 -3
  194. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/uv.lock +1058 -441
  195. genome_spy_python-0.7.0/AGENTS.md +0 -65
  196. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.agents/skills/commit/SKILL.md +0 -0
  197. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.agents/skills/proper-code-review/SKILL.md +0 -0
  198. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  199. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.agents/skills/proper-code-review/references/design.md +0 -0
  200. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
  201. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.claude/skills/commit/SKILL.md +0 -0
  202. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
  203. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  204. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.claude/skills/proper-code-review/references/design.md +0 -0
  205. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
  206. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.gitattributes +0 -0
  207. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/.python-version +0 -0
  208. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/CLAUDE.md +0 -0
  209. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/CONTRIBUTING.md +0 -0
  210. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSE +0 -0
  211. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  212. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/CC-BY-4.0.txt +0 -0
  213. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
  214. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/CC0-1.0.txt +0 -0
  215. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
  216. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/GENOMESPY-MIT.txt +0 -0
  217. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/LATO-OFL-1.1.txt +0 -0
  218. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
  219. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
  220. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_ext/genomespy_agents.py +0 -0
  221. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_ext/genomespy_gallery.py +0 -0
  222. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/data/README.md +0 -0
  223. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/data/airway_metadata.csv +0 -0
  224. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
  225. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/data/hapmap_gwas.csv +0 -0
  226. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
  227. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/data/pik3ca_mutations.json +0 -0
  228. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/external-links.js +0 -0
  229. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/airway_ma_plot.png +0 -0
  230. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/airway_volcano_plot.png +0 -0
  231. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
  232. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/ascat_fitting.png +0 -0
  233. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
  234. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/bam_read_pileup.png +0 -0
  235. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  236. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  237. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/clinvar_variants.png +0 -0
  238. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/clustered_heatmap.png +0 -0
  239. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  240. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
  241. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/copy_number.png +0 -0
  242. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/coverage_pileup.png +0 -0
  243. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/cytobands.png +0 -0
  244. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/diverging_bars.png +0 -0
  245. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
  246. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  247. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/genome_tracks.png +0 -0
  248. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/geometric_zoom.png +0 -0
  249. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  250. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  251. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/heatmap_with_text.png +0 -0
  252. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/independent_scales.png +0 -0
  253. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  254. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/layered_lollipop.png +0 -0
  255. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/link_mark.png +0 -0
  256. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
  257. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/manhattan_plot.png +0 -0
  258. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  259. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/needle_plot.png +0 -0
  260. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/oncoprint.png +0 -0
  261. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  262. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
  263. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
  264. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
  265. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pbmc_umap.png +0 -0
  266. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pbmc_umap_genes.png +0 -0
  267. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/penguin_brush.png +0 -0
  268. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  269. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
  270. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/pisa_squid.png +0 -0
  271. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/point_mark.png +0 -0
  272. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/point_styles.png +0 -0
  273. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/rainfall_plot.png +0 -0
  274. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/ranged_rule.png +0 -0
  275. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/rect_heatmap.png +0 -0
  276. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  277. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
  278. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/sashimi_plot.png +0 -0
  279. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
  280. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/sequence_logo.png +0 -0
  281. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/six_frame_translation.png +0 -0
  282. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/stacked_bar.png +0 -0
  283. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  284. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  285. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/tsne.png +0 -0
  286. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/upset_mutations.png +0 -0
  287. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/vertical_concat.png +0 -0
  288. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/gallery/volcano_plot.png +0 -0
  289. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/readme-manhattan.webp +0 -0
  290. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/readme-sequence-logo.webp +0 -0
  291. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/showcase.js +0 -0
  292. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/snaketie.svg +0 -0
  293. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/workflows.css +0 -0
  294. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_static/workflows.js +0 -0
  295. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_templates/autosummary/class.rst +0 -0
  296. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
  297. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_templates/base.html +0 -0
  298. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/_templates/components/view-this-page.html +0 -0
  299. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/about.md +0 -0
  300. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/data.md +0 -0
  301. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/scales-axes-legends.md +0 -0
  302. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/agents/skill-distribution.md +0 -0
  303. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/api.md +0 -0
  304. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/datasets.md +0 -0
  305. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/airway_ma_plot.md +0 -0
  306. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/airway_ma_plot.py +0 -0
  307. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/airway_volcano_plot.md +0 -0
  308. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/airway_volcano_plot.py +0 -0
  309. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/ascat_copy_number.md +0 -0
  310. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/ascat_copy_number.py +0 -0
  311. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/ascat_fitting.md +0 -0
  312. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/ascat_fitting.py +0 -0
  313. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/bam_read_alignments.md +0 -0
  314. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/bam_read_alignments.py +0 -0
  315. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/bam_read_pileup.md +0 -0
  316. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/bam_read_pileup.py +0 -0
  317. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/bigbed_ccre_track.py +0 -0
  318. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
  319. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/brush_linked_genome_tracks.py +0 -0
  320. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/clinvar_variants.md +0 -0
  321. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/clinvar_variants.py +0 -0
  322. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/clustered_heatmap.md +0 -0
  323. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/clustered_heatmap.py +0 -0
  324. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/combined_laml_oncoplot.md +0 -0
  325. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/combined_laml_oncoplot.py +0 -0
  326. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/composing_genome_browser.md +0 -0
  327. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/composing_genome_browser.py +0 -0
  328. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/copy_number.py +0 -0
  329. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/coverage_pileup.md +0 -0
  330. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/coverage_pileup.py +0 -0
  331. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/cytobands.md +0 -0
  332. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/cytobands.py +0 -0
  333. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/diverging_bars.md +0 -0
  334. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/diverging_bars.py +0 -0
  335. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
  336. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/dynseq_adaptive_bqtl.py +0 -0
  337. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/dynseq_bqtl.md +0 -0
  338. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/dynseq_bqtl.py +0 -0
  339. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/genome_tracks.py +0 -0
  340. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/geometric_zoom.md +0 -0
  341. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/geometric_zoom.py +0 -0
  342. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/gff3_gene_annotations.md +0 -0
  343. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/gff3_gene_annotations.py +0 -0
  344. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
  345. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/hcc1954_sv_cnv.py +0 -0
  346. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/heatmap_with_text.md +0 -0
  347. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/heatmap_with_text.py +0 -0
  348. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/independent_scales.md +0 -0
  349. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/independent_scales.py +0 -0
  350. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/indexed_fasta_sequence.py +0 -0
  351. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/layered_lollipop.md +0 -0
  352. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/layered_lollipop.py +0 -0
  353. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/link_mark.py +0 -0
  354. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/luad_oncoprint.md +0 -0
  355. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/luad_oncoprint.py +0 -0
  356. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/manhattan_plot.md +0 -0
  357. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/manhattan_plot.py +0 -0
  358. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/multiple_sequence_alignment.md +0 -0
  359. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/multiple_sequence_alignment.py +0 -0
  360. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/needle_plot.py +0 -0
  361. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/oncoprint.md +0 -0
  362. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/oncoprint.py +0 -0
  363. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/p53_sequence_comparison.md +0 -0
  364. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/p53_sequence_comparison.py +0 -0
  365. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_cell_heatmap.md +0 -0
  366. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_cell_heatmap.py +0 -0
  367. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_expression_tracks.md +0 -0
  368. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_expression_tracks.py +0 -0
  369. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_marker_matrix.md +0 -0
  370. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_marker_matrix.py +0 -0
  371. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_umap.md +0 -0
  372. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_umap.py +0 -0
  373. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_umap_genes.md +0 -0
  374. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pbmc_umap_genes.py +0 -0
  375. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/penguin_brush.md +0 -0
  376. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/penguin_brush.py +0 -0
  377. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  378. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +0 -0
  379. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pisa_interaction_matrix.md +0 -0
  380. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pisa_interaction_matrix.py +0 -0
  381. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pisa_squid.md +0 -0
  382. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/pisa_squid.py +0 -0
  383. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/point_mark.md +0 -0
  384. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/point_mark.py +0 -0
  385. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/point_styles.md +0 -0
  386. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/point_styles.py +0 -0
  387. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/rainfall_plot.md +0 -0
  388. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/rainfall_plot.py +0 -0
  389. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/ranged_rule.py +0 -0
  390. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/rect_heatmap.md +0 -0
  391. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/rect_heatmap.py +0 -0
  392. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/refseq_scored_genes.md +0 -0
  393. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/refseq_scored_genes.py +0 -0
  394. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/rnf7_direct_rna.md +0 -0
  395. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/rnf7_direct_rna.py +0 -0
  396. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/sashimi_plot.md +0 -0
  397. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/sashimi_plot.py +0 -0
  398. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/scrollable_viewport.py +0 -0
  399. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/sequence_logo.py +0 -0
  400. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/six_frame_translation.md +0 -0
  401. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/six_frame_translation.py +0 -0
  402. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/stacked_bar.md +0 -0
  403. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/stacked_bar.py +0 -0
  404. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/stacked_genome_browser.py +0 -0
  405. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/tcga_ov_gistic.md +0 -0
  406. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/tcga_ov_gistic.py +0 -0
  407. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/tsne.md +0 -0
  408. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/tsne.py +0 -0
  409. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/upset_mutations.md +0 -0
  410. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/upset_mutations.py +0 -0
  411. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/vertical_concat.md +0 -0
  412. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/vertical_concat.py +0 -0
  413. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/volcano_plot.md +0 -0
  414. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/examples/volcano_plot.py +0 -0
  415. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/getting-started.md +0 -0
  416. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/integration/component.py +0 -0
  417. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/integration/index.html +0 -0
  418. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/integration/notebook.ipynb +0 -0
  419. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/integration/server.py +0 -0
  420. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/annotations.py +0 -0
  421. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/charts_and_marks.py +0 -0
  422. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/configuration.py +0 -0
  423. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/data_inputs.py +0 -0
  424. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/display_controls.py +0 -0
  425. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/encoding_channels.py +0 -0
  426. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/expressions.py +0 -0
  427. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/genome_browser_layouts.py +0 -0
  428. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/genomic_coordinates.py +0 -0
  429. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/genomic_data.py +0 -0
  430. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/getting_started.py +0 -0
  431. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/importing_specifications.py +0 -0
  432. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/interaction.py +0 -0
  433. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/notebooks.py +0 -0
  434. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/scales_and_guides.py +0 -0
  435. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/serialization.py +0 -0
  436. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/tutorials/transforms.py +0 -0
  437. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/annotations.md +0 -0
  438. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/charts.md +0 -0
  439. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/configuration.md +0 -0
  440. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/connect-python.md +0 -0
  441. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/data.md +0 -0
  442. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/display-controls.md +0 -0
  443. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/encodings.md +0 -0
  444. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/expressions.md +0 -0
  445. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/genome-browser-layouts.md +0 -0
  446. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/genomic-axes.md +0 -0
  447. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/genomic-data.md +0 -0
  448. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/importing-specifications.md +0 -0
  449. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/interaction.md +0 -0
  450. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/notebooks.md +0 -0
  451. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/scales-axes-legends.md +0 -0
  452. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/serialization.md +0 -0
  453. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/transforms.md +0 -0
  454. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/using-charts.md +0 -0
  455. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/workflows/annotate-intervals.md +0 -0
  456. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/workflows/edit-sequence.md +0 -0
  457. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/workflows/index.md +0 -0
  458. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/workflows/pick-genes.md +0 -0
  459. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/docs/user-guide/workflows/select-genes.md +0 -0
  460. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/notebooks/annotate_genomic_intervals.ipynb +0 -0
  461. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
  462. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/notebooks/edit_sequence.ipynb +0 -0
  463. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/notebooks/embed_api.ipynb +0 -0
  464. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/notebooks/pick_genes.ipynb +0 -0
  465. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/notebooks/select_genes.ipynb +0 -0
  466. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/skills/create-genomespy-visualization/agents/openai.yaml +0 -0
  467. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/skills/create-genomespy-visualization/references/grouped-charts.md +0 -0
  468. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/skills/create-genomespy-visualization/references/table-chart.md +0 -0
  469. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_chart_authoring.py +0 -0
  470. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_conditions.py +0 -0
  471. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_embed.py +0 -0
  472. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_expressions.py +0 -0
  473. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_parameters.py +0 -0
  474. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_render.py +0 -0
  475. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_skill_install.py +0 -0
  476. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_utils.py +0 -0
  477. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/_widget.py +0 -0
  478. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/anndata.py +0 -0
  479. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/api.py +0 -0
  480. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/arrow.py +0 -0
  481. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/channels.py +0 -0
  482. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/chart.py +0 -0
  483. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/data.py +0 -0
  484. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/data_transformers.py +0 -0
  485. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/__init__.py +0 -0
  486. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_airway.py +0 -0
  487. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_annotations.py +0 -0
  488. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_direct_rna.py +0 -0
  489. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_gistic.py +0 -0
  490. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_grammar.py +0 -0
  491. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_hapmap.py +0 -0
  492. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_mutation.py +0 -0
  493. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
  494. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/_pbmc.py +0 -0
  495. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  496. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
  497. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  498. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  499. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  500. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  501. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  502. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
  503. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
  504. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  505. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  506. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  507. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
  508. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  509. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  510. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  511. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  512. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
  513. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
  514. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
  515. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/embed.py +0 -0
  516. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/helpers.py +0 -0
  517. {genome_spy_python-0.7.0/tests → genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_embedding}/__init__.py +0 -0
  518. /genome_spy_python-0.7.0/src/genome_spy/py.typed → /genome_spy_python-0.8.0/src/genome_spy/integrations/scanpy/_expression/__init__.py +0 -0
  519. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/jupyter.py +0 -0
  520. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/__init__.py +0 -0
  521. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/_kwds.py +0 -0
  522. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/_typing.py +0 -0
  523. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/capabilities.json +0 -0
  524. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/channels.py +0 -0
  525. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/composition.py +0 -0
  526. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/core.py +0 -0
  527. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/ergonomics.py +0 -0
  528. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/expressions.py +0 -0
  529. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/genome-spy-schema.json +0 -0
  530. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/lazy.py +0 -0
  531. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schema/mixins.py +0 -0
  532. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/schemapi.py +0 -0
  533. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/static/controls.js +0 -0
  534. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/static/embed-bridge.js +0 -0
  535. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/static/genome-spy.js +0 -0
  536. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/src/genome_spy/static/inspector.js +0 -0
  537. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/browser/test_core_upgrade.py +0 -0
  538. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/browser/test_docs_theme.py +0 -0
  539. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/browser/test_docs_workflows.py +0 -0
  540. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/browser/test_embed_api.py +0 -0
  541. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/browser/test_offline_rendering.py +0 -0
  542. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/browser/test_python_web_example.py +0 -0
  543. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/embed-bridge.test.mjs +0 -0
  544. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/fixtures/upstream_examples/README.md +0 -0
  545. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +0 -0
  546. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/fixtures/upstream_examples/clustered-heatmap.json +0 -0
  547. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/fixtures/upstream_examples/upsetr-mutations.json +0 -0
  548. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_anndata.py +0 -0
  549. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_arrow.py +0 -0
  550. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_combined_gallery_data.py +0 -0
  551. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_conditions.py +0 -0
  552. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_data_transformers.py +0 -0
  553. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_datasets.py +0 -0
  554. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_docs_api_reference.py +0 -0
  555. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_docs_gallery.py +0 -0
  556. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_embed.py +0 -0
  557. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_embed_notebook.py +0 -0
  558. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_expressions.py +0 -0
  559. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_generated_schema_package.py +0 -0
  560. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_generated_transform_methods.py +0 -0
  561. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_javascript_assets.py +0 -0
  562. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_licensing.py +0 -0
  563. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_new_compositions.py +0 -0
  564. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_pbmc_gallery.py +0 -0
  565. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_pisa_gallery.py +0 -0
  566. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_python_connection_example.py +0 -0
  567. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_render_thumbnails.py +0 -0
  568. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_rnf7_direct_rna_example.py +0 -0
  569. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_schema_codegen.py +0 -0
  570. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_skill_install.py +0 -0
  571. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_upstream_surround_gallery.py +0 -0
  572. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tests/test_widget.py +0 -0
  573. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/agent_markdown.py +0 -0
  574. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/docs_gallery.py +0 -0
  575. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/docs_workflows.py +0 -0
  576. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/generate_api_docs.py +0 -0
  577. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/generate_schema_wrapper.py +0 -0
  578. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/prepare_airway_review.py +0 -0
  579. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/prepare_combined_gallery_data.py +0 -0
  580. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/prepare_pbmc_gallery_data.py +0 -0
  581. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/prepare_refseq_gene_annotations.py +0 -0
  582. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/render_thumbnails.py +0 -0
  583. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/schemapi/__init__.py +0 -0
  584. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/schemapi/codegen.py +0 -0
  585. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/schemapi/expression_codegen.py +0 -0
  586. {genome_spy_python-0.7.0 → genome_spy_python-0.8.0}/tools/vendor_javascript.py +0 -0
@@ -0,0 +1,21 @@
1
+ ---
2
+ name: contribute-genomespy
3
+ description: Use whenever work in genome-spy-python requires creating or updating an upstream GenomeSpy PR, including feature, fix, documentation and workflow changes.
4
+ ---
5
+
6
+ # Contribute to GenomeSpy
7
+
8
+ 1. Keep Python-specific work here. Put reusable engine behavior upstream when
9
+ the existing native API cannot cover it cleanly.
10
+ 2. Locate the intended GenomeSpy checkout and verify its Git remotes and branch;
11
+ do not assume a temporary clone is current. Read its `AGENTS.md`.
12
+ 3. Use that checkout's `.agents/skills/plan-genomespy-change/SKILL.md` before
13
+ implementation and before opening or updating any upstream PR. If code is
14
+ already written, run its architecture-fit check before PR preparation.
15
+ Use `.agents/skills/prepare-genomespy-change/SKILL.md` for commits and PR
16
+ preparation. Follow those upstream workflows rather than copying them here.
17
+ If either skill is absent, locate the current instructions before proceeding.
18
+ 4. Keep upstream edits separate from Python integration work and coordinate file
19
+ ownership with active chats when authorized. Preserve the agreed release/source
20
+ dependency; do not silently ship a local unreleased Core build.
21
+ 5. Report the upstream PR/commit, verification and remaining integration dependency.
@@ -4,8 +4,22 @@ on:
4
4
  push:
5
5
  branches: [main]
6
6
  pull_request:
7
+ workflow_dispatch:
8
+ inputs:
9
+ full_scanpy:
10
+ description: Run all Scanpy references, browsers and workflows
11
+ type: boolean
12
+ default: false
7
13
  # Reused by the release workflow as a pre-publish gate.
8
14
  workflow_call:
15
+ inputs:
16
+ full_scanpy:
17
+ type: boolean
18
+ default: false
19
+
20
+ concurrency:
21
+ group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
22
+ cancel-in-progress: ${{ github.event_name == 'pull_request' }}
9
23
 
10
24
  jobs:
11
25
  test:
@@ -34,7 +48,7 @@ jobs:
34
48
  run: uv run mypy src/
35
49
  - name: Run package tests
36
50
  run: >-
37
- uv run pytest tests/ -x
51
+ uv run pytest tests/ -x --ignore=tests/integrations/scanpy
38
52
  -m "not docs and not codegen"
39
53
  --durations=10
40
54
  - run: node --test tests/*.test.mjs
@@ -71,6 +85,94 @@ jobs:
71
85
  --with "$GITHUB_WORKSPACE"/dist/*.whl
72
86
  python -c "from importlib.resources import files; import genome_spy as gs; package = files('genome_spy'); assert package.joinpath('schema/genome-spy-schema.json').is_file(); assert package.joinpath('schema/capabilities.json').is_file(); assert package.joinpath('static/widget.js').is_file(); assert package.joinpath('static/genome-spy.js').is_file(); assert package.joinpath('static/controls.js').is_file(); assert package.joinpath('static/inspector.js').is_file(); chart = gs.Chart([{'x': 1}]).mark_point().encode(x='x:Q'); spec = chart.to_dict(); assert spec['mark'] == 'point'; assert spec['encoding']['x']['field'] == 'x'; assert spec[chr(36) + 'schema'].endswith('/schema.json')"
73
87
 
88
+ scanpy:
89
+ runs-on: ubuntu-latest
90
+ timeout-minutes: 75
91
+ strategy:
92
+ fail-fast: false
93
+ matrix:
94
+ python: ${{ fromJSON((github.ref == 'refs/heads/main' || inputs.full_scanpy) && '["3.11", "3.12", "3.13"]' || '["3.11"]') }}
95
+ env:
96
+ MPLBACKEND: Agg
97
+ steps:
98
+ - uses: actions/checkout@v7
99
+ - uses: astral-sh/setup-uv@v9.0.0
100
+ with:
101
+ enable-cache: true
102
+ python-version: ${{ matrix.python }}
103
+ - run: uv sync --locked --dev --extra scanpy --group scanpy-test
104
+ - name: Fast Scanpy checks
105
+ if: github.ref != 'refs/heads/main' && !inputs.full_scanpy
106
+ run: >-
107
+ uv run --no-sync pytest tests/integrations/scanpy
108
+ --ignore=tests/integrations/scanpy/browser
109
+ -m "not reference and not workflow" -q --durations=10
110
+ - name: Full Scanpy checks
111
+ if: github.ref == 'refs/heads/main' || inputs.full_scanpy
112
+ run: >-
113
+ uv run --no-sync pytest tests/integrations/scanpy
114
+ --ignore=tests/integrations/scanpy/browser -q --durations=10
115
+ # The renderer is JavaScript; repeat it once, rather than for each Python.
116
+ - if: matrix.python == '3.11'
117
+ run: uv run --no-sync python -m playwright install --with-deps chromium
118
+ - name: Browser smoke checks
119
+ if: matrix.python == '3.11' && github.ref != 'refs/heads/main' && !inputs.full_scanpy
120
+ run: >-
121
+ uv run --no-sync pytest tests/integrations/scanpy/browser -m smoke -q
122
+ --basetemp="${{ runner.temp }}/scanpy-browser"
123
+ - name: Full browser checks
124
+ if: matrix.python == '3.11' && (github.ref == 'refs/heads/main' || inputs.full_scanpy)
125
+ run: >-
126
+ uv run --no-sync pytest tests/integrations/scanpy/browser -q
127
+ --basetemp="${{ runner.temp }}/scanpy-browser"
128
+ - name: Render the workflow notebooks in JupyterLab
129
+ if: matrix.python == '3.11' && (github.ref == 'refs/heads/main' || inputs.full_scanpy)
130
+ run: |
131
+ uv run --no-sync python tools/check_notebook_rendering.py integrations/scanpy/notebooks/scanpy_umap.ipynb --screenshot "${{ runner.temp }}/scanpy-browser/umap-notebook.png"
132
+ uv run --no-sync python tools/check_notebook_rendering.py integrations/scanpy/notebooks/scanpy_expression.ipynb --screenshot "${{ runner.temp }}/scanpy-browser/expression-notebook.png"
133
+ - uses: actions/upload-artifact@v7
134
+ if: always() && matrix.python == '3.11'
135
+ with:
136
+ name: scanpy-browser
137
+ path: ${{ runner.temp }}/scanpy-browser
138
+ if-no-files-found: ignore
139
+
140
+ scanpy-compatibility:
141
+ runs-on: ubuntu-latest
142
+ timeout-minutes: 30
143
+ env:
144
+ MPLBACKEND: Agg
145
+ steps:
146
+ - uses: actions/checkout@v7
147
+ - uses: astral-sh/setup-uv@v9.0.0
148
+ with:
149
+ python-version: "3.12"
150
+ - name: Install current Scanpy separately from the reference environment
151
+ run: |
152
+ uv venv --python 3.12 "$RUNNER_TEMP/scanpy-compat"
153
+ uv pip install --python "$RUNNER_TEMP/scanpy-compat/bin/python" \
154
+ -e '.[scanpy]' 'scanpy==1.12.4' pytest pillow playwright pyarrow
155
+ - name: Fast compatibility checks
156
+ if: github.ref != 'refs/heads/main' && !inputs.full_scanpy
157
+ run: >-
158
+ "$RUNNER_TEMP/scanpy-compat/bin/python" -m pytest
159
+ tests/integrations/scanpy --ignore=tests/integrations/scanpy/browser
160
+ -m "not reference and not workflow" -q --durations=10
161
+ - name: Full compatibility checks
162
+ if: github.ref == 'refs/heads/main' || inputs.full_scanpy
163
+ run: >-
164
+ "$RUNNER_TEMP/scanpy-compat/bin/python" -m pytest
165
+ tests/integrations/scanpy --ignore=tests/integrations/scanpy/browser -q
166
+ - if: github.ref == 'refs/heads/main' || inputs.full_scanpy
167
+ run: '"$RUNNER_TEMP/scanpy-compat/bin/python" -m playwright install --with-deps chromium'
168
+ - name: Check native interactions with current Scanpy
169
+ if: github.ref == 'refs/heads/main' || inputs.full_scanpy
170
+ run: >-
171
+ "$RUNNER_TEMP/scanpy-compat/bin/python" -m pytest
172
+ tests/integrations/scanpy/browser/test_grid_interactions.py::TestGridInteractions
173
+ tests/integrations/scanpy/browser/test_linked_embeddings.py
174
+ -q --basetemp="${{ runner.temp }}/scanpy-compat-browser"
175
+
74
176
  codegen:
75
177
  runs-on: ubuntu-latest
76
178
  steps:
@@ -134,6 +236,16 @@ jobs:
134
236
  "$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
135
237
  notebooks/edit_sequence.ipynb --workflow sequence \
136
238
  --screenshot "$RUNNER_TEMP/edit-sequence.png"
239
+ - name: Verify the agent guide notebook roundtrip
240
+ run: |
241
+ "$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
242
+ docs/agents/embed-api.md --workflow agent-embed \
243
+ --screenshot "$RUNNER_TEMP/agent-embed.png"
244
+ - name: Exercise Python-linked chart widgets
245
+ run: |
246
+ "$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
247
+ notebooks/penguin_python_roundtrip.ipynb --workflow python-rows \
248
+ --screenshot "$RUNNER_TEMP/python-rows.png"
137
249
  - uses: actions/upload-artifact@v7
138
250
  if: always()
139
251
  with:
@@ -31,6 +31,8 @@ jobs:
31
31
  # Example modules that back the gallery need the example runtime
32
32
  # (pandas/numpy) plus the docs toolchain.
33
33
  - run: uv sync --locked --group docs --group dev
34
+ - name: Prepare Scanpy guide data
35
+ run: uv run integrations/scanpy/prepare_guide_data.py
34
36
  # Render real chart screenshots for the gallery cards.
35
37
  - name: Render gallery thumbnails
36
38
  run: |
@@ -23,6 +23,8 @@ concurrency:
23
23
  jobs:
24
24
  check:
25
25
  uses: ./.github/workflows/ci.yml
26
+ with:
27
+ full_scanpy: true
26
28
 
27
29
  build:
28
30
  needs: check
@@ -54,6 +54,11 @@ coverage.xml
54
54
  .pytest_cache/
55
55
  cover/
56
56
 
57
+ # Generated test images stay local or in temporary CI artifacts.
58
+ /tests/**/*.png
59
+ # Scanpy downloads this count dataset on first use; it is never vendored.
60
+ **/data/pbmc3k_raw.h5ad
61
+
57
62
  # Translations
58
63
  *.mo
59
64
  *.pot
@@ -251,3 +256,6 @@ scripts/_fetch_reference.py
251
256
 
252
257
  # Local recording demos and working files
253
258
  /demos/
259
+
260
+ # Generated Scanpy benchmark observations are not reference fixtures.
261
+ tests/integrations/scanpy/fixtures/*performance*.json
@@ -1,6 +1,13 @@
1
1
  repos:
2
+ - repo: local
3
+ hooks:
4
+ - id: no-test-artifacts
5
+ name: keep generated test artifacts out of Git
6
+ language: fail
7
+ entry: Generated test media and benchmark reports belong in temporary directories, not Git.
8
+ files: '(?i)^tests/.*(?:\.(?:png|jpe?g|gif|webp|svg|pdf|mp4|webm|mov|avi|bmp|tiff?|avif|html|h5ad|h5|parquet|arrow|feather|npz|npy|pkl|pickle)|performance[^/]*\.json)$'
2
9
  - repo: https://github.com/astral-sh/ruff-pre-commit
3
- rev: v0.12.0
10
+ rev: v0.15.19
4
11
  hooks:
5
12
  - id: ruff
6
13
  args: [--fix]
@@ -0,0 +1,101 @@
1
+ # Repository instructions
2
+
3
+ `genome-spy-python` wraps GenomeSpy in an idiomatic Python API, as Altair wraps
4
+ Vega-Lite. Users author compatible specs, serialize JSON, and render in notebooks.
5
+ Treat it as a library with a clean public API. Build the reusable Core grammar
6
+ before app-specific concepts. Notebook rendering is first-class; prefer `anywidget`.
7
+
8
+ ## Layout
9
+
10
+ | Path | Purpose |
11
+ | --- | --- |
12
+ | `src/genome_spy/` | Installable library |
13
+ | `src/genome_spy/integrations/<library>/` | Optional integration implementations |
14
+ | `tests/` | pytest suite |
15
+ | `integrations/` | Tracked integration plans and per-library workflow notebooks |
16
+ | `scripts/` | Helpers run via `uv run` |
17
+ | `plans/` | Plans, context, and implementation notes |
18
+ | `material/` | Local reference documents; not committed |
19
+ | `tmp/` | External reference code/repos; not committed |
20
+
21
+ ## Working rules
22
+
23
+ - Think before coding: state assumptions and tradeoffs; push back when warranted.
24
+ - Apply YAGNI and the [Ponytail rules](https://github.com/DietrichGebert/ponytail/blob/main/.agents/rules/ponytail.md):
25
+ complete the task with the least new code. Avoid unrequested features,
26
+ wrappers, conversions, options, and speculative abstractions. If 200 lines
27
+ could be 50, rewrite them.
28
+ - Prefer existing repository code, then standard-library/platform features,
29
+ then installed dependencies, then minimal new code. Do not add a dependency
30
+ for a few lines of functionality.
31
+ - Before editing, trace affected callers, tests, fixtures, configuration, and
32
+ exports. Fix shared root causes once and complete every affected part.
33
+ - Make surgical changes: match existing style, remove imports/variables orphaned
34
+ by your edits, preserve existing layers and native value forms, and leave
35
+ unrelated code alone. Keep validation and error handling when moving code.
36
+ - Prefer equally small solutions that handle edge cases. Preserve security,
37
+ accessibility, trust-boundary checks, and required hardware calibration.
38
+ - Keep comments to one-line explanations of why. Document deliberate shortcuts
39
+ as `shortcut: <the limit>, <when to upgrade>`.
40
+ - Set verifiable goals and give a brief plan for multi-step work.
41
+ - When work requires an upstream GenomeSpy PR, use
42
+ [contribute-genomespy](.agents/skills/contribute-genomespy/SKILL.md).
43
+ - Keep core logic pure Python; isolate I/O and integration at the edges.
44
+ - Follow the linked [language, docstring, formatting, and gallery standards](docs/contributing/standards.md).
45
+ Read the relevant sections before Python or gallery edits; they are requirements.
46
+
47
+ ## Testing and handoff
48
+
49
+ Use pytest. Add or update tests for behavior changes, with fixed seeds for random
50
+ behavior. Keep tests small and focused on one behavior. Apply the "Suspicious
51
+ Check": tighten any test that could pass for the wrong reason.
52
+
53
+ Never commit or push generated test artifacts, including reference images,
54
+ screenshots, overlays, recordings and chart exports. Generate them in temporary
55
+ directories or ignored local caches; track test source, generators and deliberate
56
+ text fixtures. Keep committed notebooks free of execution outputs and widget
57
+ state. Check outgoing commit history before pushing: deleting artifacts from the
58
+ current tree does not remove old blobs.
59
+
60
+ Use `uv` for environments and dependencies. Before handoff, run targeted tests for
61
+ changed behavior and lint. Format before finalizing non-trivial edits; type-check
62
+ when public Python code changes. End the handoff with any skipped or unvalidated
63
+ work and material risks.
64
+ Ruff is the formatting/lint authority; fix issues rather than suppressing them by
65
+ default.
66
+
67
+ | Task | Command |
68
+ | --- | --- |
69
+ | Sync environment | `uv sync --dev` |
70
+ | Run tests | `uv run pytest tests/ -x` |
71
+ | Lint | `uv run ruff check .` |
72
+ | Format | `uv run ruff format .` |
73
+ | Type-check | `uv run mypy src/` |
74
+ | Install hooks | `uv run pre-commit install` |
75
+
76
+ Make small, thematic commits. Use conventional commits:
77
+ `<type>(<scope>): <description>` when a scope helps. Do not rewrite history unless
78
+ explicitly asked.
79
+
80
+ ## Plans and references
81
+
82
+ | Document | Read when |
83
+ | --- | --- |
84
+ | `integrations/README.md` | Integration layout, plan lifecycle, and clearance rules |
85
+ | `integrations/<library>/STATUS.md` | Current implementation, next slice, blockers, and retained evidence |
86
+ | `integrations/<library>/PLAN.md` | Planning or extending a library integration; update status with implementation |
87
+ | `plans/` | Optional ignored local context; may be absent. Tracked integration plans and status own current scope and delivery. |
88
+
89
+ ## GitHub review evidence
90
+
91
+ - For PR/issue screenshots and recordings, use the authenticated GitHub CLI's
92
+ native `--attach` support; it does not require a browser login. Check
93
+ `gh pr comment --help` before assuming the installed CLI supports uploads.
94
+ - The default `gh` on this machine is older. A working official CLI is cached at
95
+ `tmp/github-cli-2.103.2/gh_2.103.2_macOS_arm64/bin/gh` in this repository. Use
96
+ that binary when present, or a newer official CLI with `--attach` support.
97
+ - Write multiline comment text to a temporary file, then run the capable binary:
98
+ `gh pr comment NUMBER --repo OWNER/REPO --body-file /private/tmp/comment.md --attach /absolute/demo.webm`.
99
+ The upload becomes a playable GitHub attachment. Verify the posted comment
100
+ contains its `github.com/user-attachments/assets/` URL. Keep media out of Git,
101
+ reuse configured CLI authentication, and never print tokens.
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.8.0] - 2026-10-29
9
+
10
+ ### Added
11
+
12
+ - Optional Scanpy plotting integration through
13
+ `import genome_spy.integrations.scanpy as gsc`, preserving supported plotting
14
+ names and arguments while Scanpy continues to own analysis.
15
+ - Interactive embeddings, PCA diagnostics, dotplots, matrixplots, heatmaps,
16
+ clustermaps, expression tracks, ranked-gene summaries, quality checks,
17
+ time-series, DPT and PAGA plots. Unsupported plots and options fail explicitly.
18
+ - `EmbeddingSummary` for linked cell selections, expression summaries,
19
+ histograms and marker tracks, with optional cell counts and selection retrieval
20
+ in Python.
21
+ - Scanpy guides with live examples, downloadable notebooks, installation and
22
+ export instructions, and documented coverage limits.
23
+
24
+ ### Changed
25
+
26
+ - Support Scanpy >=1.11.5,<1.13, tested with 1.11.5 and 1.12.4, while keeping
27
+ the reference environment pinned independently.
28
+
29
+ ### Fixed
30
+
31
+ - Follow Scanpy 1.12's swapped-dotplot scaling and report its unavailable
32
+ automatic PAGA tree layouts without substituting another layout.
33
+
8
34
  ## [0.7.0] - 2026-10-20
9
35
 
10
36
  ### Added
@@ -181,6 +207,7 @@ First public alpha release, targeting GenomeSpy Core 0.87.0.
181
207
  - Packaged example datasets, documentation, tutorials, and an interactive
182
208
  visualization gallery.
183
209
 
210
+ [0.8.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.7.0...v0.8.0
184
211
  [0.7.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.6.0...v0.7.0
185
212
  [0.6.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.5.0...v0.6.0
186
213
  [0.5.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.4.0...v0.5.0
@@ -0,0 +1,30 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2025 scverse
4
+ Copyright (c) 2017 F. Alexander Wolf, P. Angerer, Theis Lab
5
+ All rights reserved.
6
+
7
+ Redistribution and use in source and binary forms, with or without
8
+ modification, are permitted provided that the following conditions are met:
9
+
10
+ * Redistributions of source code must retain the above copyright notice, this
11
+ list of conditions and the following disclaimer.
12
+
13
+ * Redistributions in binary form must reproduce the above copyright notice,
14
+ this list of conditions and the following disclaimer in the documentation
15
+ and/or other materials provided with the distribution.
16
+
17
+ * Neither the name of the copyright holder nor the names of its
18
+ contributors may be used to endorse or promote products derived from
19
+ this software without specific prior written permission.
20
+
21
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
25
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: genome-spy-python
3
- Version: 0.7.0
3
+ Version: 0.8.0
4
4
  Summary: genome-spy-python is a declarative genomics visualization library for Python, built on top of the genome-spy JSON specification.
5
5
  Project-URL: Homepage, https://github.com/genome-spy/genome-spy-python
6
6
  Project-URL: Documentation, https://genomespy.app/genome-spy-python/
@@ -16,6 +16,7 @@ License-File: LICENSES/CC0-1.0.txt
16
16
  License-File: LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt
17
17
  License-File: LICENSES/GENOMESPY-MIT.txt
18
18
  License-File: LICENSES/LATO-OFL-1.1.txt
19
+ License-File: LICENSES/SCANPY-BSD-3-Clause.txt
19
20
  License-File: LICENSES/VEGA-BSD-3-Clause.txt
20
21
  License-File: LICENSES/VEGA-LITE-BSD-3-Clause.txt
21
22
  License-File: THIRD_PARTY_NOTICES.md
@@ -37,6 +38,8 @@ Provides-Extra: anndata
37
38
  Requires-Dist: anndata>=0.11.0; extra == 'anndata'
38
39
  Provides-Extra: arrow
39
40
  Requires-Dist: pyarrow>=18.0.0; extra == 'arrow'
41
+ Provides-Extra: scanpy
42
+ Requires-Dist: scanpy[paga]<1.13,>=1.11.5; extra == 'scanpy'
40
43
  Description-Content-Type: text/markdown
41
44
 
42
45
  <p align="center">
@@ -71,6 +74,13 @@ The project is under active development. The current focus is the reusable
71
74
  GenomeSpy Core grammar and notebook rendering; GenomeSpy App-specific features
72
75
  will come later.
73
76
 
77
+ Optional library integrations keep upstream analysis workflows and replace
78
+ supported plotting calls. The [integration workspace](integrations/README.md)
79
+ links each implementation, tracked plan, workflow notebooks, tests, and user guide.
80
+ The Scanpy integration is implemented in
81
+ [`src/genome_spy/integrations/scanpy/`](src/genome_spy/integrations/scanpy/), exposed as
82
+ `import genome_spy.integrations.scanpy as gsc` and `gsc.pl.umap(...)`.
83
+
74
84
  ## Installation
75
85
 
76
86
  The package requires Python 3.11 or newer.
@@ -81,6 +91,12 @@ From PyPI:
81
91
  pip install genome-spy-python
82
92
  ```
83
93
 
94
+ For Scanpy plotting:
95
+
96
+ ```bash
97
+ pip install --upgrade 'genome-spy-python[scanpy]'
98
+ ```
99
+
84
100
  From source:
85
101
 
86
102
  ```bash
@@ -30,6 +30,13 @@ The project is under active development. The current focus is the reusable
30
30
  GenomeSpy Core grammar and notebook rendering; GenomeSpy App-specific features
31
31
  will come later.
32
32
 
33
+ Optional library integrations keep upstream analysis workflows and replace
34
+ supported plotting calls. The [integration workspace](integrations/README.md)
35
+ links each implementation, tracked plan, workflow notebooks, tests, and user guide.
36
+ The Scanpy integration is implemented in
37
+ [`src/genome_spy/integrations/scanpy/`](src/genome_spy/integrations/scanpy/), exposed as
38
+ `import genome_spy.integrations.scanpy as gsc` and `gsc.pl.umap(...)`.
39
+
33
40
  ## Installation
34
41
 
35
42
  The package requires Python 3.11 or newer.
@@ -40,6 +47,12 @@ From PyPI:
40
47
  pip install genome-spy-python
41
48
  ```
42
49
 
50
+ For Scanpy plotting:
51
+
52
+ ```bash
53
+ pip install --upgrade 'genome-spy-python[scanpy]'
54
+ ```
55
+
43
56
  From source:
44
57
 
45
58
  ```bash
@@ -108,6 +108,13 @@ selection, formatting and example contributions.
108
108
 
109
109
  ## PBMC marker expression
110
110
 
111
+ The Scanpy documentation also displays `scanpy.datasets.pbmc68k_reduced()` from
112
+ Scanpy 1.11.5. This packaged subset contains 700 cells from the
113
+ [10x Genomics PBMC68k dataset](https://www.10xgenomics.com/datasets/fresh-68-k-pbm-cs-donor-a-1-standard-1-1-0),
114
+ licensed CC BY 4.0. Credit 10x Genomics and Scanpy's preprocessing contributors;
115
+ the examples retain the supplied UMAP coordinates, expression and annotations.
116
+ The source H5AD is loaded from Scanpy and is not vendored in this repository.
117
+
111
118
  `pbmc_markers.json.gz` contains selected markers from 2,638 cells in Scanpy's processed
112
119
  PBMC3k fixture, obtained from [cellxgene revision
113
120
  68dfbcc](https://github.com/chanzuckerberg/cellxgene/blob/68dfbcc2eb675e96c6a5e2a6b7a0d3465ccf46bc/example-dataset/pbmc3k.h5ad).
@@ -119,6 +126,48 @@ Euclidean group tree, and plotting coordinates. `tools/prepare_pbmc_gallery_data
119
126
  the source checksum is retained in the bundle. The CC BY 4.0 text is in
120
127
  `LICENSES/CC-BY-4.0.txt`.
121
128
 
129
+ The Scanpy data-check guide uses the full raw PBMC3k counts loaded through
130
+ `scanpy.datasets.pbmc3k()` (2,700 cells × 32,738 genes). Scanpy prepares the
131
+ normalization, variable-gene statistics and Scrublet results explicitly.
132
+
133
+ ## Expression Atlas ovarian cortex example
134
+
135
+ The UMAP guide uses the public [E-MTAB-8381 study](https://www.ebi.ac.uk/gxa/sc/experiments/E-MTAB-8381)
136
+ from EMBL-EBI Single Cell Expression Atlas: 36,785 cells × 23,772 genes in the
137
+ download accessed on 27 October 2026. Credit Wagner, Yoshihara, Douagi et al.,
138
+ [Single-cell analysis of human ovarian cortex identifies distinct cell populations
139
+ but no oogonial stem cells](https://doi.org/10.1038/s41467-020-14936-3),
140
+ Nature Communications 11, 1147 (2020), and the Atlas contributors.
141
+ The publication is CC BY 4.0; the public Atlas download is provided under the
142
+ [EMBL-EBI terms of use](https://www.ebi.ac.uk/about/terms-of-use/), which impose
143
+ no additional restrictions beyond those of the data owner and require attribution.
144
+
145
+ Scanpy loads the study, normalizes/log-transforms counts, selects 2,000 variable
146
+ genes for PCA, and computes neighbors and UMAP with seed 0. All Atlas cells are
147
+ retained. The chart shows normalized VWF expression (ENSG00000110799), with the
148
+ color range capped at the 99th percentile. This plotting example does not
149
+ reproduce the paper's filtering, integration or biological analysis. Downloads and
150
+ prepared H5AD files stay in ignored caches; no dataset is added to Git.
151
+
152
+ ## Scanpy simulation examples
153
+
154
+ The profiles guide displays Scanpy 1.11.5's packaged `krumsiek11()` simulation
155
+ (640 samples × 11 genes, four runs of 160 samples), based on
156
+ [Krumsiek et al. (2011)](https://doi.org/10.1371/journal.pone.0022649).
157
+ Credit the model authors and Scanpy's simulation contributors. The stored
158
+ simulation is loaded without rerunning it; five genes are shown. Sample names
159
+ are made unique and integer highlight keys are stored as strings for H5AD,
160
+ without changing values or row order. Scanpy explicitly prepares neighbors,
161
+ diffusion components and DPT annotations for the later examples.
162
+ The source table is supplied by Scanpy and is not vendored here. Its repository's
163
+ copyright notice and BSD-3-Clause terms are retained in
164
+ `LICENSES/SCANPY-BSD-3-Clause.txt`, including in the published documentation.
165
+
166
+ The PAGA guide reuses the PBMC68k subset credited above. Scanpy explicitly
167
+ prepares PAGA, graph positions and pseudotime; supplied UMAP coordinates and
168
+ expression snapshots are retained. No new biological trajectory is claimed
169
+ by the example's chosen group order.
170
+
122
171
  ## Bundled TCGA example tables
123
172
 
124
173
  | Files | Source and processing |