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.
Files changed (587) hide show
  1. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.github/workflows/ci.yml +17 -15
  2. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/CHANGELOG.md +8 -0
  3. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/PKG-INFO +1 -1
  4. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_gallery.py +3 -1
  5. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clustered_heatmap.md +5 -1
  6. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clustered_heatmap.py +5 -3
  7. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/notebooks.md +11 -0
  8. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/pyproject.toml +1 -1
  9. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/__init__.py +1 -1
  10. genome_spy_python-0.8.1/tests/browser/test_offline_rendering.py +102 -0
  11. genome_spy_python-0.8.1/tests/browser/test_widget_sizing.py +216 -0
  12. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_chart.py +1 -1
  13. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_gallery.py +11 -0
  14. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_upstream_surround_gallery.py +7 -1
  15. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/check_notebook_rendering.py +103 -11
  16. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/docs_gallery.py +2 -0
  17. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/uv.lock +1 -1
  18. genome_spy_python-0.8.0/tests/browser/test_offline_rendering.py +0 -52
  19. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/commit/SKILL.md +0 -0
  20. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/contribute-genomespy/SKILL.md +0 -0
  21. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/SKILL.md +0 -0
  22. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  23. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/design.md +0 -0
  24. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.agents/skills/proper-code-review/references/performance.md +0 -0
  25. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/commit/SKILL.md +0 -0
  26. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/SKILL.md +0 -0
  27. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  28. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/design.md +0 -0
  29. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.claude/skills/proper-code-review/references/performance.md +0 -0
  30. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.gitattributes +0 -0
  31. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.github/workflows/docs.yml +0 -0
  32. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.github/workflows/release.yml +0 -0
  33. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.gitignore +0 -0
  34. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.pre-commit-config.yaml +0 -0
  35. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/.python-version +0 -0
  36. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/AGENTS.md +0 -0
  37. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/CLAUDE.md +0 -0
  38. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/CONTRIBUTING.md +0 -0
  39. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSE +0 -0
  40. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  41. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/CC-BY-4.0.txt +0 -0
  42. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
  43. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/CC0-1.0.txt +0 -0
  44. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
  45. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/GENOMESPY-MIT.txt +0 -0
  46. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/LATO-OFL-1.1.txt +0 -0
  47. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/SCANPY-BSD-3-Clause.txt +0 -0
  48. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
  49. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
  50. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/README.md +0 -0
  51. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/THIRD_PARTY_NOTICES.md +0 -0
  52. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_agents.py +0 -0
  53. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_ext/genomespy_notebook.py +0 -0
  54. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/README.md +0 -0
  55. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/airway_metadata.csv +0 -0
  56. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/airway_scaledcounts.csv +0 -0
  57. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/hapmap_gwas.csv +0 -0
  58. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/oncoprint_dataset3.json +0 -0
  59. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/data/pik3ca_mutations.json +0 -0
  60. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/external-links.js +0 -0
  61. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/airway_ma_plot.png +0 -0
  62. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/airway_volcano_plot.png +0 -0
  63. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ascat_copy_number.png +0 -0
  64. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ascat_fitting.png +0 -0
  65. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bam_read_alignments.png +0 -0
  66. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bam_read_pileup.png +0 -0
  67. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  68. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  69. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/clinvar_variants.png +0 -0
  70. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/clustered_heatmap.png +0 -0
  71. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  72. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/composing_genome_browser.png +0 -0
  73. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/copy_number.png +0 -0
  74. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/coverage_pileup.png +0 -0
  75. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/cytobands.png +0 -0
  76. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/diverging_bars.png +0 -0
  77. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
  78. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  79. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/genome_tracks.png +0 -0
  80. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/geometric_zoom.png +0 -0
  81. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  82. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  83. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/heatmap_with_text.png +0 -0
  84. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/independent_scales.png +0 -0
  85. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  86. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/layered_lollipop.png +0 -0
  87. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/link_mark.png +0 -0
  88. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/luad_oncoprint.png +0 -0
  89. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/manhattan_plot.png +0 -0
  90. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  91. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/needle_plot.png +0 -0
  92. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/oncoprint.png +0 -0
  93. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  94. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
  95. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
  96. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
  97. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_umap.png +0 -0
  98. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pbmc_umap_genes.png +0 -0
  99. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/penguin_brush.png +0 -0
  100. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  101. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
  102. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/pisa_squid.png +0 -0
  103. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/point_mark.png +0 -0
  104. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/point_styles.png +0 -0
  105. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rainfall_plot.png +0 -0
  106. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/ranged_rule.png +0 -0
  107. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rect_heatmap.png +0 -0
  108. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  109. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
  110. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/sashimi_plot.png +0 -0
  111. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/scrollable_viewport.png +0 -0
  112. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/sequence_logo.png +0 -0
  113. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/six_frame_translation.png +0 -0
  114. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/stacked_bar.png +0 -0
  115. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  116. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  117. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/tsne.png +0 -0
  118. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/upset_mutations.png +0 -0
  119. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/vertical_concat.png +0 -0
  120. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/gallery/volcano_plot.png +0 -0
  121. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/genomespy.css +0 -0
  122. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/readme-manhattan.webp +0 -0
  123. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/readme-sequence-logo.webp +0 -0
  124. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/showcase.js +0 -0
  125. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/snaketie.svg +0 -0
  126. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/workflows.css +0 -0
  127. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_static/workflows.js +0 -0
  128. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/autosummary/class.rst +0 -0
  129. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/autosummary/class_own_members.rst +0 -0
  130. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/base.html +0 -0
  131. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/_templates/components/view-this-page.html +0 -0
  132. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/about.md +0 -0
  133. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/data.md +0 -0
  134. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/embed-api.md +0 -0
  135. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/encodings.md +0 -0
  136. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/manifest.json +0 -0
  137. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/quickstart.md +0 -0
  138. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/rendering.md +0 -0
  139. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/scales-axes-legends.md +0 -0
  140. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/agents/skill-distribution.md +0 -0
  141. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/api.md +0 -0
  142. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/conf.py +0 -0
  143. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/contributing/standards.md +0 -0
  144. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/datasets.md +0 -0
  145. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_ma_plot.md +0 -0
  146. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_ma_plot.py +0 -0
  147. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_volcano_plot.md +0 -0
  148. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/airway_volcano_plot.py +0 -0
  149. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_copy_number.md +0 -0
  150. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_copy_number.py +0 -0
  151. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_fitting.md +0 -0
  152. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ascat_fitting.py +0 -0
  153. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_alignments.md +0 -0
  154. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_alignments.py +0 -0
  155. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_pileup.md +0 -0
  156. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bam_read_pileup.py +0 -0
  157. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/bigbed_ccre_track.py +0 -0
  158. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/brush_linked_genome_tracks.md +0 -0
  159. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/brush_linked_genome_tracks.py +0 -0
  160. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clinvar_variants.md +0 -0
  161. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/clinvar_variants.py +0 -0
  162. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/combined_laml_oncoplot.md +0 -0
  163. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/combined_laml_oncoplot.py +0 -0
  164. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/composing_genome_browser.md +0 -0
  165. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/composing_genome_browser.py +0 -0
  166. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/copy_number.py +0 -0
  167. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/coverage_pileup.md +0 -0
  168. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/coverage_pileup.py +0 -0
  169. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/cytobands.md +0 -0
  170. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/cytobands.py +0 -0
  171. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/diverging_bars.md +0 -0
  172. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/diverging_bars.py +0 -0
  173. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
  174. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_adaptive_bqtl.py +0 -0
  175. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_bqtl.md +0 -0
  176. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/dynseq_bqtl.py +0 -0
  177. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/genome_tracks.py +0 -0
  178. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/geometric_zoom.md +0 -0
  179. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/geometric_zoom.py +0 -0
  180. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/gff3_gene_annotations.md +0 -0
  181. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/gff3_gene_annotations.py +0 -0
  182. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/hcc1954_sv_cnv.md +0 -0
  183. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/hcc1954_sv_cnv.py +0 -0
  184. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/heatmap_with_text.md +0 -0
  185. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/heatmap_with_text.py +0 -0
  186. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/independent_scales.md +0 -0
  187. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/independent_scales.py +0 -0
  188. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/indexed_fasta_sequence.py +0 -0
  189. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/layered_lollipop.md +0 -0
  190. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/layered_lollipop.py +0 -0
  191. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/link_mark.py +0 -0
  192. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/luad_oncoprint.md +0 -0
  193. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/luad_oncoprint.py +0 -0
  194. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/manhattan_plot.md +0 -0
  195. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/manhattan_plot.py +0 -0
  196. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/multiple_sequence_alignment.md +0 -0
  197. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/multiple_sequence_alignment.py +0 -0
  198. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/needle_plot.py +0 -0
  199. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/oncoprint.md +0 -0
  200. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/oncoprint.py +0 -0
  201. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/p53_sequence_comparison.md +0 -0
  202. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/p53_sequence_comparison.py +0 -0
  203. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_cell_heatmap.md +0 -0
  204. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_cell_heatmap.py +0 -0
  205. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_expression_tracks.md +0 -0
  206. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_expression_tracks.py +0 -0
  207. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_marker_matrix.md +0 -0
  208. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_marker_matrix.py +0 -0
  209. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap.md +0 -0
  210. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap.py +0 -0
  211. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap_genes.md +0 -0
  212. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pbmc_umap_genes.py +0 -0
  213. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/penguin_brush.md +0 -0
  214. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/penguin_brush.py +0 -0
  215. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  216. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pik3ca_tcga_brca_lollipop.py +0 -0
  217. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_interaction_matrix.md +0 -0
  218. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_interaction_matrix.py +0 -0
  219. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_squid.md +0 -0
  220. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/pisa_squid.py +0 -0
  221. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_mark.md +0 -0
  222. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_mark.py +0 -0
  223. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_styles.md +0 -0
  224. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/point_styles.py +0 -0
  225. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rainfall_plot.md +0 -0
  226. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rainfall_plot.py +0 -0
  227. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/ranged_rule.py +0 -0
  228. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rect_heatmap.md +0 -0
  229. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rect_heatmap.py +0 -0
  230. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/refseq_scored_genes.md +0 -0
  231. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/refseq_scored_genes.py +0 -0
  232. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rnf7_direct_rna.md +0 -0
  233. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/rnf7_direct_rna.py +0 -0
  234. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/sashimi_plot.md +0 -0
  235. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/sashimi_plot.py +0 -0
  236. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/scrollable_viewport.py +0 -0
  237. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/sequence_logo.py +0 -0
  238. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/six_frame_translation.md +0 -0
  239. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/six_frame_translation.py +0 -0
  240. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/stacked_bar.md +0 -0
  241. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/stacked_bar.py +0 -0
  242. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/stacked_genome_browser.py +0 -0
  243. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tcga_ov_gistic.md +0 -0
  244. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tcga_ov_gistic.py +0 -0
  245. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tsne.md +0 -0
  246. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/tsne.py +0 -0
  247. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/upset_mutations.md +0 -0
  248. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/upset_mutations.py +0 -0
  249. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/vertical_concat.md +0 -0
  250. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/vertical_concat.py +0 -0
  251. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/volcano_plot.md +0 -0
  252. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/examples/volcano_plot.py +0 -0
  253. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/getting-started.md +0 -0
  254. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/index.md +0 -0
  255. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/component.py +0 -0
  256. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/index.html +0 -0
  257. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/notebook.ipynb +0 -0
  258. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integration/server.py +0 -0
  259. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/index.md +0 -0
  260. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/api.md +0 -0
  261. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/export.md +0 -0
  262. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/expression.md +0 -0
  263. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/index.md +0 -0
  264. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/linked_expression.md +0 -0
  265. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/paga.md +0 -0
  266. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/pca.md +0 -0
  267. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/profiles.md +0 -0
  268. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/quality.md +0 -0
  269. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/ranked.md +0 -0
  270. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/supported.md +0 -0
  271. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/tracks.md +0 -0
  272. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/integrations/scanpy/umap.md +0 -0
  273. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/annotations.py +0 -0
  274. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/charts_and_marks.py +0 -0
  275. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/composition.py +0 -0
  276. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/configuration.py +0 -0
  277. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/data_inputs.py +0 -0
  278. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/display_controls.py +0 -0
  279. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/encoding_channels.py +0 -0
  280. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/expressions.py +0 -0
  281. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/genome_browser_layouts.py +0 -0
  282. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/genomic_coordinates.py +0 -0
  283. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/genomic_data.py +0 -0
  284. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/getting_started.py +0 -0
  285. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/importing_specifications.py +0 -0
  286. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/interaction.py +0 -0
  287. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/notebooks.py +0 -0
  288. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/scales_and_guides.py +0 -0
  289. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/serialization.py +0 -0
  290. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/tutorials/transforms.py +0 -0
  291. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/annotations.md +0 -0
  292. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/charts.md +0 -0
  293. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/composition.md +0 -0
  294. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/configuration.md +0 -0
  295. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/connect-python.md +0 -0
  296. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/data.md +0 -0
  297. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/display-controls.md +0 -0
  298. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/embed-api.md +0 -0
  299. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/encodings.md +0 -0
  300. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/expressions.md +0 -0
  301. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/genome-browser-layouts.md +0 -0
  302. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/genomic-axes.md +0 -0
  303. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/genomic-data.md +0 -0
  304. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/importing-specifications.md +0 -0
  305. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/index.md +0 -0
  306. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/interaction.md +0 -0
  307. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/scales-axes-legends.md +0 -0
  308. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/serialization.md +0 -0
  309. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/transforms.md +0 -0
  310. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/using-charts.md +0 -0
  311. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/annotate-intervals.md +0 -0
  312. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/edit-sequence.md +0 -0
  313. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/index.md +0 -0
  314. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/pick-genes.md +0 -0
  315. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/docs/user-guide/workflows/select-genes.md +0 -0
  316. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/README.md +0 -0
  317. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/COMPATIBILITY.md +0 -0
  318. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/FUTURE.md +0 -0
  319. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/PLAN.md +0 -0
  320. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/README.md +0 -0
  321. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/STATUS.md +0 -0
  322. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/export.ipynb +0 -0
  323. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/expression.ipynb +0 -0
  324. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/linked_expression.ipynb +0 -0
  325. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/paga.ipynb +0 -0
  326. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/pca.ipynb +0 -0
  327. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/profiles.ipynb +0 -0
  328. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/quality.ipynb +0 -0
  329. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/ranked.ipynb +0 -0
  330. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/tracks.ipynb +0 -0
  331. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/guides/umap.ipynb +0 -0
  332. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/notebooks/scanpy_expression.ipynb +0 -0
  333. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/notebooks/scanpy_umap.ipynb +0 -0
  334. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/integrations/scanpy/prepare_guide_data.py +0 -0
  335. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/annotate_genomic_intervals.ipynb +0 -0
  336. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
  337. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/edit_sequence.ipynb +0 -0
  338. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/embed_api.ipynb +0 -0
  339. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/penguin_python_roundtrip.ipynb +0 -0
  340. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/pick_genes.ipynb +0 -0
  341. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/notebooks/select_genes.ipynb +0 -0
  342. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/SKILL.md +0 -0
  343. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/agents/openai.yaml +0 -0
  344. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/references/grouped-charts.md +0 -0
  345. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/skills/create-genomespy-visualization/references/table-chart.md +0 -0
  346. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_chart_authoring.py +0 -0
  347. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_conditions.py +0 -0
  348. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_embed.py +0 -0
  349. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_expressions.py +0 -0
  350. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_parameters.py +0 -0
  351. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_render.py +0 -0
  352. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_skill_install.py +0 -0
  353. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_utils.py +0 -0
  354. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/_widget.py +0 -0
  355. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/anndata.py +0 -0
  356. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/api.py +0 -0
  357. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/arrow.py +0 -0
  358. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/channels.py +0 -0
  359. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/chart.py +0 -0
  360. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/data.py +0 -0
  361. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/data_transformers.py +0 -0
  362. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/__init__.py +0 -0
  363. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_airway.py +0 -0
  364. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_annotations.py +0 -0
  365. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_direct_rna.py +0 -0
  366. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_gistic.py +0 -0
  367. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_grammar.py +0 -0
  368. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_hapmap.py +0 -0
  369. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_mutation.py +0 -0
  370. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_oncoprint.py +0 -0
  371. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/_pbmc.py +0 -0
  372. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  373. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
  374. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  375. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  376. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  377. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  378. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  379. {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
  380. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
  381. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  382. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  383. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  384. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
  385. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  386. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  387. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  388. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  389. {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
  390. {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
  391. {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
  392. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/embed.py +0 -0
  393. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/helpers.py +0 -0
  394. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/__init__.py +0 -0
  395. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/__init__.py +0 -0
  396. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_data.py +0 -0
  397. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_dendrogram_chart.py +0 -0
  398. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_dendrogram_data.py +0 -0
  399. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/__init__.py +0 -0
  400. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/chart.py +0 -0
  401. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/data.py +0 -0
  402. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/density_data.py +0 -0
  403. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/interactions.py +0 -0
  404. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/scatter_data.py +0 -0
  405. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/selection.py +0 -0
  406. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/summary_builder.py +0 -0
  407. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/summary_chart.py +0 -0
  408. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_embedding/summary_data.py +0 -0
  409. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/__init__.py +0 -0
  410. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/clustermap_chart.py +0 -0
  411. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/clustermap_data.py +0 -0
  412. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/colors.py +0 -0
  413. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/correlation_chart.py +0 -0
  414. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/dotplot_builder.py +0 -0
  415. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/dotplot_chart.py +0 -0
  416. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/grouped_builder.py +0 -0
  417. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/grouped_chart.py +0 -0
  418. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/grouped_data.py +0 -0
  419. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/heatmap_chart.py +0 -0
  420. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/matrix_chart.py +0 -0
  421. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/matrixplot_builder.py +0 -0
  422. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/matrixplot_chart.py +0 -0
  423. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_expression/tracksplot_chart.py +0 -0
  424. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_grid_interactions.py +0 -0
  425. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_guards.py +0 -0
  426. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_labels.py +0 -0
  427. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/__init__.py +0 -0
  428. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/chart.py +0 -0
  429. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/data.py +0 -0
  430. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/path_chart.py +0 -0
  431. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_paga/path_data.py +0 -0
  432. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/__init__.py +0 -0
  433. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/highest_expr_chart.py +0 -0
  434. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/highest_expr_data.py +0 -0
  435. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/hvg_chart.py +0 -0
  436. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/scrublet_chart.py +0 -0
  437. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_qc/scrublet_data.py +0 -0
  438. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_ranking/__init__.py +0 -0
  439. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_ranking/chart.py +0 -0
  440. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_ranking/data.py +0 -0
  441. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_style.py +0 -0
  442. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_timeseries/__init__.py +0 -0
  443. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_timeseries/chart.py +0 -0
  444. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/_timeseries/data.py +0 -0
  445. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/integrations/scanpy/pl.py +0 -0
  446. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/jupyter.py +0 -0
  447. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/py.typed +0 -0
  448. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/__init__.py +0 -0
  449. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/_kwds.py +0 -0
  450. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/_typing.py +0 -0
  451. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/capabilities.json +0 -0
  452. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/channels.py +0 -0
  453. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/composition.py +0 -0
  454. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/core.py +0 -0
  455. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/ergonomics.py +0 -0
  456. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/expressions.py +0 -0
  457. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/genome-spy-schema.json +0 -0
  458. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/lazy.py +0 -0
  459. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schema/mixins.py +0 -0
  460. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/schemapi.py +0 -0
  461. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/controls.js +0 -0
  462. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/embed-bridge.js +0 -0
  463. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/genome-spy.js +0 -0
  464. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/inspector.js +0 -0
  465. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/src/genome_spy/static/widget.js +0 -0
  466. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/__init__.py +0 -0
  467. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/__init__.py +0 -0
  468. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_core_upgrade.py +0 -0
  469. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_composition.py +0 -0
  470. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_linked_expression.py +0 -0
  471. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_notebook.py +0 -0
  472. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_theme.py +0 -0
  473. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_docs_workflows.py +0 -0
  474. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_embed_api.py +0 -0
  475. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/browser/test_python_web_example.py +0 -0
  476. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/embed-bridge.test.mjs +0 -0
  477. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/README.md +0 -0
  478. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +0 -0
  479. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/clustered-heatmap.json +0 -0
  480. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/fixtures/upstream_examples/upsetr-mutations.json +0 -0
  481. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/__init__.py +0 -0
  482. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/__init__.py +0 -0
  483. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/__init__.py +0 -0
  484. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/conftest.py +0 -0
  485. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/interactions.py +0 -0
  486. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/references.py +0 -0
  487. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/rendering.py +0 -0
  488. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_dendrogram.py +0 -0
  489. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_dpt.py +0 -0
  490. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_embedding_style.py +0 -0
  491. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_embeddings.py +0 -0
  492. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_grid_interactions.py +0 -0
  493. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_grouped_builders.py +0 -0
  494. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_grouped_expression.py +0 -0
  495. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_heatmaps.py +0 -0
  496. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_linked_embeddings.py +0 -0
  497. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_paga.py +0 -0
  498. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_paga_adjacency.py +0 -0
  499. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_paga_path.py +0 -0
  500. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_pca.py +0 -0
  501. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_profiles.py +0 -0
  502. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_qc.py +0 -0
  503. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/browser/test_ranked.py +0 -0
  504. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/embedding_fixtures.py +0 -0
  505. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/expression_fixtures.py +0 -0
  506. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/README.md +0 -0
  507. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/api.json +0 -0
  508. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/clustermap.json +0 -0
  509. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/dendrogram.json +0 -0
  510. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/dotplot.json +0 -0
  511. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/embedding.json +0 -0
  512. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/grouped.json +0 -0
  513. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/heatmap.json +0 -0
  514. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/matrix.json +0 -0
  515. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/matrixplot.json +0 -0
  516. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/ranked.json +0 -0
  517. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/scatter.json +0 -0
  518. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/fixtures/umap.json +0 -0
  519. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/grid_fixture_support.py +0 -0
  520. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/helpers.py +0 -0
  521. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/paga_fixtures.py +0 -0
  522. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/profile_fixtures.py +0 -0
  523. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/qc_fixtures.py +0 -0
  524. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/ranked_fixture.py +0 -0
  525. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_contract.py +0 -0
  526. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_dendrogram.py +0 -0
  527. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_dpt.py +0 -0
  528. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_embedding_style.py +0 -0
  529. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_embeddings.py +0 -0
  530. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_grid_interactions.py +0 -0
  531. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_grouped_builders.py +0 -0
  532. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_grouped_expression.py +0 -0
  533. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_heatmaps.py +0 -0
  534. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_linked_embeddings.py +0 -0
  535. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_notebooks.py +0 -0
  536. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_paga.py +0 -0
  537. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_paga_adjacency.py +0 -0
  538. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_paga_path.py +0 -0
  539. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_pca.py +0 -0
  540. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_profiles.py +0 -0
  541. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_qc.py +0 -0
  542. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/integrations/scanpy/test_ranked.py +0 -0
  543. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_agent_docs.py +0 -0
  544. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_anndata.py +0 -0
  545. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_arrow.py +0 -0
  546. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_combined_gallery_data.py +0 -0
  547. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_conditions.py +0 -0
  548. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_data_transformers.py +0 -0
  549. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_datasets.py +0 -0
  550. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_distribution.py +0 -0
  551. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_api_reference.py +0 -0
  552. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_linked_expression.py +0 -0
  553. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_notebook.py +0 -0
  554. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_docs_tutorial.py +0 -0
  555. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_embed.py +0 -0
  556. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_embed_notebook.py +0 -0
  557. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_expressions.py +0 -0
  558. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_generated_schema_package.py +0 -0
  559. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_generated_transform_methods.py +0 -0
  560. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_javascript_assets.py +0 -0
  561. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_licensing.py +0 -0
  562. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_new_compositions.py +0 -0
  563. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_pbmc_gallery.py +0 -0
  564. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_pisa_gallery.py +0 -0
  565. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_python_connection_example.py +0 -0
  566. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_render_thumbnails.py +0 -0
  567. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_rnf7_direct_rna_example.py +0 -0
  568. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_scanpy_imports.py +0 -0
  569. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_schema_codegen.py +0 -0
  570. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_skill_install.py +0 -0
  571. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_widget.py +0 -0
  572. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/test_workflow_notebooks.py +0 -0
  573. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tests/widget.test.mjs +0 -0
  574. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/agent_docs.py +0 -0
  575. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/agent_markdown.py +0 -0
  576. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/docs_workflows.py +0 -0
  577. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/generate_api_docs.py +0 -0
  578. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/generate_schema_wrapper.py +0 -0
  579. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_airway_review.py +0 -0
  580. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_combined_gallery_data.py +0 -0
  581. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_pbmc_gallery_data.py +0 -0
  582. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/prepare_refseq_gene_annotations.py +0 -0
  583. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/render_thumbnails.py +0 -0
  584. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/schemapi/__init__.py +0 -0
  585. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/schemapi/codegen.py +0 -0
  586. {genome_spy_python-0.8.0 → genome_spy_python-0.8.1}/tools/schemapi/expression_codegen.py +0 -0
  587. {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: ${{ runner.temp }}/scanpy-browser
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.png
255
- ${{ runner.temp }}/embed-api.png
256
- ${{ runner.temp }}/annotate-intervals.png
257
- ${{ runner.temp }}/select-genes.png
258
- ${{ runner.temp }}/pick-genes.png
259
- ${{ runner.temp }}/edit-sequence.png
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.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/
@@ -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 = f"height:{example.height}px"
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. Fractional dendrogram
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": 760,
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=gs.SizeDef(grow=0.2))
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.0"
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"
@@ -253,4 +253,4 @@ __all__ = [
253
253
  # END GENERATED INTERACTION EXPORTS
254
254
  ]
255
255
 
256
- __version__ = "0.8.0"
256
+ __version__ = "0.8.1"
@@ -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()
@@ -61,7 +61,7 @@ from genome_spy.schemapi import SchemaBase, SchemaValidationError
61
61
 
62
62
 
63
63
  def test_package_exposes_version() -> None:
64
- assert gs.__version__ == "0.8.0"
64
+ assert gs.__version__ == "0.8.1"
65
65
 
66
66
 
67
67
  def test_public_api_exports_are_unique() -> None:
@@ -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
- assert _structure(spec) == _structure(reference)
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)