genome-spy-python 0.7.0__tar.gz → 0.8.1__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.
- genome_spy_python-0.8.1/.agents/skills/contribute-genomespy/SKILL.md +21 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.github/workflows/ci.yml +121 -7
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.github/workflows/docs.yml +2 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.github/workflows/release.yml +2 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.gitignore +8 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.pre-commit-config.yaml +8 -1
- genome_spy_python-0.8.1/AGENTS.md +101 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/CHANGELOG.md +35 -0
- genome_spy_python-0.8.1/LICENSES/SCANPY-BSD-3-Clause.txt +30 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/PKG-INFO +17 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/README.md +13 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/THIRD_PARTY_NOTICES.md +49 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_gallery.py +3 -1
- genome_spy_python-0.8.1/docs/_ext/genomespy_notebook.py +172 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/genomespy.css +5 -0
- genome_spy_python-0.8.1/docs/agents/embed-api.md +238 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/encodings.md +54 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/manifest.json +34 -2
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/quickstart.md +2 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/rendering.md +2 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/conf.py +1 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/contributing/standards.md +3 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/clustered_heatmap.md +5 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/clustered_heatmap.py +5 -3
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/index.md +1 -0
- genome_spy_python-0.8.1/docs/integrations/index.md +14 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/api.md +19 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/export.md +5 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/expression.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/index.md +65 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/linked_expression.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/paga.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/pca.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/profiles.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/quality.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/ranked.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/supported.md +75 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/tracks.md +2 -0
- genome_spy_python-0.8.1/docs/integrations/scanpy/umap.md +2 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/composition.py +44 -36
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/composition.md +47 -45
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/embed-api.md +3 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/index.md +2 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/notebooks.md +11 -0
- genome_spy_python-0.8.1/integrations/README.md +101 -0
- genome_spy_python-0.8.1/integrations/scanpy/COMPATIBILITY.md +2023 -0
- genome_spy_python-0.8.1/integrations/scanpy/FUTURE.md +55 -0
- genome_spy_python-0.8.1/integrations/scanpy/PLAN.md +1896 -0
- genome_spy_python-0.8.1/integrations/scanpy/README.md +267 -0
- genome_spy_python-0.8.1/integrations/scanpy/STATUS.md +487 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/export.ipynb +184 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/expression.ipynb +447 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/linked_expression.ipynb +317 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/paga.ipynb +468 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/pca.ipynb +158 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/profiles.ipynb +436 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/quality.ipynb +234 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/ranked.ipynb +338 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/tracks.ipynb +246 -0
- genome_spy_python-0.8.1/integrations/scanpy/guides/umap.ipynb +790 -0
- genome_spy_python-0.8.1/integrations/scanpy/notebooks/scanpy_expression.ipynb +1618 -0
- genome_spy_python-0.8.1/integrations/scanpy/notebooks/scanpy_umap.ipynb +793 -0
- genome_spy_python-0.8.1/integrations/scanpy/prepare_guide_data.py +96 -0
- genome_spy_python-0.8.1/notebooks/penguin_python_roundtrip.ipynb +291 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/pyproject.toml +34 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/SKILL.md +3 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/__init__.py +1 -1
- genome_spy_python-0.8.1/src/genome_spy/integrations/__init__.py +3 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/__init__.py +10 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_data.py +151 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_dendrogram_chart.py +217 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_dendrogram_data.py +252 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/chart.py +553 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/data.py +551 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/density_data.py +209 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/interactions.py +160 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/scatter_data.py +427 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/selection.py +108 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/summary_builder.py +649 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/summary_chart.py +590 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding/summary_data.py +81 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/clustermap_chart.py +334 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/clustermap_data.py +247 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/colors.py +38 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/correlation_chart.py +162 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/dotplot_builder.py +368 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/dotplot_chart.py +298 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/grouped_builder.py +202 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/grouped_chart.py +570 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/grouped_data.py +549 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/heatmap_chart.py +345 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/matrix_chart.py +460 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/matrixplot_builder.py +301 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/matrixplot_chart.py +148 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/tracksplot_chart.py +277 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_grid_interactions.py +296 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_guards.py +95 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_labels.py +63 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_paga/__init__.py +0 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_paga/chart.py +523 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_paga/data.py +393 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_paga/path_chart.py +471 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_paga/path_data.py +188 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_qc/__init__.py +0 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_qc/highest_expr_chart.py +138 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_qc/highest_expr_data.py +102 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_qc/hvg_chart.py +222 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_qc/scrublet_chart.py +189 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_qc/scrublet_data.py +97 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_ranking/__init__.py +0 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_ranking/chart.py +103 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_ranking/data.py +455 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_style.py +599 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_timeseries/__init__.py +0 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_timeseries/chart.py +353 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_timeseries/data.py +292 -0
- genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/pl.py +4512 -0
- genome_spy_python-0.8.1/src/genome_spy/py.typed +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/static/widget.js +3 -0
- genome_spy_python-0.8.1/tests/__init__.py +0 -0
- genome_spy_python-0.8.1/tests/browser/__init__.py +1 -0
- genome_spy_python-0.8.1/tests/browser/test_docs_composition.py +165 -0
- genome_spy_python-0.8.1/tests/browser/test_docs_linked_expression.py +507 -0
- genome_spy_python-0.8.1/tests/browser/test_docs_notebook.py +790 -0
- genome_spy_python-0.8.1/tests/browser/test_offline_rendering.py +102 -0
- genome_spy_python-0.8.1/tests/browser/test_widget_sizing.py +216 -0
- genome_spy_python-0.8.1/tests/integrations/__init__.py +1 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/__init__.py +1 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/__init__.py +1 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/conftest.py +64 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/interactions.py +169 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/references.py +410 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/rendering.py +145 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_dendrogram.py +565 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_dpt.py +448 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_embedding_style.py +778 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_embeddings.py +795 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_grid_interactions.py +851 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_grouped_builders.py +191 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_grouped_expression.py +808 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_heatmaps.py +1452 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_linked_embeddings.py +1085 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_paga.py +764 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_paga_adjacency.py +430 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_paga_path.py +533 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_pca.py +173 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_profiles.py +1163 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_qc.py +584 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/browser/test_ranked.py +413 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/embedding_fixtures.py +288 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/expression_fixtures.py +337 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/README.md +19 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/api.json +505 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/clustermap.json +1387 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/dendrogram.json +2384 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/dotplot.json +1146 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/embedding.json +634 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/grouped.json +1735 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/heatmap.json +1353 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/matrix.json +303 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/matrixplot.json +1622 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/ranked.json +891 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/scatter.json +500 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/fixtures/umap.json +1114 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/grid_fixture_support.py +55 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/helpers.py +120 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/paga_fixtures.py +304 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/profile_fixtures.py +215 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/qc_fixtures.py +82 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/ranked_fixture.py +85 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_contract.py +419 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_dendrogram.py +502 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_dpt.py +404 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_embedding_style.py +1063 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_embeddings.py +1458 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_grid_interactions.py +327 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_grouped_builders.py +575 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_grouped_expression.py +1016 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_heatmaps.py +1167 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_linked_embeddings.py +774 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_notebooks.py +136 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_paga.py +1002 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_paga_adjacency.py +327 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_paga_path.py +582 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_pca.py +464 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_profiles.py +707 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_qc.py +776 -0
- genome_spy_python-0.8.1/tests/integrations/scanpy/test_ranked.py +741 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_agent_docs.py +44 -12
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_chart.py +1 -1
- genome_spy_python-0.8.1/tests/test_distribution.py +81 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_docs_gallery.py +11 -0
- genome_spy_python-0.8.1/tests/test_docs_linked_expression.py +58 -0
- genome_spy_python-0.8.1/tests/test_docs_notebook.py +731 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_docs_tutorial.py +29 -14
- genome_spy_python-0.8.1/tests/test_scanpy_imports.py +56 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_upstream_surround_gallery.py +7 -1
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_workflow_notebooks.py +30 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/widget.test.mjs +17 -2
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/agent_docs.py +49 -9
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/check_notebook_rendering.py +334 -14
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/docs_gallery.py +2 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/uv.lock +1058 -441
- genome_spy_python-0.7.0/AGENTS.md +0 -65
- genome_spy_python-0.7.0/tests/browser/test_offline_rendering.py +0 -52
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.agents/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.claude/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.gitattributes +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/.python-version +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/CLAUDE.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/CONTRIBUTING.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSE +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/CC-BY-4.0.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/CC0-1.0.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/GENOMESPY-MIT.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/LATO-OFL-1.1.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_agents.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/data/README.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/external-links.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/airway_ma_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/airway_volcano_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ascat_copy_number.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ascat_fitting.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bam_read_alignments.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bam_read_pileup.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/clinvar_variants.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/clustered_heatmap.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/composing_genome_browser.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/copy_number.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/coverage_pileup.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/cytobands.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/diverging_bars.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/dynseq_bqtl.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/genome_tracks.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/geometric_zoom.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/heatmap_with_text.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/independent_scales.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/layered_lollipop.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/link_mark.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/luad_oncoprint.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/manhattan_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/needle_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/oncoprint.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_umap.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_umap_genes.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/penguin_brush.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pisa_squid.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/point_mark.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/point_styles.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rainfall_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ranged_rule.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rect_heatmap.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/refseq_scored_genes.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/sashimi_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/scrollable_viewport.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/sequence_logo.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/six_frame_translation.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/stacked_bar.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/stacked_genome_browser.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/tsne.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/upset_mutations.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/vertical_concat.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/gallery/volcano_plot.png +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/readme-manhattan.webp +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/readme-sequence-logo.webp +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/showcase.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/snaketie.svg +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/workflows.css +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_static/workflows.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_templates/autosummary/class.rst +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_templates/autosummary/class_own_members.rst +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_templates/base.html +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/_templates/components/view-this-page.html +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/about.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/data.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/scales-axes-legends.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/agents/skill-distribution.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/api.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/datasets.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/airway_ma_plot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/airway_ma_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/airway_volcano_plot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/airway_volcano_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/ascat_copy_number.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/ascat_copy_number.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/ascat_fitting.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/ascat_fitting.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_alignments.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_alignments.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_pileup.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_pileup.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/bigbed_ccre_track.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/brush_linked_genome_tracks.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/brush_linked_genome_tracks.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/clinvar_variants.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/clinvar_variants.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/combined_laml_oncoplot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/combined_laml_oncoplot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/composing_genome_browser.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/composing_genome_browser.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/copy_number.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/coverage_pileup.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/coverage_pileup.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/cytobands.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/cytobands.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/diverging_bars.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/diverging_bars.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_adaptive_bqtl.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_bqtl.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_bqtl.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/genome_tracks.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/geometric_zoom.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/geometric_zoom.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/gff3_gene_annotations.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/gff3_gene_annotations.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/hcc1954_sv_cnv.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/hcc1954_sv_cnv.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/heatmap_with_text.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/heatmap_with_text.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/independent_scales.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/independent_scales.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/indexed_fasta_sequence.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/layered_lollipop.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/layered_lollipop.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/link_mark.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/luad_oncoprint.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/luad_oncoprint.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/manhattan_plot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/manhattan_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/multiple_sequence_alignment.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/multiple_sequence_alignment.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/needle_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/oncoprint.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/oncoprint.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/p53_sequence_comparison.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/p53_sequence_comparison.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_cell_heatmap.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_cell_heatmap.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_expression_tracks.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_expression_tracks.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_marker_matrix.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_marker_matrix.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap_genes.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap_genes.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/penguin_brush.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/penguin_brush.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pik3ca_tcga_brca_lollipop.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pisa_interaction_matrix.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pisa_interaction_matrix.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pisa_squid.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/pisa_squid.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/point_mark.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/point_mark.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/point_styles.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/point_styles.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/rainfall_plot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/rainfall_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/ranged_rule.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/rect_heatmap.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/rect_heatmap.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/refseq_scored_genes.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/refseq_scored_genes.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/rnf7_direct_rna.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/rnf7_direct_rna.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/sashimi_plot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/sashimi_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/scrollable_viewport.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/sequence_logo.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/six_frame_translation.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/six_frame_translation.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/stacked_bar.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/stacked_bar.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/stacked_genome_browser.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/tcga_ov_gistic.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/tcga_ov_gistic.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/tsne.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/tsne.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/upset_mutations.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/upset_mutations.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/vertical_concat.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/vertical_concat.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/volcano_plot.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/examples/volcano_plot.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/getting-started.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/integration/component.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/integration/index.html +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/integration/notebook.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/integration/server.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/annotations.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/charts_and_marks.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/configuration.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/data_inputs.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/display_controls.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/encoding_channels.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/expressions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/genome_browser_layouts.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/genomic_coordinates.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/genomic_data.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/getting_started.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/importing_specifications.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/interaction.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/notebooks.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/scales_and_guides.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/serialization.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/tutorials/transforms.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/annotations.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/charts.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/configuration.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/connect-python.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/data.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/display-controls.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/encodings.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/expressions.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/genome-browser-layouts.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/genomic-axes.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/genomic-data.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/importing-specifications.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/interaction.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/scales-axes-legends.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/serialization.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/transforms.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/using-charts.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/annotate-intervals.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/edit-sequence.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/index.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/pick-genes.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/select-genes.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/notebooks/annotate_genomic_intervals.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/notebooks/edit_sequence.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/notebooks/embed_api.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/notebooks/pick_genes.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/notebooks/select_genes.ipynb +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/agents/openai.yaml +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/references/grouped-charts.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/references/table-chart.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_chart_authoring.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_conditions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_embed.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_expressions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_parameters.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_render.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_skill_install.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_utils.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/_widget.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/anndata.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/api.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/arrow.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/channels.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/chart.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/data.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/data_transformers.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/__init__.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_airway.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_annotations.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_direct_rna.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_gistic.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_grammar.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_hapmap.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_mutation.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_oncoprint.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_pbmc.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga.tsv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/embed.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/helpers.py +0 -0
- {genome_spy_python-0.7.0/tests → genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_embedding}/__init__.py +0 -0
- /genome_spy_python-0.7.0/src/genome_spy/py.typed → /genome_spy_python-0.8.1/src/genome_spy/integrations/scanpy/_expression/__init__.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/jupyter.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/__init__.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/_kwds.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/_typing.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/capabilities.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/channels.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/composition.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/core.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/ergonomics.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/expressions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/genome-spy-schema.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/lazy.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/mixins.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/schemapi.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/static/controls.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/static/embed-bridge.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/static/genome-spy.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/src/genome_spy/static/inspector.js +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/browser/test_core_upgrade.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_theme.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_workflows.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/browser/test_embed_api.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/browser/test_python_web_example.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/embed-bridge.test.mjs +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/README.md +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/clustered-heatmap.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/upsetr-mutations.json +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_anndata.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_arrow.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_combined_gallery_data.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_conditions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_data_transformers.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_datasets.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_docs_api_reference.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_embed.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_embed_notebook.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_expressions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_generated_schema_package.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_generated_transform_methods.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_javascript_assets.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_licensing.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_new_compositions.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_pbmc_gallery.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_pisa_gallery.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_python_connection_example.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_render_thumbnails.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_rnf7_direct_rna_example.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_schema_codegen.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_skill_install.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tests/test_widget.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/agent_markdown.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/docs_workflows.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/generate_api_docs.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/generate_schema_wrapper.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/prepare_airway_review.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/prepare_combined_gallery_data.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/prepare_pbmc_gallery_data.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/prepare_refseq_gene_annotations.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/render_thumbnails.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/schemapi/__init__.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/schemapi/codegen.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/tools/schemapi/expression_codegen.py +0 -0
- {genome_spy_python-0.7.0 → genome_spy_python-0.8.1}/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,96 @@ 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
|
+
# Run notebooks first so rendering failures surface before the long suites.
|
|
105
|
+
- if: matrix.python == '3.11'
|
|
106
|
+
run: uv run --no-sync python -m playwright install --with-deps chromium
|
|
107
|
+
- name: Render the workflow notebooks in JupyterLab
|
|
108
|
+
if: matrix.python == '3.11' && (github.ref == 'refs/heads/main' || inputs.full_scanpy)
|
|
109
|
+
run: |
|
|
110
|
+
uv run --no-sync python tools/check_notebook_rendering.py integrations/scanpy/notebooks/scanpy_umap.ipynb --screenshot "${{ runner.temp }}/scanpy-notebooks/umap-notebook.png"
|
|
111
|
+
uv run --no-sync python tools/check_notebook_rendering.py integrations/scanpy/notebooks/scanpy_expression.ipynb --screenshot "${{ runner.temp }}/scanpy-notebooks/expression-notebook.png"
|
|
112
|
+
- name: Fast Scanpy checks
|
|
113
|
+
if: github.ref != 'refs/heads/main' && !inputs.full_scanpy
|
|
114
|
+
run: >-
|
|
115
|
+
uv run --no-sync pytest tests/integrations/scanpy
|
|
116
|
+
--ignore=tests/integrations/scanpy/browser
|
|
117
|
+
-m "not reference and not workflow" -q --durations=10
|
|
118
|
+
- name: Full Scanpy checks
|
|
119
|
+
if: github.ref == 'refs/heads/main' || inputs.full_scanpy
|
|
120
|
+
run: >-
|
|
121
|
+
uv run --no-sync pytest tests/integrations/scanpy
|
|
122
|
+
--ignore=tests/integrations/scanpy/browser -q --durations=10
|
|
123
|
+
- name: Browser smoke 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 -m smoke -q
|
|
127
|
+
--basetemp="${{ runner.temp }}/scanpy-browser"
|
|
128
|
+
- name: Full browser checks
|
|
129
|
+
if: matrix.python == '3.11' && (github.ref == 'refs/heads/main' || inputs.full_scanpy)
|
|
130
|
+
run: >-
|
|
131
|
+
uv run --no-sync pytest tests/integrations/scanpy/browser -q
|
|
132
|
+
--basetemp="${{ runner.temp }}/scanpy-browser"
|
|
133
|
+
- uses: actions/upload-artifact@v7
|
|
134
|
+
if: always() && matrix.python == '3.11'
|
|
135
|
+
with:
|
|
136
|
+
name: scanpy-browser
|
|
137
|
+
path: |
|
|
138
|
+
${{ runner.temp }}/scanpy-browser
|
|
139
|
+
${{ runner.temp }}/scanpy-notebooks
|
|
140
|
+
if-no-files-found: ignore
|
|
141
|
+
|
|
142
|
+
scanpy-compatibility:
|
|
143
|
+
runs-on: ubuntu-latest
|
|
144
|
+
timeout-minutes: 30
|
|
145
|
+
env:
|
|
146
|
+
MPLBACKEND: Agg
|
|
147
|
+
steps:
|
|
148
|
+
- uses: actions/checkout@v7
|
|
149
|
+
- uses: astral-sh/setup-uv@v9.0.0
|
|
150
|
+
with:
|
|
151
|
+
python-version: "3.12"
|
|
152
|
+
- name: Install current Scanpy separately from the reference environment
|
|
153
|
+
run: |
|
|
154
|
+
uv venv --python 3.12 "$RUNNER_TEMP/scanpy-compat"
|
|
155
|
+
uv pip install --python "$RUNNER_TEMP/scanpy-compat/bin/python" \
|
|
156
|
+
-e '.[scanpy]' 'scanpy==1.12.4' pytest pillow playwright pyarrow
|
|
157
|
+
- name: Fast compatibility checks
|
|
158
|
+
if: github.ref != 'refs/heads/main' && !inputs.full_scanpy
|
|
159
|
+
run: >-
|
|
160
|
+
"$RUNNER_TEMP/scanpy-compat/bin/python" -m pytest
|
|
161
|
+
tests/integrations/scanpy --ignore=tests/integrations/scanpy/browser
|
|
162
|
+
-m "not reference and not workflow" -q --durations=10
|
|
163
|
+
- name: Full compatibility checks
|
|
164
|
+
if: github.ref == 'refs/heads/main' || inputs.full_scanpy
|
|
165
|
+
run: >-
|
|
166
|
+
"$RUNNER_TEMP/scanpy-compat/bin/python" -m pytest
|
|
167
|
+
tests/integrations/scanpy --ignore=tests/integrations/scanpy/browser -q
|
|
168
|
+
- if: github.ref == 'refs/heads/main' || inputs.full_scanpy
|
|
169
|
+
run: '"$RUNNER_TEMP/scanpy-compat/bin/python" -m playwright install --with-deps chromium'
|
|
170
|
+
- name: Check native interactions with current Scanpy
|
|
171
|
+
if: github.ref == 'refs/heads/main' || inputs.full_scanpy
|
|
172
|
+
run: >-
|
|
173
|
+
"$RUNNER_TEMP/scanpy-compat/bin/python" -m pytest
|
|
174
|
+
tests/integrations/scanpy/browser/test_grid_interactions.py::TestGridInteractions
|
|
175
|
+
tests/integrations/scanpy/browser/test_linked_embeddings.py
|
|
176
|
+
-q --basetemp="${{ runner.temp }}/scanpy-compat-browser"
|
|
177
|
+
|
|
74
178
|
codegen:
|
|
75
179
|
runs-on: ubuntu-latest
|
|
76
180
|
steps:
|
|
@@ -134,15 +238,25 @@ jobs:
|
|
|
134
238
|
"$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
|
|
135
239
|
notebooks/edit_sequence.ipynb --workflow sequence \
|
|
136
240
|
--screenshot "$RUNNER_TEMP/edit-sequence.png"
|
|
241
|
+
- name: Verify the agent guide notebook roundtrip
|
|
242
|
+
run: |
|
|
243
|
+
"$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
|
|
244
|
+
docs/agents/embed-api.md --workflow agent-embed \
|
|
245
|
+
--screenshot "$RUNNER_TEMP/agent-embed.png"
|
|
246
|
+
- name: Exercise Python-linked chart widgets
|
|
247
|
+
run: |
|
|
248
|
+
"$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
|
|
249
|
+
notebooks/penguin_python_roundtrip.ipynb --workflow python-rows \
|
|
250
|
+
--screenshot "$RUNNER_TEMP/python-rows.png"
|
|
137
251
|
- uses: actions/upload-artifact@v7
|
|
138
252
|
if: always()
|
|
139
253
|
with:
|
|
140
254
|
name: notebook-rendering
|
|
141
255
|
path: |
|
|
142
|
-
${{ runner.temp }}/notebook-rendering
|
|
143
|
-
${{ runner.temp }}/embed-api
|
|
144
|
-
${{ runner.temp }}/annotate-intervals
|
|
145
|
-
${{ runner.temp }}/select-genes
|
|
146
|
-
${{ runner.temp }}/pick-genes
|
|
147
|
-
${{ runner.temp }}/edit-sequence
|
|
256
|
+
${{ runner.temp }}/notebook-rendering.*
|
|
257
|
+
${{ runner.temp }}/embed-api.*
|
|
258
|
+
${{ runner.temp }}/annotate-intervals.*
|
|
259
|
+
${{ runner.temp }}/select-genes.*
|
|
260
|
+
${{ runner.temp }}/pick-genes.*
|
|
261
|
+
${{ runner.temp }}/edit-sequence.*
|
|
148
262
|
if-no-files-found: ignore
|
|
@@ -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: |
|
|
@@ -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.
|
|
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,40 @@ 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.1] - 2026-11-03
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Make the clustered heatmap example self-sizing in notebooks through its own
|
|
13
|
+
authored panel heights, with room for guides and legends. Preserve native
|
|
14
|
+
plot and container sizing for other charts without a global notebook height.
|
|
15
|
+
|
|
16
|
+
## [0.8.0] - 2026-10-29
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- Optional Scanpy plotting integration through
|
|
21
|
+
`import genome_spy.integrations.scanpy as gsc`, preserving supported plotting
|
|
22
|
+
names and arguments while Scanpy continues to own analysis.
|
|
23
|
+
- Interactive embeddings, PCA diagnostics, dotplots, matrixplots, heatmaps,
|
|
24
|
+
clustermaps, expression tracks, ranked-gene summaries, quality checks,
|
|
25
|
+
time-series, DPT and PAGA plots. Unsupported plots and options fail explicitly.
|
|
26
|
+
- `EmbeddingSummary` for linked cell selections, expression summaries,
|
|
27
|
+
histograms and marker tracks, with optional cell counts and selection retrieval
|
|
28
|
+
in Python.
|
|
29
|
+
- Scanpy guides with live examples, downloadable notebooks, installation and
|
|
30
|
+
export instructions, and documented coverage limits.
|
|
31
|
+
|
|
32
|
+
### Changed
|
|
33
|
+
|
|
34
|
+
- Support Scanpy >=1.11.5,<1.13, tested with 1.11.5 and 1.12.4, while keeping
|
|
35
|
+
the reference environment pinned independently.
|
|
36
|
+
|
|
37
|
+
### Fixed
|
|
38
|
+
|
|
39
|
+
- Follow Scanpy 1.12's swapped-dotplot scaling and report its unavailable
|
|
40
|
+
automatic PAGA tree layouts without substituting another layout.
|
|
41
|
+
|
|
8
42
|
## [0.7.0] - 2026-10-20
|
|
9
43
|
|
|
10
44
|
### Added
|
|
@@ -181,6 +215,7 @@ First public alpha release, targeting GenomeSpy Core 0.87.0.
|
|
|
181
215
|
- Packaged example datasets, documentation, tutorials, and an interactive
|
|
182
216
|
visualization gallery.
|
|
183
217
|
|
|
218
|
+
[0.8.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.7.0...v0.8.0
|
|
184
219
|
[0.7.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.6.0...v0.7.0
|
|
185
220
|
[0.6.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.5.0...v0.6.0
|
|
186
221
|
[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.
|
|
3
|
+
Version: 0.8.1
|
|
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 |
|
|
@@ -454,7 +454,9 @@ def _detail_md(example: core.Example, bundle_url: str) -> str:
|
|
|
454
454
|
spec_output_id = f"gs-spec-output-{example.name}"
|
|
455
455
|
spec_copy_id = f"gs-spec-copy-{example.name}"
|
|
456
456
|
spec_copy_message_id = f"gs-spec-copy-message-{example.name}"
|
|
457
|
-
host_style =
|
|
457
|
+
host_style = (
|
|
458
|
+
"height:auto" if example.intrinsic_height else f"height:{example.height}px"
|
|
459
|
+
)
|
|
458
460
|
if example.max_width is not None:
|
|
459
461
|
host_style += f";max-width:{example.max_width}px"
|
|
460
462
|
chart = (
|