genome-spy-python 0.8.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.0 → genome_spy_python-0.8.1}/.github/workflows/ci.yml +17 -15
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/CHANGELOG.md +8 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/PKG-INFO +1 -1
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_gallery.py +3 -1
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clustered_heatmap.md +5 -1
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clustered_heatmap.py +5 -3
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/notebooks.md +11 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/pyproject.toml +1 -1
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/__init__.py +1 -1
- 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.0 → genome_spy_python-0.8.1}/tests/test_chart.py +1 -1
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_gallery.py +11 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_upstream_surround_gallery.py +7 -1
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/check_notebook_rendering.py +103 -11
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/docs_gallery.py +2 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/uv.lock +1 -1
- genome_spy_python-0.8.0/tests/browser/test_offline_rendering.py +0 -52
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/contribute-genomespy/SKILL.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.gitattributes +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.github/workflows/docs.yml +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.github/workflows/release.yml +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.gitignore +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.pre-commit-config.yaml +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.python-version +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/AGENTS.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/CLAUDE.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/CONTRIBUTING.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSE +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/CC-BY-4.0.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/CC0-1.0.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/GENOMESPY-MIT.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/LATO-OFL-1.1.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/SCANPY-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/README.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/THIRD_PARTY_NOTICES.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_agents.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_notebook.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/README.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/external-links.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/airway_ma_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/airway_volcano_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ascat_copy_number.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ascat_fitting.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bam_read_alignments.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bam_read_pileup.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/clinvar_variants.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/clustered_heatmap.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/composing_genome_browser.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/copy_number.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/coverage_pileup.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/cytobands.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/diverging_bars.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/dynseq_bqtl.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/genome_tracks.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/geometric_zoom.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/heatmap_with_text.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/independent_scales.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/layered_lollipop.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/link_mark.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/luad_oncoprint.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/manhattan_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/needle_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/oncoprint.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_umap.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_umap_genes.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/penguin_brush.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pisa_squid.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/point_mark.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/point_styles.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rainfall_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ranged_rule.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rect_heatmap.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/refseq_scored_genes.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/sashimi_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/scrollable_viewport.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/sequence_logo.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/six_frame_translation.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/stacked_bar.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/stacked_genome_browser.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/tsne.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/upset_mutations.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/vertical_concat.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/volcano_plot.png +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/genomespy.css +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/readme-manhattan.webp +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/readme-sequence-logo.webp +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/showcase.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/snaketie.svg +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/workflows.css +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/workflows.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/autosummary/class.rst +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/autosummary/class_own_members.rst +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/base.html +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/components/view-this-page.html +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/about.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/data.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/embed-api.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/encodings.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/manifest.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/quickstart.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/rendering.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/scales-axes-legends.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/skill-distribution.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/api.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/conf.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/contributing/standards.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/datasets.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_ma_plot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_ma_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_volcano_plot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_volcano_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_copy_number.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_copy_number.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_fitting.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_fitting.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_alignments.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_alignments.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_pileup.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_pileup.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bigbed_ccre_track.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/brush_linked_genome_tracks.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/brush_linked_genome_tracks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clinvar_variants.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clinvar_variants.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/combined_laml_oncoplot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/combined_laml_oncoplot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/composing_genome_browser.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/composing_genome_browser.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/copy_number.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/coverage_pileup.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/coverage_pileup.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/cytobands.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/cytobands.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/diverging_bars.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/diverging_bars.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_adaptive_bqtl.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_bqtl.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_bqtl.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/genome_tracks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/geometric_zoom.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/geometric_zoom.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/gff3_gene_annotations.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/gff3_gene_annotations.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/hcc1954_sv_cnv.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/hcc1954_sv_cnv.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/heatmap_with_text.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/heatmap_with_text.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/independent_scales.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/independent_scales.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/indexed_fasta_sequence.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/layered_lollipop.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/layered_lollipop.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/link_mark.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/luad_oncoprint.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/luad_oncoprint.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/manhattan_plot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/manhattan_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/multiple_sequence_alignment.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/multiple_sequence_alignment.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/needle_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/oncoprint.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/oncoprint.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/p53_sequence_comparison.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/p53_sequence_comparison.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_cell_heatmap.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_cell_heatmap.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_expression_tracks.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_expression_tracks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_marker_matrix.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_marker_matrix.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap_genes.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap_genes.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/penguin_brush.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/penguin_brush.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pik3ca_tcga_brca_lollipop.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_interaction_matrix.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_interaction_matrix.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_squid.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_squid.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_mark.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_mark.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_styles.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_styles.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rainfall_plot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rainfall_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ranged_rule.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rect_heatmap.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rect_heatmap.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/refseq_scored_genes.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/refseq_scored_genes.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rnf7_direct_rna.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rnf7_direct_rna.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/sashimi_plot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/sashimi_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/scrollable_viewport.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/sequence_logo.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/six_frame_translation.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/six_frame_translation.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/stacked_bar.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/stacked_bar.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/stacked_genome_browser.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tcga_ov_gistic.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tcga_ov_gistic.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tsne.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tsne.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/upset_mutations.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/upset_mutations.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/vertical_concat.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/vertical_concat.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/volcano_plot.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/volcano_plot.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/getting-started.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/index.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/component.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/index.html +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/notebook.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/server.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/index.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/api.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/export.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/expression.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/index.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/linked_expression.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/paga.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/pca.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/profiles.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/quality.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/ranked.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/supported.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/tracks.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/umap.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/annotations.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/charts_and_marks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/composition.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/configuration.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/data_inputs.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/display_controls.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/encoding_channels.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/expressions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/genome_browser_layouts.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/genomic_coordinates.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/genomic_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/getting_started.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/importing_specifications.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/interaction.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/notebooks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/scales_and_guides.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/serialization.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/transforms.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/annotations.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/charts.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/composition.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/configuration.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/connect-python.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/data.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/display-controls.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/embed-api.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/encodings.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/expressions.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/genome-browser-layouts.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/genomic-axes.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/genomic-data.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/importing-specifications.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/index.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/interaction.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/scales-axes-legends.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/serialization.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/transforms.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/using-charts.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/annotate-intervals.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/edit-sequence.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/index.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/pick-genes.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/select-genes.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/README.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/COMPATIBILITY.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/FUTURE.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/PLAN.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/README.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/STATUS.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/export.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/expression.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/linked_expression.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/paga.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/pca.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/profiles.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/quality.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/ranked.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/tracks.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/umap.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/notebooks/scanpy_expression.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/notebooks/scanpy_umap.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/prepare_guide_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/annotate_genomic_intervals.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/edit_sequence.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/embed_api.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/penguin_python_roundtrip.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/pick_genes.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/select_genes.ipynb +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/SKILL.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/agents/openai.yaml +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/references/grouped-charts.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/references/table-chart.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_chart_authoring.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_conditions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_embed.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_expressions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_parameters.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_render.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_skill_install.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_utils.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_widget.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/anndata.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/api.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/arrow.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/channels.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/data_transformers.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_airway.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_annotations.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_direct_rna.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_gistic.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_grammar.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_hapmap.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_mutation.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_oncoprint.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_pbmc.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga.tsv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/embed.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/helpers.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_dendrogram_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_dendrogram_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/density_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/interactions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/scatter_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/selection.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/summary_builder.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/summary_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/summary_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/clustermap_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/clustermap_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/colors.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/correlation_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/dotplot_builder.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/dotplot_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/grouped_builder.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/grouped_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/grouped_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/heatmap_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/matrix_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/matrixplot_builder.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/matrixplot_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/tracksplot_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_grid_interactions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_guards.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_labels.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/path_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/path_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/highest_expr_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/highest_expr_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/hvg_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/scrublet_chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/scrublet_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_ranking/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_ranking/chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_ranking/data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_style.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_timeseries/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_timeseries/chart.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_timeseries/data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/pl.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/jupyter.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/py.typed +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/_kwds.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/_typing.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/capabilities.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/channels.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/composition.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/core.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/ergonomics.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/expressions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/genome-spy-schema.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/lazy.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/mixins.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schemapi.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/controls.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/embed-bridge.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/genome-spy.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/inspector.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/widget.js +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_core_upgrade.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_composition.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_linked_expression.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_notebook.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_theme.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_workflows.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_embed_api.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_python_web_example.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/embed-bridge.test.mjs +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/README.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/clustered-heatmap.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/upsetr-mutations.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/conftest.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/interactions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/references.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/rendering.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_dendrogram.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_dpt.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_embedding_style.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_embeddings.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_grid_interactions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_grouped_builders.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_grouped_expression.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_heatmaps.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_linked_embeddings.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_paga.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_paga_adjacency.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_paga_path.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_pca.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_profiles.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_qc.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_ranked.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/embedding_fixtures.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/expression_fixtures.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/README.md +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/api.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/clustermap.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/dendrogram.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/dotplot.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/embedding.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/grouped.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/heatmap.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/matrix.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/matrixplot.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/ranked.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/scatter.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/umap.json +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/grid_fixture_support.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/helpers.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/paga_fixtures.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/profile_fixtures.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/qc_fixtures.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/ranked_fixture.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_contract.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_dendrogram.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_dpt.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_embedding_style.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_embeddings.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_grid_interactions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_grouped_builders.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_grouped_expression.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_heatmaps.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_linked_embeddings.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_notebooks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_paga.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_paga_adjacency.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_paga_path.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_pca.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_profiles.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_qc.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_ranked.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_agent_docs.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_anndata.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_arrow.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_combined_gallery_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_conditions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_data_transformers.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_datasets.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_distribution.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_api_reference.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_linked_expression.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_notebook.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_tutorial.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_embed.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_embed_notebook.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_expressions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_generated_schema_package.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_generated_transform_methods.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_javascript_assets.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_licensing.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_new_compositions.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_pbmc_gallery.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_pisa_gallery.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_python_connection_example.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_render_thumbnails.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_rnf7_direct_rna_example.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_scanpy_imports.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_schema_codegen.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_skill_install.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_widget.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_workflow_notebooks.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/widget.test.mjs +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/agent_docs.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/agent_markdown.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/docs_workflows.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/generate_api_docs.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/generate_schema_wrapper.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_airway_review.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_combined_gallery_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_pbmc_gallery_data.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_refseq_gene_annotations.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/render_thumbnails.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/schemapi/__init__.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/schemapi/codegen.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/schemapi/expression_codegen.py +0 -0
- {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/vendor_javascript.py +0 -0
|
@@ -101,6 +101,14 @@ jobs:
|
|
|
101
101
|
enable-cache: true
|
|
102
102
|
python-version: ${{ matrix.python }}
|
|
103
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"
|
|
104
112
|
- name: Fast Scanpy checks
|
|
105
113
|
if: github.ref != 'refs/heads/main' && !inputs.full_scanpy
|
|
106
114
|
run: >-
|
|
@@ -112,9 +120,6 @@ jobs:
|
|
|
112
120
|
run: >-
|
|
113
121
|
uv run --no-sync pytest tests/integrations/scanpy
|
|
114
122
|
--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
123
|
- name: Browser smoke checks
|
|
119
124
|
if: matrix.python == '3.11' && github.ref != 'refs/heads/main' && !inputs.full_scanpy
|
|
120
125
|
run: >-
|
|
@@ -125,16 +130,13 @@ jobs:
|
|
|
125
130
|
run: >-
|
|
126
131
|
uv run --no-sync pytest tests/integrations/scanpy/browser -q
|
|
127
132
|
--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
133
|
- uses: actions/upload-artifact@v7
|
|
134
134
|
if: always() && matrix.python == '3.11'
|
|
135
135
|
with:
|
|
136
136
|
name: scanpy-browser
|
|
137
|
-
path:
|
|
137
|
+
path: |
|
|
138
|
+
${{ runner.temp }}/scanpy-browser
|
|
139
|
+
${{ runner.temp }}/scanpy-notebooks
|
|
138
140
|
if-no-files-found: ignore
|
|
139
141
|
|
|
140
142
|
scanpy-compatibility:
|
|
@@ -251,10 +253,10 @@ jobs:
|
|
|
251
253
|
with:
|
|
252
254
|
name: notebook-rendering
|
|
253
255
|
path: |
|
|
254
|
-
${{ runner.temp }}/notebook-rendering
|
|
255
|
-
${{ runner.temp }}/embed-api
|
|
256
|
-
${{ runner.temp }}/annotate-intervals
|
|
257
|
-
${{ runner.temp }}/select-genes
|
|
258
|
-
${{ runner.temp }}/pick-genes
|
|
259
|
-
${{ 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.*
|
|
260
262
|
if-no-files-found: ignore
|
|
@@ -5,6 +5,14 @@ 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
|
+
|
|
8
16
|
## [0.8.0] - 2026-10-29
|
|
9
17
|
|
|
10
18
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: genome-spy-python
|
|
3
|
-
Version: 0.8.
|
|
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/
|
|
@@ -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 = (
|
|
@@ -24,7 +24,11 @@ converts the supplied node hierarchies into orthogonal link endpoints.
|
|
|
24
24
|
|
|
25
25
|
`gs.surround()` places the gene tree above the matrix, the cell-line tree to its
|
|
26
26
|
left, and a `gs.SurroundSideSpec` with annotation strips and labels to its right.
|
|
27
|
-
Shared index scales align each side with the matrix.
|
|
27
|
+
Shared index scales align each side with the matrix. The matrix reserves eight
|
|
28
|
+
pixels per cell line, with a tree panel one fifth as tall. GenomeSpy adds space
|
|
29
|
+
for titles, labels, and legends, so the same specification works in a notebook
|
|
30
|
+
without setting a widget height. Its width follows the available container.
|
|
31
|
+
The authored panel heights stay stable while zooming. Fractional dendrogram
|
|
28
32
|
offsets use `bandstep()` to stay connected across gaps while zooming. The
|
|
29
33
|
trees' independent height scales use `gs.ViewportDomainRef(mode="contain")`.
|
|
30
34
|
|
|
@@ -10,10 +10,12 @@ from genome_spy.schema import Encoding, OverhangConfig, StyleConfig
|
|
|
10
10
|
META = {
|
|
11
11
|
"category": "Expression and heatmaps",
|
|
12
12
|
"order": 10,
|
|
13
|
-
"height":
|
|
13
|
+
"height": 800,
|
|
14
|
+
"intrinsic_height": True,
|
|
14
15
|
"max_width": 1100,
|
|
15
16
|
}
|
|
16
17
|
DATA = "https://data.genomespy.app/datasets/depmap-cell-line-rna-seq/v1/"
|
|
18
|
+
heatmap_height = 60 * 8
|
|
17
19
|
view_width = gs.Expression("width")
|
|
18
20
|
view_height = gs.Expression("height")
|
|
19
21
|
cell_lines = gs.Data(
|
|
@@ -69,7 +71,7 @@ column_tree = (
|
|
|
69
71
|
)
|
|
70
72
|
.legend(None),
|
|
71
73
|
)
|
|
72
|
-
.properties(name="columnDendrogram", height=
|
|
74
|
+
.properties(name="columnDendrogram", height=heatmap_height * 0.2)
|
|
73
75
|
)
|
|
74
76
|
row_tree = (
|
|
75
77
|
gs.Chart(gs.Data(url=DATA + "cell-line-tree.json"))
|
|
@@ -317,7 +319,7 @@ feature_labels = (
|
|
|
317
319
|
|
|
318
320
|
chart = (
|
|
319
321
|
gs.surround(
|
|
320
|
-
(cells + feature_labels).properties(name="heatmap"),
|
|
322
|
+
(cells + feature_labels).properties(name="heatmap", height=heatmap_height),
|
|
321
323
|
surround=gs.SurroundSides(
|
|
322
324
|
top=[column_tree], left=[row_tree], right=annotations
|
|
323
325
|
),
|
|
@@ -43,6 +43,17 @@ Leave the chart as the last expression in a cell:
|
|
|
43
43
|
|
|
44
44
|
This is enough to display and explore a chart.
|
|
45
45
|
|
|
46
|
+
GenomeSpy computes the canvas size from the specification, including room for
|
|
47
|
+
titles, axes, and legends. Fixed heights and step-sized plots keep their authored
|
|
48
|
+
dimensions. Container-sized plots use the space provided by their host, including
|
|
49
|
+
an `HBox` or an explicit widget layout size. The notebook wrapper does not impose
|
|
50
|
+
a default width or height.
|
|
51
|
+
|
|
52
|
+
A fully flexible plot has no intrinsic height. For standalone notebook output,
|
|
53
|
+
author a plot `height` in the specification or provide a sized widget container.
|
|
54
|
+
The clustered heatmap example declares its matrix and tree heights in the chart
|
|
55
|
+
itself; other plots do not inherit those sizes.
|
|
56
|
+
|
|
46
57
|
### Create a chart from a dataframe
|
|
47
58
|
|
|
48
59
|
You can pass a pandas or Polars dataframe directly to `gs.Chart()`. PyArrow
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "genome-spy-python"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.1"
|
|
4
4
|
description = "genome-spy-python is a declarative genomics visualization library for Python, built on top of the genome-spy JSON specification."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""Exercise the shipped inline modules in the browser CI environment."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import genome_spy as gs
|
|
7
|
+
import pytest
|
|
8
|
+
|
|
9
|
+
playwright = pytest.importorskip("playwright.sync_api")
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def test_inline_html_renders_and_opens_inspector_offline(tmp_path: Path) -> None:
|
|
13
|
+
chart = (
|
|
14
|
+
gs.Chart([{"x": 1, "y": 2}, {"x": 2, "y": 3}])
|
|
15
|
+
.mark_point()
|
|
16
|
+
.encode(x="x:Q", y="y:Q")
|
|
17
|
+
)
|
|
18
|
+
output = tmp_path / "chart.html"
|
|
19
|
+
chart.save(output, inline=True)
|
|
20
|
+
with playwright.sync_playwright() as runtime:
|
|
21
|
+
browser = runtime.chromium.launch()
|
|
22
|
+
try:
|
|
23
|
+
page = browser.new_page(offline=True)
|
|
24
|
+
errors: list[str] = []
|
|
25
|
+
requests: list[str] = []
|
|
26
|
+
page.on("pageerror", lambda error: errors.append(str(error)))
|
|
27
|
+
page.on(
|
|
28
|
+
"request",
|
|
29
|
+
lambda request: (
|
|
30
|
+
requests.append(request.url)
|
|
31
|
+
if request.url.startswith(("http:", "https:"))
|
|
32
|
+
else None
|
|
33
|
+
),
|
|
34
|
+
)
|
|
35
|
+
# A host AMD loader must not intercept the packaged ESM runtime.
|
|
36
|
+
page.add_init_script(
|
|
37
|
+
"globalThis.define = () => { throw Error('AMD called'); };"
|
|
38
|
+
"globalThis.define.amd = {};"
|
|
39
|
+
)
|
|
40
|
+
page.goto(output.as_uri())
|
|
41
|
+
page.locator("canvas").first.wait_for(state="visible")
|
|
42
|
+
inspector = page.get_by_role("button", name="Inspector", exact=True)
|
|
43
|
+
inspector.wait_for(state="attached")
|
|
44
|
+
inspector.evaluate("(button) => button.click()")
|
|
45
|
+
page.get_by_role("dialog", name="GenomeSpy Inspector").wait_for(
|
|
46
|
+
state="visible"
|
|
47
|
+
)
|
|
48
|
+
page.locator("gs-inspector-panel").wait_for(state="attached")
|
|
49
|
+
assert page.locator(".message-box").count() == 0
|
|
50
|
+
assert not errors, errors
|
|
51
|
+
assert not requests, requests
|
|
52
|
+
finally:
|
|
53
|
+
browser.close()
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@pytest.mark.parametrize("painted", [False, True])
|
|
57
|
+
def test_notebook_canvas_check_keeps_blank_failure_and_records_state(tmp_path, painted):
|
|
58
|
+
from tools.check_notebook_rendering import _check_canvas, _observe_rendering
|
|
59
|
+
|
|
60
|
+
with playwright.sync_playwright() as runtime:
|
|
61
|
+
browser = runtime.chromium.launch()
|
|
62
|
+
try:
|
|
63
|
+
page = browser.new_page()
|
|
64
|
+
console = []
|
|
65
|
+
_observe_rendering(page, console)
|
|
66
|
+
page.goto("""data:text/html,<div class="jp-CodeCell">
|
|
67
|
+
<div class="jp-InputArea">chart.display()</div>
|
|
68
|
+
<div class="jp-OutputArea"><canvas width="100" height="80"></canvas></div>
|
|
69
|
+
</div>""")
|
|
70
|
+
canvas = page.locator("canvas")
|
|
71
|
+
canvas.evaluate(
|
|
72
|
+
"""(canvas, painted) => {
|
|
73
|
+
canvas.dispatchEvent(new WebGLContextEvent('webglcontextlost'));
|
|
74
|
+
console.warn('test-secret');
|
|
75
|
+
const ctx = canvas.getContext('2d');
|
|
76
|
+
const fill = ctx.createLinearGradient(0, 0, 100, 0);
|
|
77
|
+
fill.addColorStop(0, 'red'); fill.addColorStop(1, 'blue');
|
|
78
|
+
ctx.fillStyle = painted ? fill : 'white';
|
|
79
|
+
ctx.fillRect(0, 0, 100, 80);
|
|
80
|
+
}""",
|
|
81
|
+
painted,
|
|
82
|
+
)
|
|
83
|
+
screenshot = tmp_path / "chart.png"
|
|
84
|
+
if painted:
|
|
85
|
+
_check_canvas(page, canvas, screenshot, console, [], "test-secret")
|
|
86
|
+
assert not screenshot.with_suffix(".json").exists()
|
|
87
|
+
else:
|
|
88
|
+
with pytest.raises(AssertionError, match="canvas is blank"):
|
|
89
|
+
_check_canvas(page, canvas, screenshot, console, [], "test-secret")
|
|
90
|
+
report = screenshot.with_suffix(".json").read_text()
|
|
91
|
+
assert "test-secret" not in report
|
|
92
|
+
state = json.loads(report)
|
|
93
|
+
assert state["cellIndex"] == 0
|
|
94
|
+
assert state["source"] == "chart.display()"
|
|
95
|
+
assert state["canvas"]["bufferWidth"] == 100
|
|
96
|
+
assert state["colorCount"] == 1
|
|
97
|
+
assert state["contextEvents"][0]["type"] == "webglcontextlost"
|
|
98
|
+
assert state["console"] == [{"type": "warning", "text": "<redacted>"}]
|
|
99
|
+
assert screenshot.with_suffix(".page.png").is_file()
|
|
100
|
+
assert screenshot.is_file()
|
|
101
|
+
finally:
|
|
102
|
+
browser.close()
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""Check notebook container sizing against the packaged GenomeSpy runtime."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from urllib.parse import quote
|
|
6
|
+
|
|
7
|
+
import genome_spy as gs
|
|
8
|
+
import pytest
|
|
9
|
+
|
|
10
|
+
playwright = pytest.importorskip("playwright.sync_api")
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.mark.parametrize(
|
|
14
|
+
(
|
|
15
|
+
"kind",
|
|
16
|
+
"width",
|
|
17
|
+
"height",
|
|
18
|
+
"host_width",
|
|
19
|
+
"host_height",
|
|
20
|
+
"layout_height",
|
|
21
|
+
"expected",
|
|
22
|
+
),
|
|
23
|
+
[
|
|
24
|
+
("unit", None, None, 500, None, None, None),
|
|
25
|
+
("unit", 200, 120, 800, None, None, [220, 140]),
|
|
26
|
+
("unit", None, 240, 800, None, None, [800, 260]),
|
|
27
|
+
("step", None, None, 500, None, None, [500, 80]),
|
|
28
|
+
("vconcat", None, None, 500, None, None, [500, 330]),
|
|
29
|
+
("unit", None, None, 500, 350, None, [500, 350]),
|
|
30
|
+
("unit", None, None, 900, 600, None, [900, 600]),
|
|
31
|
+
("unit", None, None, 800, None, 400, [800, 400]),
|
|
32
|
+
],
|
|
33
|
+
)
|
|
34
|
+
def test_widget_uses_native_plot_and_container_dimensions(
|
|
35
|
+
kind, width, height, host_width, host_height, layout_height, expected
|
|
36
|
+
):
|
|
37
|
+
chart = (
|
|
38
|
+
gs.Chart([{"x": i, "y": i} for i in range(3)])
|
|
39
|
+
.mark_point()
|
|
40
|
+
.encode(x=gs.X("x:Q").axis(None), y=gs.Y("y:Q").axis(None))
|
|
41
|
+
)
|
|
42
|
+
if kind == "step":
|
|
43
|
+
chart = chart.encode(
|
|
44
|
+
y=gs.Y("y:O").scale(paddingInner=0, paddingOuter=0).axis(None)
|
|
45
|
+
).properties(height=gs.step(20))
|
|
46
|
+
elif kind == "vconcat":
|
|
47
|
+
chart = gs.vconcat(
|
|
48
|
+
chart.properties(height=100), chart.properties(height=200), spacing=10
|
|
49
|
+
)
|
|
50
|
+
else:
|
|
51
|
+
if width is not None:
|
|
52
|
+
chart = chart.properties(width=width)
|
|
53
|
+
if height is not None:
|
|
54
|
+
chart = chart.properties(height=height)
|
|
55
|
+
widget = chart.widget(inline=True, controls=False)
|
|
56
|
+
state = {
|
|
57
|
+
name: getattr(widget, name)
|
|
58
|
+
for name in (
|
|
59
|
+
"spec",
|
|
60
|
+
"bundle_url",
|
|
61
|
+
"embed_options",
|
|
62
|
+
"controls",
|
|
63
|
+
"dataset_manifest",
|
|
64
|
+
)
|
|
65
|
+
}
|
|
66
|
+
with playwright.sync_playwright() as runtime:
|
|
67
|
+
browser = runtime.chromium.launch()
|
|
68
|
+
try:
|
|
69
|
+
page = browser.new_page()
|
|
70
|
+
page.set_content(f'<div id="widget" style="width: {host_width}px"></div>')
|
|
71
|
+
if host_height is not None:
|
|
72
|
+
page.locator("#widget").evaluate(
|
|
73
|
+
"""(el, height) => {
|
|
74
|
+
const parent = document.createElement('div');
|
|
75
|
+
parent.style.cssText = `display: flex; height: ${height}px`;
|
|
76
|
+
el.before(parent);
|
|
77
|
+
parent.append(el);
|
|
78
|
+
}""",
|
|
79
|
+
host_height,
|
|
80
|
+
)
|
|
81
|
+
if css := getattr(widget, "_css", ""):
|
|
82
|
+
page.add_style_tag(content=str(css))
|
|
83
|
+
if layout_height is not None:
|
|
84
|
+
page.locator("#widget").evaluate(
|
|
85
|
+
"(el, height) => el.style.height = `${height}px`", layout_height
|
|
86
|
+
)
|
|
87
|
+
page.add_script_tag(
|
|
88
|
+
type="module",
|
|
89
|
+
content=f"""
|
|
90
|
+
const {{renderChart}} = await import({json.dumps("data:text/javascript," + quote(str(widget._esm)))});
|
|
91
|
+
const values = {json.dumps(state)};
|
|
92
|
+
const model = {{get: name => values[name], set() {{}},
|
|
93
|
+
save_changes() {{}}, on() {{}}, off() {{}}}};
|
|
94
|
+
window.controller = new AbortController();
|
|
95
|
+
await renderChart({{model, el: document.querySelector('#widget'),
|
|
96
|
+
signal: controller.signal}});
|
|
97
|
+
if ({json.dumps(expected is None)}) {{
|
|
98
|
+
const reference = document.createElement('div');
|
|
99
|
+
reference.style.width = '{host_width}px';
|
|
100
|
+
document.body.append(reference);
|
|
101
|
+
const core = await import(values.bundle_url);
|
|
102
|
+
await core.embed(reference, structuredClone(values.spec), values.embed_options);
|
|
103
|
+
const canvas = reference.querySelector('canvas');
|
|
104
|
+
window.nativeSize = [canvas.width, canvas.height];
|
|
105
|
+
}}
|
|
106
|
+
window.rendered = true;
|
|
107
|
+
""",
|
|
108
|
+
)
|
|
109
|
+
page.wait_for_function("window.rendered")
|
|
110
|
+
if expected is None:
|
|
111
|
+
expected = page.evaluate("window.nativeSize")
|
|
112
|
+
page.wait_for_function(
|
|
113
|
+
"""size => {
|
|
114
|
+
const canvas = document.querySelector('canvas');
|
|
115
|
+
return canvas.width === size[0] && canvas.height === size[1];
|
|
116
|
+
}""",
|
|
117
|
+
arg=expected,
|
|
118
|
+
)
|
|
119
|
+
assert page.locator("#widget").bounding_box()["width"] == host_width
|
|
120
|
+
assert page.locator("#widget").bounding_box()["height"] == expected[1]
|
|
121
|
+
if host_height is not None:
|
|
122
|
+
assert (
|
|
123
|
+
page.locator("#widget").evaluate(
|
|
124
|
+
"el => el.parentElement.getBoundingClientRect().height"
|
|
125
|
+
)
|
|
126
|
+
== host_height
|
|
127
|
+
)
|
|
128
|
+
assert page.locator(".message-box").count() == 0
|
|
129
|
+
finally:
|
|
130
|
+
browser.close()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
@pytest.mark.parametrize("plot", ["hbox", "clustered_heatmap"])
|
|
134
|
+
def test_widget_dimensions_in_real_jupyter(tmp_path, monkeypatch, plot):
|
|
135
|
+
import sys
|
|
136
|
+
|
|
137
|
+
import nbformat
|
|
138
|
+
|
|
139
|
+
from tools import check_notebook_rendering
|
|
140
|
+
|
|
141
|
+
notebook = nbformat.v4.new_notebook(
|
|
142
|
+
cells=[
|
|
143
|
+
nbformat.v4.new_code_cell("""import genome_spy as gs
|
|
144
|
+
from ipywidgets import HBox, Layout
|
|
145
|
+
|
|
146
|
+
chart = gs.Chart([
|
|
147
|
+
{"x": x, "y": y, "value": x + 10 * y}
|
|
148
|
+
for x in range(10) for y in range(10)
|
|
149
|
+
]).mark_rect().encode(
|
|
150
|
+
x=gs.X("x:O").axis(None), y=gs.Y("y:O").axis(None), color="value:Q"
|
|
151
|
+
)
|
|
152
|
+
widget = chart.widget(inline=True, controls=False)
|
|
153
|
+
display(HBox([widget], layout=Layout(height="400px")))
|
|
154
|
+
""")
|
|
155
|
+
],
|
|
156
|
+
metadata={
|
|
157
|
+
"kernelspec": {
|
|
158
|
+
"name": "python3",
|
|
159
|
+
"display_name": "Python 3",
|
|
160
|
+
"language": "python",
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
)
|
|
164
|
+
if plot == "clustered_heatmap":
|
|
165
|
+
example = (
|
|
166
|
+
Path(__file__).resolve().parents[2] / "docs/examples/clustered_heatmap.py"
|
|
167
|
+
)
|
|
168
|
+
notebook.cells[0].source = f"""import runpy
|
|
169
|
+
chart = runpy.run_path({str(example)!r})["chart"]
|
|
170
|
+
widget = chart.widget(inline=True, controls=False)
|
|
171
|
+
widget.layout.width = "900px"
|
|
172
|
+
display(widget)
|
|
173
|
+
"""
|
|
174
|
+
source = tmp_path / "hbox.ipynb"
|
|
175
|
+
source.write_text(nbformat.writes(notebook))
|
|
176
|
+
check_canvas = check_notebook_rendering._check_canvas
|
|
177
|
+
|
|
178
|
+
def check_hbox(page, canvas, *args):
|
|
179
|
+
if plot == "clustered_heatmap":
|
|
180
|
+
initial_height = canvas.evaluate("el => el.height")
|
|
181
|
+
assert initial_height > 480 + 96
|
|
182
|
+
assert canvas.evaluate("el => el.width") == 900
|
|
183
|
+
bounds = canvas.bounding_box()
|
|
184
|
+
page.mouse.move(
|
|
185
|
+
bounds["x"] + bounds["width"] * 0.55,
|
|
186
|
+
bounds["y"] + bounds["height"] * 0.5,
|
|
187
|
+
)
|
|
188
|
+
page.mouse.wheel(0, -180)
|
|
189
|
+
page.wait_for_timeout(500)
|
|
190
|
+
assert canvas.evaluate("el => el.height") == initial_height
|
|
191
|
+
check_notebook_rendering._run_kernel(page, 'widget.layout.width = "600px"')
|
|
192
|
+
page.wait_for_function("document.querySelector('canvas').width === 600")
|
|
193
|
+
assert canvas.evaluate("el => el.height") > 480 + 96
|
|
194
|
+
assert (
|
|
195
|
+
abs(
|
|
196
|
+
canvas.evaluate("""el => el.height -
|
|
197
|
+
el.closest('.genome-spy').getBoundingClientRect().height""")
|
|
198
|
+
)
|
|
199
|
+
< 1
|
|
200
|
+
)
|
|
201
|
+
check_canvas(page, canvas, *args)
|
|
202
|
+
return
|
|
203
|
+
heights = canvas.evaluate("""canvas => {
|
|
204
|
+
const widget = canvas.closest('.genome-spy');
|
|
205
|
+
const parent = widget.closest('.widget-hbox');
|
|
206
|
+
return [parent.getBoundingClientRect().height,
|
|
207
|
+
widget.getBoundingClientRect().height, canvas.height];
|
|
208
|
+
}""")
|
|
209
|
+
assert heights == [400, 400, 400]
|
|
210
|
+
check_canvas(page, canvas, *args)
|
|
211
|
+
|
|
212
|
+
monkeypatch.setattr(check_notebook_rendering, "_check_canvas", check_hbox)
|
|
213
|
+
monkeypatch.setattr(
|
|
214
|
+
sys, "argv", ["check", str(source), "--screenshot", str(tmp_path / "hbox.png")]
|
|
215
|
+
)
|
|
216
|
+
check_notebook_rendering.main()
|
|
@@ -2134,6 +2134,17 @@ def test_gallery_example_can_cap_embed_width() -> None:
|
|
|
2134
2134
|
assert 'class="gs-doc-embed" style="height:500px;max-width:980px"' in markdown
|
|
2135
2135
|
|
|
2136
2136
|
|
|
2137
|
+
def test_intrinsic_heatmap_gallery_height_follows_the_spec() -> None:
|
|
2138
|
+
gallery = _load_gallery()
|
|
2139
|
+
extension = _load_gallery_extension()
|
|
2140
|
+
example = gallery.collect_example(EXAMPLES_DIR / "clustered_heatmap.py")
|
|
2141
|
+
markdown = extension._detail_md(example, "https://example.test/bundle.js")
|
|
2142
|
+
|
|
2143
|
+
assert example.spec["spec"]["height"] == 480
|
|
2144
|
+
assert example.spec["surround"]["top"][0]["height"] == 96
|
|
2145
|
+
assert 'class="gs-doc-embed" style="height:auto;max-width:1100px"' in markdown
|
|
2146
|
+
|
|
2147
|
+
|
|
2137
2148
|
def test_minigallery_links_include_cache_busting_query(
|
|
2138
2149
|
monkeypatch: pytest.MonkeyPatch,
|
|
2139
2150
|
) -> None:
|
|
@@ -68,7 +68,13 @@ def test_python_reproduces_upstream_surround_structure(
|
|
|
68
68
|
example: str, upstream: str
|
|
69
69
|
) -> None:
|
|
70
70
|
spec, reference = _specs(example, upstream)
|
|
71
|
-
|
|
71
|
+
actual = _structure(spec)
|
|
72
|
+
if example == "clustered_heatmap":
|
|
73
|
+
# The local example authors its own notebook heights, unlike the reference.
|
|
74
|
+
assert actual["spec"].pop("height") == 480
|
|
75
|
+
assert actual["surround"]["top"][0]["height"] == 96
|
|
76
|
+
actual["surround"]["top"][0]["height"] = {"grow": 0.2}
|
|
77
|
+
assert actual == _structure(reference)
|
|
72
78
|
|
|
73
79
|
|
|
74
80
|
@pytest.mark.parametrize(("example", "upstream"), EXAMPLES)
|