genome-spy-python 0.1.0__tar.gz → 0.3.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 (275) hide show
  1. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.github/workflows/ci.yml +29 -0
  2. genome_spy_python-0.3.0/CHANGELOG.md +64 -0
  3. genome_spy_python-0.3.0/CONTRIBUTING.md +201 -0
  4. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/PKG-INFO +8 -2
  5. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/README.md +6 -0
  6. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/THIRD_PARTY_NOTICES.md +5 -6
  7. genome_spy_python-0.3.0/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  8. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/datasets.md +5 -5
  9. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/brush_linked_genome_tracks.py +11 -5
  10. genome_spy_python-0.3.0/docs/examples/p53_sequence_comparison.md +41 -0
  11. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/p53_sequence_comparison.py +107 -52
  12. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +5 -1
  13. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/notebooks.md +8 -0
  14. genome_spy_python-0.3.0/notebooks/brush_linked_genome_tracks.ipynb +421 -0
  15. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/pyproject.toml +2 -2
  16. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/__init__.py +1 -1
  17. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/__init__.py +2 -2
  18. genome_spy_python-0.3.0/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
  19. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/expressions.py +18 -6
  20. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_chart.py +1 -1
  21. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_combined_gallery_data.py +21 -26
  22. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_docs_gallery.py +75 -17
  23. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_expressions.py +34 -0
  24. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_generated_schema_package.py +29 -0
  25. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_schema_codegen.py +2 -0
  26. genome_spy_python-0.3.0/tools/check_notebook_rendering.py +150 -0
  27. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/prepare_combined_gallery_data.py +3 -61
  28. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/schemapi/codegen.py +13 -7
  29. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/uv.lock +2 -2
  30. genome_spy_python-0.1.0/CHANGELOG.md +0 -30
  31. genome_spy_python-0.1.0/CONTRIBUTING.md +0 -218
  32. genome_spy_python-0.1.0/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  33. genome_spy_python-0.1.0/docs/examples/p53_sequence_comparison.md +0 -29
  34. genome_spy_python-0.1.0/src/genome_spy/datasets/data/p53_sequence_comparison.json.gz +0 -0
  35. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/commit/SKILL.md +0 -0
  36. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/SKILL.md +0 -0
  37. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  38. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/references/design.md +0 -0
  39. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
  40. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/commit/SKILL.md +0 -0
  41. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
  42. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  43. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/references/design.md +0 -0
  44. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
  45. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.gitattributes +0 -0
  46. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.github/workflows/docs.yml +0 -0
  47. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.github/workflows/release.yml +0 -0
  48. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.gitignore +0 -0
  49. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.pre-commit-config.yaml +0 -0
  50. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.python-version +0 -0
  51. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/AGENTS.md +0 -0
  52. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/CLAUDE.md +0 -0
  53. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/LICENSE +0 -0
  54. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  55. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/LICENSES/GALLERY-DATA-MIT.txt +0 -0
  56. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_ext/genomespy_gallery.py +0 -0
  57. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/README.md +0 -0
  58. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/airway_metadata.csv +0 -0
  59. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
  60. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/hapmap_gwas.csv +0 -0
  61. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
  62. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/pik3ca_mutations.json +0 -0
  63. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/external-links.js +0 -0
  64. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/airway_ma_plot.png +0 -0
  65. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/airway_volcano_plot.png +0 -0
  66. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
  67. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/ascat_fitting.png +0 -0
  68. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
  69. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  70. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  71. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/clinvar_variants.png +0 -0
  72. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  73. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
  74. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/copy_number.png +0 -0
  75. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/cytobands.png +0 -0
  76. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  77. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/genome_tracks.png +0 -0
  78. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  79. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  80. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  81. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/link_mark.png +0 -0
  82. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
  83. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/manhattan_plot.png +0 -0
  84. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  85. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/needle_plot.png +0 -0
  86. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/oncoprint.png +0 -0
  87. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  88. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/point_mark.png +0 -0
  89. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/rainfall_plot.png +0 -0
  90. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/ranged_rule.png +0 -0
  91. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/rect_heatmap.png +0 -0
  92. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  93. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/sashimi_plot.png +0 -0
  94. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
  95. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/sequence_logo.png +0 -0
  96. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/six_frame_translation.png +0 -0
  97. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  98. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  99. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/upset_mutations.png +0 -0
  100. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/vertical_concat.png +0 -0
  101. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/volcano_plot.png +0 -0
  102. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/genomespy.css +0 -0
  103. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/snaketie.svg +0 -0
  104. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_templates/autosummary/class.rst +0 -0
  105. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
  106. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_templates/components/view-this-page.html +0 -0
  107. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/about.md +0 -0
  108. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/api.md +0 -0
  109. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/conf.py +0 -0
  110. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_ma_plot.md +0 -0
  111. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_ma_plot.py +0 -0
  112. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_volcano_plot.md +0 -0
  113. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_volcano_plot.py +0 -0
  114. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_copy_number.md +0 -0
  115. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_copy_number.py +0 -0
  116. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_fitting.md +0 -0
  117. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_fitting.py +0 -0
  118. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/bam_read_alignments.md +0 -0
  119. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/bam_read_alignments.py +0 -0
  120. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/bigbed_ccre_track.py +0 -0
  121. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
  122. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/clinvar_variants.md +0 -0
  123. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/clinvar_variants.py +0 -0
  124. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/combined_laml_oncoplot.md +0 -0
  125. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/combined_laml_oncoplot.py +0 -0
  126. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/composing_genome_browser.md +0 -0
  127. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/composing_genome_browser.py +0 -0
  128. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/copy_number.py +0 -0
  129. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/cytobands.md +0 -0
  130. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/cytobands.py +0 -0
  131. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/dynseq_bqtl.md +0 -0
  132. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/dynseq_bqtl.py +0 -0
  133. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/genome_tracks.py +0 -0
  134. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/gff3_gene_annotations.md +0 -0
  135. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/gff3_gene_annotations.py +0 -0
  136. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
  137. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/hcc1954_sv_cnv.py +0 -0
  138. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/indexed_fasta_sequence.py +0 -0
  139. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/link_mark.py +0 -0
  140. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/luad_oncoprint.md +0 -0
  141. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/luad_oncoprint.py +0 -0
  142. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/manhattan_plot.md +0 -0
  143. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/manhattan_plot.py +0 -0
  144. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/multiple_sequence_alignment.md +0 -0
  145. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/multiple_sequence_alignment.py +0 -0
  146. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/needle_plot.py +0 -0
  147. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/oncoprint.md +0 -0
  148. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/oncoprint.py +0 -0
  149. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  150. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/point_mark.py +0 -0
  151. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/rainfall_plot.md +0 -0
  152. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/rainfall_plot.py +0 -0
  153. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ranged_rule.py +0 -0
  154. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/rect_heatmap.py +0 -0
  155. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/refseq_scored_genes.md +0 -0
  156. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/refseq_scored_genes.py +0 -0
  157. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/sashimi_plot.md +0 -0
  158. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/sashimi_plot.py +0 -0
  159. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/scrollable_viewport.py +0 -0
  160. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/sequence_logo.py +0 -0
  161. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/six_frame_translation.md +0 -0
  162. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/six_frame_translation.py +0 -0
  163. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/stacked_genome_browser.py +0 -0
  164. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/tcga_ov_gistic.md +0 -0
  165. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/tcga_ov_gistic.py +0 -0
  166. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/upset_mutations.md +0 -0
  167. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/upset_mutations.py +0 -0
  168. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/vertical_concat.py +0 -0
  169. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/volcano_plot.md +0 -0
  170. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/volcano_plot.py +0 -0
  171. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/getting-started.md +0 -0
  172. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/index.md +0 -0
  173. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/annotations.py +0 -0
  174. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/charts_and_marks.py +0 -0
  175. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/composition.py +0 -0
  176. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/configuration.py +0 -0
  177. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/data_inputs.py +0 -0
  178. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/display_controls.py +0 -0
  179. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/encoding_channels.py +0 -0
  180. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/genome_browser_layouts.py +0 -0
  181. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/genomic_coordinates.py +0 -0
  182. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/genomic_data.py +0 -0
  183. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/getting_started.py +0 -0
  184. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/importing_specifications.py +0 -0
  185. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/interaction.py +0 -0
  186. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/notebooks.py +0 -0
  187. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/scales_and_guides.py +0 -0
  188. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/serialization.py +0 -0
  189. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/transforms.py +0 -0
  190. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/annotations.md +0 -0
  191. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/charts.md +0 -0
  192. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/composition.md +0 -0
  193. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/configuration.md +0 -0
  194. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/data.md +0 -0
  195. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/display-controls.md +0 -0
  196. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/encodings.md +0 -0
  197. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/genome-browser-layouts.md +0 -0
  198. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/genomic-axes.md +0 -0
  199. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/genomic-data.md +0 -0
  200. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/importing-specifications.md +0 -0
  201. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/index.md +0 -0
  202. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/interaction.md +0 -0
  203. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/scales-axes-legends.md +0 -0
  204. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/serialization.md +0 -0
  205. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/transforms.md +0 -0
  206. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_chart_authoring.py +0 -0
  207. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_conditions.py +0 -0
  208. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_embed.py +0 -0
  209. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_expressions.py +0 -0
  210. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_parameters.py +0 -0
  211. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_render.py +0 -0
  212. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_utils.py +0 -0
  213. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_widget.py +0 -0
  214. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/api.py +0 -0
  215. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/arrow.py +0 -0
  216. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/channels.py +0 -0
  217. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/chart.py +0 -0
  218. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/data.py +0 -0
  219. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/data_transformers.py +0 -0
  220. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_airway.py +0 -0
  221. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_annotations.py +0 -0
  222. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_gistic.py +0 -0
  223. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_grammar.py +0 -0
  224. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_hapmap.py +0 -0
  225. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_mutation.py +0 -0
  226. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
  227. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  228. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  229. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  230. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  231. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  232. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  233. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  234. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  235. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  236. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  237. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  238. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  239. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  240. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
  241. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
  242. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
  243. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/helpers.py +0 -0
  244. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/jupyter.py +0 -0
  245. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/py.typed +0 -0
  246. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/__init__.py +0 -0
  247. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/_kwds.py +0 -0
  248. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/_typing.py +0 -0
  249. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/capabilities.json +0 -0
  250. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/channels.py +0 -0
  251. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/composition.py +0 -0
  252. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/core.py +0 -0
  253. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/ergonomics.py +0 -0
  254. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/genome-spy-schema.json +0 -0
  255. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/lazy.py +0 -0
  256. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/mixins.py +0 -0
  257. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schemapi.py +0 -0
  258. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/static/widget.js +0 -0
  259. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/__init__.py +0 -0
  260. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_arrow.py +0 -0
  261. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_data_transformers.py +0 -0
  262. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_datasets.py +0 -0
  263. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_docs_api_reference.py +0 -0
  264. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_docs_tutorial.py +0 -0
  265. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_generated_transform_methods.py +0 -0
  266. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_render_thumbnails.py +0 -0
  267. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_widget.py +0 -0
  268. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/widget.test.mjs +0 -0
  269. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/docs_gallery.py +0 -0
  270. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/generate_api_docs.py +0 -0
  271. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/generate_schema_wrapper.py +0 -0
  272. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/prepare_refseq_gene_annotations.py +0 -0
  273. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/render_thumbnails.py +0 -0
  274. {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/schemapi/__init__.py +0 -0
  275. {genome_spy_python-0.1.0 → genome_spy_python-0.3.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
@@ -0,0 +1,64 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.3.0] - 2026-09-09
9
+
10
+ ### Changed
11
+
12
+ - **Dataset format change:** `p53_sequence_comparison` now contains 34 protein
13
+ sequences aligned with MAFFT L-INS-i, replacing the unaligned JSON tables.
14
+ Load the aligned FASTA with
15
+ `load_dataset("p53_sequence_comparison", as_format="text")`; code expecting
16
+ the previous mapping of prepared tables must be updated.
17
+ - Updated the P53 gallery example to show the aligned sequences and calculate
18
+ conservation, gap-free fractions, and sequence logos in GenomeSpy.
19
+ - Made the brush notebook build progressively from a simple p-value chart to
20
+ linked tracks, and added an effect-size zero baseline in the notebook and gallery.
21
+
22
+ ## [0.2.0] - 2026-09-09
23
+
24
+ ### Added
25
+
26
+ - Python lists and tuples in `gs.expr()` for array expressions containing
27
+ values, parameters, and calculations.
28
+ - A brush-linked notebook example with an Open in Colab link in the README.
29
+
30
+ ### Changed
31
+
32
+ - Require AnyWidget 0.11.0 or newer to match the widget lifecycle API used for rendering.
33
+ - Simplified the contributing guide and added brief notebook troubleshooting advice.
34
+
35
+ ### Fixed
36
+
37
+ - PIK3CA lollipop connectors now reach the protein track.
38
+ - Packaged datasets can be imported on Python 3.14.
39
+
40
+ ## [0.1.0] - 2026-09-09
41
+
42
+ First public alpha release, targeting GenomeSpy Core 0.87.0.
43
+
44
+ ### Added
45
+
46
+ - Declarative, schema-backed Python API for authoring GenomeSpy specifications.
47
+ - Altair-style marks, encodings, transforms, parameters, conditions, and chart
48
+ composition.
49
+ - Genomics-native locus channels, genome assemblies, genomic data sources, and
50
+ coordinated multi-view interactions.
51
+ - Specification validation and serialization to dictionaries, JSON, and
52
+ standalone HTML.
53
+ - Interactive notebook rendering in Jupyter, VS Code, and Marimo through
54
+ `anywidget`.
55
+ - Arrow transport and live named-dataset updates for pandas, Polars, and
56
+ PyArrow tables.
57
+ - Per-render GenomeSpy controls and embed options, including image export and
58
+ full-window display controls.
59
+ - Packaged example datasets, documentation, tutorials, and an interactive
60
+ visualization gallery.
61
+
62
+ [0.3.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.2.0...v0.3.0
63
+ [0.2.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.1.0...v0.2.0
64
+ [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.3.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
@@ -4,12 +4,11 @@
4
4
 
5
5
  `tcga_laml_combined_oncoplot.json.gz` contains prepared TCGA LAML tables from
6
6
  maftools revision `015a4cf8c69ba89a55a3fdcea911421509e9a198` (Anand Mayakonda,
7
- MIT). `p53_sequence_comparison.json.gz` contains p53 sequences and derived
8
- display tables from Plotly's datasets revision
9
- `0c447c47b757ad74edecab31f0d72f849d2e67c2` (Plotly Technologies Inc., MIT).
10
- Source file hashes are retained in the packaged data. The corresponding gallery
11
- pages describe processing. Copyright notices and terms are included in
12
- `LICENSES/GALLERY-DATA-MIT.txt`.
7
+ MIT). `p53_sequence_comparison_aligned.fasta.gz` contains p53 sequences from
8
+ Plotly's datasets revision `0c447c47b757ad74edecab31f0d72f849d2e67c2`
9
+ (Plotly Technologies Inc., MIT), aligned with MAFFT v7.526 using L-INS-i. The
10
+ corresponding gallery pages describe processing. Copyright notices and terms
11
+ are included in `LICENSES/GALLERY-DATA-MIT.txt`.
13
12
 
14
13
  ## Code adapted from Vega-Altair
15
14
 
@@ -1,10 +1,10 @@
1
1
  # Example datasets
2
2
 
3
3
  The combined LAML oncoplot uses `load_dataset("tcga_laml_combined_oncoplot")`;
4
- the p53 sequence comparison uses `load_dataset("p53_sequence_comparison")`.
5
- Both return mappings of prepared chart tables, display domains, and source
6
- provenance. Their MIT-licensed sources, processing, and interpretation limits
7
- are described in the [combined oncoplot](gallery/combined_laml_oncoplot.md) and
4
+ the p53 sequence comparison loads aligned FASTA text with
5
+ `load_dataset("p53_sequence_comparison", as_format="text")`. Their
6
+ MIT-licensed sources and processing are described in the
7
+ [combined oncoplot](gallery/combined_laml_oncoplot.md) and
8
8
  [p53 comparison](gallery/p53_sequence_comparison.md) gallery pages.
9
9
 
10
10
  The package ships the tables that the [gallery](gallery/index.md) examples use,
@@ -30,7 +30,7 @@ for JSON files. Pass `as_format="text"` to get the raw file contents instead.
30
30
  | `tcga_laml_maf` | Somatic mutation calls for TCGA acute myeloid leukemia |
31
31
  | `tcga_laml_annotations` | Clinical annotations for those leukemia samples |
32
32
  | `tcga_laml_combined_oncoplot` | Prepared mutation, copy-number, clinical, pathway, VAF, and MutSig tables |
33
- | `p53_sequence_comparison` | 34 unaligned p53 sequences, padded residue tiles, consensus, identity, and coverage |
33
+ | `p53_sequence_comparison` | 34 p53 protein sequences aligned with MAFFT L-INS-i, compressed FASTA |
34
34
  | `pyoncoprint_tcga` | Alteration matrix for TCGA lung adenocarcinoma samples |
35
35
  | `tcga_ov_gistic_scores` | GISTIC2 copy-number scores for TCGA ovarian tumors |
36
36
  | `tcga_ov_gistic_lesions` | GISTIC2 peak regions for the same cohort |
@@ -86,7 +86,7 @@ association_track = (
86
86
  )
87
87
 
88
88
  # Show effect sizes for the same range.
89
- effect_track = (
89
+ effect_points = (
90
90
  gs.Chart()
91
91
  .mark_point(filled=True, size=24, opacity=0.78, color="#f58518")
92
92
  .encode(
@@ -96,10 +96,16 @@ effect_track = (
96
96
  y=gs.Y("EFFECTSIZE:Q").scale(domain=[-3, 3]).title("Effect size"),
97
97
  tooltip=["SNP:N", "GENE:N", "EFFECTSIZE:Q"],
98
98
  )
99
- .properties(
100
- name="effect-size",
101
- height=95,
102
- )
99
+ )
100
+
101
+ # Put a zero line behind the points to separate positive and negative effects.
102
+ effect_baseline = (
103
+ gs.Chart([{"EFFECTSIZE": 0}])
104
+ .mark_rule(color="#888888", size=1, tooltip=None)
105
+ .encode(y=gs.Y("EFFECTSIZE:Q").scale(domain=[-3, 3]).title("Effect size"))
106
+ )
107
+ effect_track = (effect_baseline + effect_points).properties(
108
+ name="effect-size", height=95
103
109
  )
104
110
 
105
111
  # Add Z-scores as the third view of the selected range.
@@ -0,0 +1,41 @@
1
+ ## What to notice
2
+
3
+ Drag the overview at the bottom to choose the positions shown above. The
4
+ summary tracks, sequence logo, and residue matrix stay aligned as the view
5
+ moves. Move the pointer across the detail tracks to follow one position with
6
+ the vertical ruler. Hover a tile for its accession and position. Zoom in to
7
+ read letters.
8
+
9
+ **Conservation** shows the fraction of non-gap sequences that share the most
10
+ common amino acid at each alignment column. **Gap-free** shows
11
+ the fraction of sequences containing a residue there. Keeping the two measures
12
+ separate makes it clear whether a low score reflects disagreement or missing
13
+ aligned residues. The sequence logo shows the full non-gap residue mixture,
14
+ with larger letters for larger shares. The x-axis reports one-based alignment
15
+ columns, not residue numbers in any individual protein.
16
+
17
+ This adapts [Dash Bio AlignmentChart](https://dash.plotly.com/dash-bio/alignmentchart)
18
+ with GenomeSpy rectangles, text, bars, a sequence logo, and a shared brush.
19
+
20
+ :::{admonition} Data use and provenance
21
+ :class: note
22
+
23
+ The 34 UniProt-labelled p53 protein sequences come from the
24
+ [Plotly FASTA](https://github.com/plotly/datasets/blob/0c447c47b757ad74edecab31f0d72f849d2e67c2/Dash_Bio/Genetic/alignment_viewer_p53.fasta)
25
+ in Plotly's MIT-licensed datasets repository. They were aligned with MAFFT
26
+ v7.526 using the L-INS-i strategy:
27
+ `mafft-linsi p53.unaligned.fasta > p53.aligned.fasta`. The resulting alignment
28
+ is packaged as `p53_sequence_comparison_aligned.fasta.gz`.
29
+ :::
30
+
31
+ ## Python and GenomeSpy processing
32
+
33
+ Python reads the packaged compressed FASTA, splits its 34 records, preserves
34
+ the UniProt identifiers and headers, and verifies that every aligned sequence
35
+ has the same length. GenomeSpy then flattens each sequence into residues in the
36
+ browser and declaratively calculates gap-free fractions, non-gap conservation,
37
+ and logo stacks. The Python API authors and serializes
38
+ those transforms; GenomeSpy executes them while rendering and interacting with
39
+ the visualization. For comparison, the
40
+ [multiple sequence alignment example](multiple_sequence_alignment.md) sends
41
+ FASTA directly to GenomeSpy and parses it in the browser-side dataflow.