genome-spy-python 0.1.0__tar.gz → 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (271) hide show
  1. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.github/workflows/ci.yml +29 -0
  2. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/CHANGELOG.md +19 -0
  3. genome_spy_python-0.2.0/CONTRIBUTING.md +201 -0
  4. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/PKG-INFO +8 -2
  5. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/README.md +6 -0
  6. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +5 -1
  7. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/notebooks.md +8 -0
  8. genome_spy_python-0.2.0/notebooks/brush_linked_genome_tracks.ipynb +355 -0
  9. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/pyproject.toml +2 -2
  10. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/__init__.py +1 -1
  11. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/__init__.py +1 -1
  12. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/expressions.py +18 -6
  13. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_chart.py +1 -1
  14. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_docs_gallery.py +10 -1
  15. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_expressions.py +34 -0
  16. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_generated_schema_package.py +29 -0
  17. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_schema_codegen.py +2 -0
  18. genome_spy_python-0.2.0/tools/check_notebook_rendering.py +145 -0
  19. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/schemapi/codegen.py +13 -7
  20. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/uv.lock +2 -2
  21. genome_spy_python-0.1.0/CONTRIBUTING.md +0 -218
  22. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.agents/skills/commit/SKILL.md +0 -0
  23. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.agents/skills/proper-code-review/SKILL.md +0 -0
  24. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  25. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.agents/skills/proper-code-review/references/design.md +0 -0
  26. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
  27. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.claude/skills/commit/SKILL.md +0 -0
  28. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
  29. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  30. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.claude/skills/proper-code-review/references/design.md +0 -0
  31. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
  32. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.gitattributes +0 -0
  33. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.github/workflows/docs.yml +0 -0
  34. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.github/workflows/release.yml +0 -0
  35. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.gitignore +0 -0
  36. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.pre-commit-config.yaml +0 -0
  37. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/.python-version +0 -0
  38. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/AGENTS.md +0 -0
  39. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/CLAUDE.md +0 -0
  40. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/LICENSE +0 -0
  41. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  42. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/LICENSES/GALLERY-DATA-MIT.txt +0 -0
  43. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/THIRD_PARTY_NOTICES.md +0 -0
  44. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_ext/genomespy_gallery.py +0 -0
  45. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/data/README.md +0 -0
  46. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/data/airway_metadata.csv +0 -0
  47. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
  48. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/data/hapmap_gwas.csv +0 -0
  49. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
  50. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/data/pik3ca_mutations.json +0 -0
  51. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/external-links.js +0 -0
  52. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/airway_ma_plot.png +0 -0
  53. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/airway_volcano_plot.png +0 -0
  54. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
  55. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/ascat_fitting.png +0 -0
  56. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
  57. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  58. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  59. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/clinvar_variants.png +0 -0
  60. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  61. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
  62. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/copy_number.png +0 -0
  63. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/cytobands.png +0 -0
  64. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  65. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/genome_tracks.png +0 -0
  66. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  67. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  68. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  69. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/link_mark.png +0 -0
  70. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
  71. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/manhattan_plot.png +0 -0
  72. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  73. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/needle_plot.png +0 -0
  74. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/oncoprint.png +0 -0
  75. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  76. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  77. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/point_mark.png +0 -0
  78. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/rainfall_plot.png +0 -0
  79. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/ranged_rule.png +0 -0
  80. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/rect_heatmap.png +0 -0
  81. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  82. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/sashimi_plot.png +0 -0
  83. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
  84. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/sequence_logo.png +0 -0
  85. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/six_frame_translation.png +0 -0
  86. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  87. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  88. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/upset_mutations.png +0 -0
  89. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/vertical_concat.png +0 -0
  90. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/gallery/volcano_plot.png +0 -0
  91. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/genomespy.css +0 -0
  92. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_static/snaketie.svg +0 -0
  93. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_templates/autosummary/class.rst +0 -0
  94. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
  95. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/_templates/components/view-this-page.html +0 -0
  96. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/about.md +0 -0
  97. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/api.md +0 -0
  98. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/conf.py +0 -0
  99. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/datasets.md +0 -0
  100. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/airway_ma_plot.md +0 -0
  101. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/airway_ma_plot.py +0 -0
  102. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/airway_volcano_plot.md +0 -0
  103. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/airway_volcano_plot.py +0 -0
  104. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/ascat_copy_number.md +0 -0
  105. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/ascat_copy_number.py +0 -0
  106. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/ascat_fitting.md +0 -0
  107. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/ascat_fitting.py +0 -0
  108. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/bam_read_alignments.md +0 -0
  109. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/bam_read_alignments.py +0 -0
  110. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/bigbed_ccre_track.py +0 -0
  111. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
  112. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/brush_linked_genome_tracks.py +0 -0
  113. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/clinvar_variants.md +0 -0
  114. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/clinvar_variants.py +0 -0
  115. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/combined_laml_oncoplot.md +0 -0
  116. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/combined_laml_oncoplot.py +0 -0
  117. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/composing_genome_browser.md +0 -0
  118. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/composing_genome_browser.py +0 -0
  119. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/copy_number.py +0 -0
  120. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/cytobands.md +0 -0
  121. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/cytobands.py +0 -0
  122. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/dynseq_bqtl.md +0 -0
  123. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/dynseq_bqtl.py +0 -0
  124. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/genome_tracks.py +0 -0
  125. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/gff3_gene_annotations.md +0 -0
  126. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/gff3_gene_annotations.py +0 -0
  127. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
  128. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/hcc1954_sv_cnv.py +0 -0
  129. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/indexed_fasta_sequence.py +0 -0
  130. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/link_mark.py +0 -0
  131. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/luad_oncoprint.md +0 -0
  132. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/luad_oncoprint.py +0 -0
  133. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/manhattan_plot.md +0 -0
  134. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/manhattan_plot.py +0 -0
  135. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/multiple_sequence_alignment.md +0 -0
  136. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/multiple_sequence_alignment.py +0 -0
  137. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/needle_plot.py +0 -0
  138. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/oncoprint.md +0 -0
  139. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/oncoprint.py +0 -0
  140. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/p53_sequence_comparison.md +0 -0
  141. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/p53_sequence_comparison.py +0 -0
  142. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  143. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/point_mark.py +0 -0
  144. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/rainfall_plot.md +0 -0
  145. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/rainfall_plot.py +0 -0
  146. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/ranged_rule.py +0 -0
  147. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/rect_heatmap.py +0 -0
  148. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/refseq_scored_genes.md +0 -0
  149. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/refseq_scored_genes.py +0 -0
  150. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/sashimi_plot.md +0 -0
  151. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/sashimi_plot.py +0 -0
  152. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/scrollable_viewport.py +0 -0
  153. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/sequence_logo.py +0 -0
  154. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/six_frame_translation.md +0 -0
  155. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/six_frame_translation.py +0 -0
  156. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/stacked_genome_browser.py +0 -0
  157. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/tcga_ov_gistic.md +0 -0
  158. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/tcga_ov_gistic.py +0 -0
  159. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/upset_mutations.md +0 -0
  160. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/upset_mutations.py +0 -0
  161. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/vertical_concat.py +0 -0
  162. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/volcano_plot.md +0 -0
  163. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/examples/volcano_plot.py +0 -0
  164. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/getting-started.md +0 -0
  165. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/index.md +0 -0
  166. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/annotations.py +0 -0
  167. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/charts_and_marks.py +0 -0
  168. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/composition.py +0 -0
  169. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/configuration.py +0 -0
  170. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/data_inputs.py +0 -0
  171. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/display_controls.py +0 -0
  172. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/encoding_channels.py +0 -0
  173. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/genome_browser_layouts.py +0 -0
  174. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/genomic_coordinates.py +0 -0
  175. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/genomic_data.py +0 -0
  176. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/getting_started.py +0 -0
  177. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/importing_specifications.py +0 -0
  178. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/interaction.py +0 -0
  179. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/notebooks.py +0 -0
  180. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/scales_and_guides.py +0 -0
  181. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/serialization.py +0 -0
  182. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/tutorials/transforms.py +0 -0
  183. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/annotations.md +0 -0
  184. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/charts.md +0 -0
  185. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/composition.md +0 -0
  186. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/configuration.md +0 -0
  187. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/data.md +0 -0
  188. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/display-controls.md +0 -0
  189. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/encodings.md +0 -0
  190. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/genome-browser-layouts.md +0 -0
  191. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/genomic-axes.md +0 -0
  192. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/genomic-data.md +0 -0
  193. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/importing-specifications.md +0 -0
  194. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/index.md +0 -0
  195. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/interaction.md +0 -0
  196. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/scales-axes-legends.md +0 -0
  197. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/serialization.md +0 -0
  198. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/docs/user-guide/transforms.md +0 -0
  199. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_chart_authoring.py +0 -0
  200. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_conditions.py +0 -0
  201. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_embed.py +0 -0
  202. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_expressions.py +0 -0
  203. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_parameters.py +0 -0
  204. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_render.py +0 -0
  205. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_utils.py +0 -0
  206. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/_widget.py +0 -0
  207. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/api.py +0 -0
  208. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/arrow.py +0 -0
  209. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/channels.py +0 -0
  210. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/chart.py +0 -0
  211. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/data.py +0 -0
  212. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/data_transformers.py +0 -0
  213. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_airway.py +0 -0
  214. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_annotations.py +0 -0
  215. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_gistic.py +0 -0
  216. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_grammar.py +0 -0
  217. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_hapmap.py +0 -0
  218. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_mutation.py +0 -0
  219. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
  220. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  221. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  222. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  223. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  224. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  225. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  226. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/p53_sequence_comparison.json.gz +0 -0
  227. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  228. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  229. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  230. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  231. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  232. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  233. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  234. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
  235. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
  236. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
  237. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/helpers.py +0 -0
  238. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/jupyter.py +0 -0
  239. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/py.typed +0 -0
  240. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/__init__.py +0 -0
  241. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/_kwds.py +0 -0
  242. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/_typing.py +0 -0
  243. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/capabilities.json +0 -0
  244. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/channels.py +0 -0
  245. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/composition.py +0 -0
  246. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/core.py +0 -0
  247. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/ergonomics.py +0 -0
  248. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/genome-spy-schema.json +0 -0
  249. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/lazy.py +0 -0
  250. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schema/mixins.py +0 -0
  251. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/schemapi.py +0 -0
  252. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/src/genome_spy/static/widget.js +0 -0
  253. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/__init__.py +0 -0
  254. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_arrow.py +0 -0
  255. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_combined_gallery_data.py +0 -0
  256. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_data_transformers.py +0 -0
  257. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_datasets.py +0 -0
  258. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_docs_api_reference.py +0 -0
  259. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_docs_tutorial.py +0 -0
  260. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_generated_transform_methods.py +0 -0
  261. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_render_thumbnails.py +0 -0
  262. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/test_widget.py +0 -0
  263. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tests/widget.test.mjs +0 -0
  264. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/docs_gallery.py +0 -0
  265. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/generate_api_docs.py +0 -0
  266. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/generate_schema_wrapper.py +0 -0
  267. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/prepare_combined_gallery_data.py +0 -0
  268. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/prepare_refseq_gene_annotations.py +0 -0
  269. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/render_thumbnails.py +0 -0
  270. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/schemapi/__init__.py +0 -0
  271. {genome_spy_python-0.1.0 → genome_spy_python-0.2.0}/tools/schemapi/expression_codegen.py +0 -0
@@ -68,3 +68,32 @@ jobs:
68
68
  - run: uv run python tools/generate_schema_wrapper.py
69
69
  - run: uv run ruff format src/genome_spy/schema src/genome_spy/helpers.py src/genome_spy/api.py src/genome_spy/__init__.py
70
70
  - run: git diff --exit-code src/genome_spy/schema src/genome_spy/helpers.py src/genome_spy/api.py src/genome_spy/__init__.py tools
71
+
72
+ notebook-rendering:
73
+ runs-on: ubuntu-latest
74
+ timeout-minutes: 10
75
+ steps:
76
+ - uses: actions/checkout@v7
77
+ - uses: astral-sh/setup-uv@v9.0.0
78
+ with:
79
+ python-version: "3.11"
80
+ - run: uv build --wheel
81
+ - name: Install the wheel with the minimum supported AnyWidget
82
+ run: |
83
+ uv venv --seed --python 3.11 "$RUNNER_TEMP/notebook-env"
84
+ for wheel in "$GITHUB_WORKSPACE"/dist/*.whl; do
85
+ uv pip install --python "$RUNNER_TEMP/notebook-env/bin/python" \
86
+ "$wheel[arrow]" "anywidget==0.11.0" jupyterlab pandas numpy playwright pillow
87
+ done
88
+ "$RUNNER_TEMP/notebook-env/bin/python" -m playwright install --with-deps chromium
89
+ - name: Render the brush notebook in JupyterLab
90
+ run: |
91
+ "$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
92
+ notebooks/brush_linked_genome_tracks.ipynb \
93
+ --screenshot "$RUNNER_TEMP/notebook-rendering.png"
94
+ - uses: actions/upload-artifact@v7
95
+ if: always()
96
+ with:
97
+ name: notebook-rendering
98
+ path: ${{ runner.temp }}/notebook-rendering.png
99
+ if-no-files-found: ignore
@@ -5,6 +5,24 @@ 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.2.0] - 2026-09-09
9
+
10
+ ### Added
11
+
12
+ - Python lists and tuples in `gs.expr()` for array expressions containing
13
+ values, parameters, and calculations.
14
+ - A brush-linked notebook example with an Open in Colab link in the README.
15
+
16
+ ### Changed
17
+
18
+ - Require AnyWidget 0.11.0 or newer to match the widget lifecycle API used for rendering.
19
+ - Simplified the contributing guide and added brief notebook troubleshooting advice.
20
+
21
+ ### Fixed
22
+
23
+ - PIK3CA lollipop connectors now reach the protein track.
24
+ - Packaged datasets can be imported on Python 3.14.
25
+
8
26
  ## [0.1.0] - 2026-09-09
9
27
 
10
28
  First public alpha release, targeting GenomeSpy Core 0.87.0.
@@ -27,4 +45,5 @@ First public alpha release, targeting GenomeSpy Core 0.87.0.
27
45
  - Packaged example datasets, documentation, tutorials, and an interactive
28
46
  visualization gallery.
29
47
 
48
+ [0.2.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.1.0...v0.2.0
30
49
  [0.1.0]: https://github.com/genome-spy/genome-spy-python/releases/tag/v0.1.0
@@ -0,0 +1,201 @@
1
+ # Contributing to genome-spy-python
2
+
3
+ Bug reports, documentation, examples, tests, and code contributions are welcome.
4
+
5
+ ## How to contribute
6
+
7
+ Open an issue before starting a large change. Small fixes can go straight to a
8
+ pull request.
9
+
10
+ Explain what your pull request changes and why. Keep unrelated changes separate,
11
+ and update tests and docs when behavior or the public API changes.
12
+
13
+ ## Development setup
14
+
15
+ Use Python 3.11 or newer and [`uv`](https://docs.astral.sh/uv/). Install the
16
+ development and docs dependencies from the repository root:
17
+
18
+ ```bash
19
+ uv sync --group dev --group docs
20
+ ```
21
+
22
+ Main directories:
23
+
24
+ - `src/genome_spy/` — library code
25
+ - `tests/` — tests
26
+ - `docs/examples/` — gallery examples
27
+ - `tools/` — code and documentation generators
28
+
29
+ Install pre-commit hooks to check changes before committing:
30
+
31
+ ```bash
32
+ uv run pre-commit install
33
+ ```
34
+
35
+ ## Coding practices
36
+
37
+ ### Python and typing
38
+
39
+ Use type hints such as `list[T]`, `dict[K, V]`, and `X | Y` for public APIs.
40
+ Add Google-style docstrings covering purpose, arguments, results, exceptions,
41
+ and an example. Keep file, network, and notebook code separate from core logic.
42
+
43
+ Keep changes small. Prefer generating APIs from the GenomeSpy schema over
44
+ adding handwritten alternatives.
45
+
46
+ ### Formatting and linting
47
+
48
+ Format and lint with [Ruff](https://docs.astral.sh/ruff/):
49
+
50
+ ```bash
51
+ uv run ruff format .
52
+ uv run ruff check .
53
+ ```
54
+
55
+ Check types after changing library code:
56
+
57
+ ```bash
58
+ uv run mypy src/
59
+ ```
60
+
61
+ ### Testing
62
+
63
+ Add a focused test for each behavior change. Run the Python tests with:
64
+
65
+ ```bash
66
+ uv run pytest tests/ -x
67
+ ```
68
+
69
+ Run the widget's JavaScript tests with:
70
+
71
+ ```bash
72
+ node --test tests/widget.test.mjs
73
+ ```
74
+
75
+ Run the checks relevant to your changes before submitting a pull request.
76
+ CI also checks generated code, docs, and the installed package.
77
+
78
+ ### Performance
79
+
80
+ Avoid unnecessary data copies and large chart specifications. Measure performance
81
+ before adding complexity to make code faster.
82
+
83
+ ## Generated schema and expression APIs
84
+
85
+ Do not edit generated files in `src/genome_spy/schema/` by hand. The generator
86
+ uses the GenomeSpy version in `pyproject.toml`, its schema, and the matching
87
+ GenomeSpy and Vega expression documentation.
88
+
89
+ Regenerate after changing that version or the generator:
90
+
91
+ ```bash
92
+ uv run python tools/generate_schema_wrapper.py
93
+ ```
94
+
95
+ This requires `npm` and internet access. Use `--package-dir` for a local package,
96
+ or both `--genome-spy-expression-docs` and `--vega-expression-docs` for local
97
+ expression docs.
98
+
99
+ Then check the results:
100
+
101
+ ```bash
102
+ uv run pytest tests/test_schema_codegen.py -x
103
+ uv run ruff format src/genome_spy/schema src/genome_spy/helpers.py src/genome_spy/api.py src/genome_spy/__init__.py
104
+ git diff --check
105
+ ```
106
+
107
+ Review and commit the generated files alongside your changes. CI checks that
108
+ regenerating them produces no differences.
109
+
110
+ New transforms should be generated from the schema. Add overrides in
111
+ `tools/generate_schema_wrapper.py` only for Python conventions the schema
112
+ cannot describe.
113
+
114
+ ## Documentation
115
+
116
+ ### API reference
117
+
118
+ After changing the public API, regenerate `docs/api.md` from `genome_spy.__all__`:
119
+
120
+ ```bash
121
+ uv run python tools/generate_api_docs.py
122
+ ```
123
+
124
+ Sphinx creates the individual pages in `docs/generated/`; do not commit them.
125
+
126
+ ### Build and preview
127
+
128
+ Build the docs and check for warnings:
129
+
130
+ ```bash
131
+ uv run sphinx-build -b html -W --keep-going docs docs/_build/html
132
+ ```
133
+
134
+ Rerun the same command to rebuild changed pages and examples. Keep `docs/_build/`
135
+ and avoid `-E` and `-a` for faster builds. Changes to shared code, data, build
136
+ tools, or the lockfile regenerate all examples.
137
+
138
+ To force example regeneration, delete the gallery cache (normally
139
+ `docs/_build/html/.doctrees/genomespy-gallery`). Changes to remote data or files
140
+ outside the tracked dependencies are not detected automatically.
141
+
142
+ Preview locally:
143
+
144
+ ```bash
145
+ cd docs/_build/html
146
+ python3 -m http.server
147
+ ```
148
+
149
+ Open <http://localhost:8000>. Interactive examples need internet access to load
150
+ GenomeSpy.
151
+
152
+ ### Gallery examples
153
+
154
+ Write examples in `docs/examples/`. Put explanations, data sources, any
155
+ necessary disclaimers, and upstream links in an optional Markdown file with
156
+ the same name.
157
+
158
+ Focus on plotting, not data preparation: load prepared packaged datasets and
159
+ prefer Python expressions such as `gs.datum.score > 0`. Remember that
160
+ `.transform_*()` defines work that GenomeSpy runs in the browser, not Python.
161
+
162
+ After editing an example, run:
163
+
164
+ ```bash
165
+ uv run pytest tests/test_docs_gallery.py -q
166
+ uv run sphinx-build -b html -W --keep-going docs docs/_build/html
167
+ ```
168
+
169
+ Check the chart visually before updating its committed thumbnail.
170
+
171
+ ### Notebook rendering
172
+
173
+ CI checks that the brush notebook renders in a fresh environment. Follow
174
+ [the workflow](.github/workflows/ci.yml) for setup, then run with that
175
+ environment's Python:
176
+
177
+ ```bash
178
+ python -m playwright install chromium
179
+ python tools/check_notebook_rendering.py notebooks/brush_linked_genome_tracks.ipynb --screenshot /tmp/notebook-rendering.png
180
+ ```
181
+
182
+ ## Commit guidelines
183
+
184
+ Keep each commit focused on one change. Use
185
+ [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/):
186
+
187
+ ```text
188
+ feat(expressions): generate runtime helpers
189
+ fix(widget): preserve zoom during data updates
190
+ docs(gallery): add a sequence example
191
+ ```
192
+
193
+ Do not rewrite shared history unless reviewers ask you to.
194
+
195
+ ## Community and communication
196
+
197
+ Report wrapper bugs and request features in the
198
+ [Python package issue tracker](https://github.com/genome-spy/genome-spy-python/issues).
199
+ For GenomeSpy's grammar or renderer, use the upstream
200
+ [discussions](https://github.com/genome-spy/genome-spy/discussions) or
201
+ [issues](https://github.com/genome-spy/genome-spy/issues).
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: genome-spy-python
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: genome-spy-python is a declarative genomics visualization library for Python, built on top of the genome-spy JSON specification.
5
5
  Project-URL: Homepage, https://github.com/genome-spy/genome-spy-python
6
6
  Project-URL: Documentation, https://genomespy.app/genome-spy-python/
@@ -23,7 +23,7 @@ Classifier: Programming Language :: Python :: 3.13
23
23
  Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
24
24
  Classifier: Topic :: Scientific/Engineering :: Visualization
25
25
  Requires-Python: >=3.11
26
- Requires-Dist: anywidget>=0.9.18
26
+ Requires-Dist: anywidget>=0.11.0
27
27
  Requires-Dist: jsonschema>=4.26.0
28
28
  Requires-Dist: traitlets>=5.14.3
29
29
  Provides-Extra: arrow
@@ -36,6 +36,12 @@ Description-Content-Type: text/markdown
36
36
 
37
37
  <h1 align="center">genome-spy-python</h1>
38
38
 
39
+ <p align="center">
40
+ <a href="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml"><img src="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
41
+ <a href="https://pypi.org/project/genome-spy-python/"><img src="https://img.shields.io/pypi/v/genome-spy-python" alt="PyPI version"></a>
42
+ <a href="https://colab.research.google.com/github/genome-spy/genome-spy-python/blob/main/notebooks/brush_linked_genome_tracks.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open brush example in Colab"></a>
43
+ </p>
44
+
39
45
  `genome-spy-python` is a Python interface for
40
46
  <a href="https://genomespy.app/" target="_blank" rel="noopener noreferrer">GenomeSpy</a>,
41
47
  a grammar for interactive and scalable genomic visualization. It lets Python
@@ -4,6 +4,12 @@
4
4
 
5
5
  <h1 align="center">genome-spy-python</h1>
6
6
 
7
+ <p align="center">
8
+ <a href="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml"><img src="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
9
+ <a href="https://pypi.org/project/genome-spy-python/"><img src="https://img.shields.io/pypi/v/genome-spy-python" alt="PyPI version"></a>
10
+ <a href="https://colab.research.google.com/github/genome-spy/genome-spy-python/blob/main/notebooks/brush_linked_genome_tracks.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open brush example in Colab"></a>
11
+ </p>
12
+
7
13
  `genome-spy-python` is a Python interface for
8
14
  <a href="https://genomespy.app/" target="_blank" rel="noopener noreferrer">GenomeSpy</a>,
9
15
  a grammar for interactive and scalable genomic visualization. It lets Python
@@ -115,6 +115,8 @@ mutation_view = (
115
115
  .properties(
116
116
  data=gs.Data(name="mutations"),
117
117
  )
118
+ # Let the anchors extend below their track to meet the protein.
119
+ .configure_mark(clip="x")
118
120
  .encode(
119
121
  x=gs.X("position:I").axis(None),
120
122
  xOffset=gs.XOffset("xDisplacement:Q").scale(None),
@@ -129,7 +131,9 @@ mutation_view = (
129
131
  length=DISPLACEMENT_LENGTH,
130
132
  as_="xDisplacement",
131
133
  positionFactor=pixels_per_residue,
132
- extent=gs.expr("[0.5, proteinLength + 0.5 - 25 / max(1, pixelsPerResidue)]"),
134
+ extent=gs.expr(
135
+ [0.5, protein_length + 0.5 - 25 / gs.expr.max(1, pixels_per_residue)]
136
+ ),
133
137
  )
134
138
  )
135
139
 
@@ -138,3 +138,11 @@ Marimo control changes.
138
138
 
139
139
  See the {py:class}`genome_spy.api.JupyterChart` reference for multiple datasets,
140
140
  transport options, and method signatures.
141
+
142
+ ## If a chart does not appear
143
+
144
+ Make sure the package is installed in the Python environment your notebook
145
+ uses. After installing or upgrading it, restart the notebook's Python session
146
+ and rerun the cells. The chart also needs internet access to load its display
147
+ code. As an alternative, use {py:meth}`~genome_spy.TopLevelSpec.save` to save an
148
+ HTML file and open it in a browser.