genome-spy-python 0.5.0__tar.gz → 0.7.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 (434) hide show
  1. genome_spy_python-0.7.0/.agents/skills/commit/SKILL.md +48 -0
  2. genome_spy_python-0.7.0/.agents/skills/proper-code-review/SKILL.md +73 -0
  3. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.gitignore +3 -0
  4. genome_spy_python-0.7.0/AGENTS.md +65 -0
  5. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/CHANGELOG.md +57 -0
  6. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/CONTRIBUTING.md +20 -0
  7. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/PKG-INFO +102 -28
  8. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/README.md +99 -27
  9. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/THIRD_PARTY_NOTICES.md +26 -0
  10. genome_spy_python-0.7.0/docs/_ext/genomespy_agents.py +36 -0
  11. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_ext/genomespy_gallery.py +9 -0
  12. genome_spy_python-0.7.0/docs/_static/gallery/airway_ma_plot.png +0 -0
  13. genome_spy_python-0.7.0/docs/_static/gallery/airway_volcano_plot.png +0 -0
  14. genome_spy_python-0.7.0/docs/_static/gallery/clustered_heatmap.png +0 -0
  15. genome_spy_python-0.7.0/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  16. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
  17. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
  18. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
  19. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_umap.png +0 -0
  20. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_umap_genes.png +0 -0
  21. genome_spy_python-0.7.0/docs/_static/gallery/sequence_logo.png +0 -0
  22. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/genomespy.css +12 -0
  23. genome_spy_python-0.7.0/docs/_static/readme-manhattan.webp +0 -0
  24. genome_spy_python-0.7.0/docs/_static/readme-sequence-logo.webp +0 -0
  25. genome_spy_python-0.7.0/docs/_static/snaketie.svg +1 -0
  26. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/workflows.css +6 -4
  27. genome_spy_python-0.7.0/docs/agents/data.md +121 -0
  28. genome_spy_python-0.7.0/docs/agents/encodings.md +144 -0
  29. genome_spy_python-0.7.0/docs/agents/manifest.json +92 -0
  30. genome_spy_python-0.7.0/docs/agents/quickstart.md +81 -0
  31. genome_spy_python-0.7.0/docs/agents/rendering.md +64 -0
  32. genome_spy_python-0.7.0/docs/agents/scales-axes-legends.md +100 -0
  33. genome_spy_python-0.7.0/docs/agents/skill-distribution.md +62 -0
  34. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/api.md +40 -0
  35. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/conf.py +3 -1
  36. genome_spy_python-0.7.0/docs/contributing/standards.md +75 -0
  37. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/datasets.md +10 -0
  38. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/airway_ma_plot.py +63 -50
  39. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/airway_volcano_plot.py +63 -50
  40. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/ascat_fitting.py +41 -34
  41. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_alignments.py +5 -4
  42. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_pileup.py +3 -2
  43. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/bigbed_ccre_track.py +3 -2
  44. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/clinvar_variants.py +3 -2
  45. genome_spy_python-0.7.0/docs/examples/clustered_heatmap.md +47 -0
  46. genome_spy_python-0.7.0/docs/examples/clustered_heatmap.py +394 -0
  47. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/combined_laml_oncoplot.py +1 -1
  48. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/composing_genome_browser.py +3 -2
  49. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_adaptive_bqtl.py +22 -16
  50. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_bqtl.py +22 -16
  51. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/hcc1954_sv_cnv.py +10 -4
  52. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/independent_scales.md +14 -0
  53. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/indexed_fasta_sequence.py +3 -2
  54. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/luad_oncoprint.py +12 -10
  55. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/multiple_sequence_alignment.py +9 -8
  56. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/oncoprint.py +14 -12
  57. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/p53_sequence_comparison.py +1 -1
  58. genome_spy_python-0.7.0/docs/examples/pbmc_cell_heatmap.md +24 -0
  59. genome_spy_python-0.7.0/docs/examples/pbmc_cell_heatmap.py +103 -0
  60. genome_spy_python-0.7.0/docs/examples/pbmc_expression_tracks.md +18 -0
  61. genome_spy_python-0.7.0/docs/examples/pbmc_expression_tracks.py +124 -0
  62. genome_spy_python-0.7.0/docs/examples/pbmc_marker_matrix.md +24 -0
  63. genome_spy_python-0.7.0/docs/examples/pbmc_marker_matrix.py +160 -0
  64. genome_spy_python-0.7.0/docs/examples/pbmc_umap.md +15 -0
  65. genome_spy_python-0.7.0/docs/examples/pbmc_umap.py +58 -0
  66. genome_spy_python-0.7.0/docs/examples/pbmc_umap_genes.md +18 -0
  67. genome_spy_python-0.7.0/docs/examples/pbmc_umap_genes.py +96 -0
  68. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +3 -2
  69. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/pisa_interaction_matrix.md +15 -13
  70. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/pisa_interaction_matrix.py +98 -72
  71. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/pisa_squid.md +17 -12
  72. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/pisa_squid.py +64 -68
  73. genome_spy_python-0.7.0/docs/examples/point_mark.md +14 -0
  74. genome_spy_python-0.7.0/docs/examples/rect_heatmap.md +15 -0
  75. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/rnf7_direct_rna.py +2 -2
  76. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/sashimi_plot.py +9 -1
  77. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/sequence_logo.py +2 -3
  78. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/six_frame_translation.py +5 -4
  79. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/upset_mutations.md +4 -3
  80. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/upset_mutations.py +29 -39
  81. genome_spy_python-0.7.0/docs/examples/vertical_concat.md +14 -0
  82. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/index.md +3 -0
  83. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/composition.py +34 -0
  84. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/encoding_channels.py +9 -0
  85. genome_spy_python-0.7.0/docs/tutorials/expressions.py +34 -0
  86. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/interaction.py +10 -0
  87. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/composition.md +39 -0
  88. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/data.md +54 -5
  89. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/encodings.md +23 -2
  90. genome_spy_python-0.7.0/docs/user-guide/expressions.md +90 -0
  91. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/index.md +2 -0
  92. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/interaction.md +79 -52
  93. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/transforms.md +9 -22
  94. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/index.md +2 -0
  95. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/notebooks/edit_sequence.ipynb +7 -3
  96. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/notebooks/pick_genes.ipynb +3 -1
  97. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/notebooks/select_genes.ipynb +3 -1
  98. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/pyproject.toml +14 -2
  99. genome_spy_python-0.7.0/skills/create-genomespy-visualization/SKILL.md +91 -0
  100. genome_spy_python-0.7.0/skills/create-genomespy-visualization/agents/openai.yaml +4 -0
  101. genome_spy_python-0.7.0/skills/create-genomespy-visualization/references/grouped-charts.md +102 -0
  102. genome_spy_python-0.7.0/skills/create-genomespy-visualization/references/table-chart.md +157 -0
  103. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/__init__.py +112 -57
  104. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_chart_authoring.py +6 -1
  105. genome_spy_python-0.7.0/src/genome_spy/_skill_install.py +158 -0
  106. genome_spy_python-0.7.0/src/genome_spy/anndata.py +159 -0
  107. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/api.py +81 -27
  108. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/arrow.py +7 -2
  109. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/channels.py +5 -2
  110. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/chart.py +66 -6
  111. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/__init__.py +2 -0
  112. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_airway.py +35 -47
  113. genome_spy_python-0.7.0/src/genome_spy/datasets/_pbmc.py +87 -0
  114. genome_spy_python-0.7.0/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
  115. genome_spy_python-0.7.0/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
  116. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/__init__.py +31 -1
  117. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/_kwds.py +72 -45
  118. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/_typing.py +3 -0
  119. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/capabilities.json +25 -2
  120. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/channels.py +1115 -282
  121. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/composition.py +464 -21
  122. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/core.py +24746 -13714
  123. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/ergonomics.py +105 -48
  124. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/expressions.py +7 -0
  125. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/genome-spy-schema.json +13765 -5658
  126. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/lazy.py +3 -0
  127. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/mixins.py +2507 -780
  128. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/schemapi.py +1 -5
  129. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/static/controls.js +1 -1
  130. genome_spy_python-0.7.0/src/genome_spy/static/genome-spy.js +1131 -0
  131. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/static/inspector.js +4 -4
  132. genome_spy_python-0.7.0/tests/browser/test_core_upgrade.py +80 -0
  133. genome_spy_python-0.7.0/tests/browser/test_docs_theme.py +68 -0
  134. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/README.md +15 -0
  135. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +445 -0
  136. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/clustered-heatmap.json +594 -0
  137. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/upsetr-mutations.json +403 -0
  138. genome_spy_python-0.7.0/tests/test_agent_docs.py +262 -0
  139. genome_spy_python-0.7.0/tests/test_anndata.py +287 -0
  140. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_arrow.py +4 -1
  141. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_chart.py +1 -1
  142. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_conditions.py +29 -0
  143. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_datasets.py +8 -13
  144. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_docs_api_reference.py +8 -0
  145. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_docs_gallery.py +116 -122
  146. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_docs_tutorial.py +2 -0
  147. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_generated_schema_package.py +72 -0
  148. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_licensing.py +2 -0
  149. genome_spy_python-0.7.0/tests/test_new_compositions.py +159 -0
  150. genome_spy_python-0.7.0/tests/test_pbmc_gallery.py +354 -0
  151. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_pisa_gallery.py +26 -8
  152. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_schema_codegen.py +73 -0
  153. genome_spy_python-0.7.0/tests/test_skill_install.py +130 -0
  154. genome_spy_python-0.7.0/tests/test_upstream_surround_gallery.py +161 -0
  155. genome_spy_python-0.7.0/tools/agent_docs.py +239 -0
  156. genome_spy_python-0.7.0/tools/agent_markdown.py +277 -0
  157. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/docs_gallery.py +8 -0
  158. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/docs_workflows.py +15 -11
  159. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/generate_api_docs.py +12 -0
  160. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/generate_schema_wrapper.py +24 -4
  161. genome_spy_python-0.7.0/tools/prepare_airway_review.py +55 -0
  162. genome_spy_python-0.7.0/tools/prepare_pbmc_gallery_data.py +244 -0
  163. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/schemapi/codegen.py +92 -63
  164. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/uv.lock +703 -17
  165. genome_spy_python-0.5.0/.agents/skills/proper-code-review/SKILL.md +0 -165
  166. genome_spy_python-0.5.0/.claude/skills/commit/SKILL.md +0 -105
  167. genome_spy_python-0.5.0/AGENTS.md +0 -153
  168. genome_spy_python-0.5.0/docs/_static/gallery/airway_ma_plot.png +0 -0
  169. genome_spy_python-0.5.0/docs/_static/gallery/airway_volcano_plot.png +0 -0
  170. genome_spy_python-0.5.0/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  171. genome_spy_python-0.5.0/docs/_static/gallery/sequence_logo.png +0 -0
  172. genome_spy_python-0.5.0/docs/_static/snaketie.svg +0 -74
  173. genome_spy_python-0.5.0/src/genome_spy/static/genome-spy.js +0 -1009
  174. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  175. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/design.md +0 -0
  176. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
  177. {genome_spy_python-0.5.0/.agents → genome_spy_python-0.7.0/.claude}/skills/commit/SKILL.md +0 -0
  178. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
  179. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  180. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/design.md +0 -0
  181. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
  182. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.gitattributes +0 -0
  183. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.github/workflows/ci.yml +0 -0
  184. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.github/workflows/docs.yml +0 -0
  185. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.github/workflows/release.yml +0 -0
  186. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.pre-commit-config.yaml +0 -0
  187. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/.python-version +0 -0
  188. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/CLAUDE.md +0 -0
  189. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSE +0 -0
  190. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  191. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/CC-BY-4.0.txt +0 -0
  192. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
  193. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/CC0-1.0.txt +0 -0
  194. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
  195. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/GENOMESPY-MIT.txt +0 -0
  196. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/LATO-OFL-1.1.txt +0 -0
  197. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
  198. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
  199. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/data/README.md +0 -0
  200. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/data/airway_metadata.csv +0 -0
  201. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
  202. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/data/hapmap_gwas.csv +0 -0
  203. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
  204. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/data/pik3ca_mutations.json +0 -0
  205. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/external-links.js +0 -0
  206. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
  207. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ascat_fitting.png +0 -0
  208. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
  209. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bam_read_pileup.png +0 -0
  210. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  211. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  212. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/clinvar_variants.png +0 -0
  213. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  214. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
  215. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/copy_number.png +0 -0
  216. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/coverage_pileup.png +0 -0
  217. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/cytobands.png +0 -0
  218. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/diverging_bars.png +0 -0
  219. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
  220. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  221. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/genome_tracks.png +0 -0
  222. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/geometric_zoom.png +0 -0
  223. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  224. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  225. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/heatmap_with_text.png +0 -0
  226. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/independent_scales.png +0 -0
  227. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  228. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/layered_lollipop.png +0 -0
  229. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/link_mark.png +0 -0
  230. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
  231. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/manhattan_plot.png +0 -0
  232. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/needle_plot.png +0 -0
  233. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/oncoprint.png +0 -0
  234. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  235. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/penguin_brush.png +0 -0
  236. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  237. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
  238. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pisa_squid.png +0 -0
  239. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/point_mark.png +0 -0
  240. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/point_styles.png +0 -0
  241. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rainfall_plot.png +0 -0
  242. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ranged_rule.png +0 -0
  243. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rect_heatmap.png +0 -0
  244. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  245. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
  246. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/sashimi_plot.png +0 -0
  247. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
  248. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/six_frame_translation.png +0 -0
  249. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/stacked_bar.png +0 -0
  250. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  251. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  252. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/tsne.png +0 -0
  253. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/upset_mutations.png +0 -0
  254. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/vertical_concat.png +0 -0
  255. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/gallery/volcano_plot.png +0 -0
  256. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/showcase.js +0 -0
  257. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_static/workflows.js +0 -0
  258. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_templates/autosummary/class.rst +0 -0
  259. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
  260. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_templates/base.html +0 -0
  261. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/_templates/components/view-this-page.html +0 -0
  262. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/about.md +0 -0
  263. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/airway_ma_plot.md +0 -0
  264. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/airway_volcano_plot.md +0 -0
  265. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/ascat_copy_number.md +0 -0
  266. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/ascat_copy_number.py +0 -0
  267. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/ascat_fitting.md +0 -0
  268. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_alignments.md +0 -0
  269. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_pileup.md +0 -0
  270. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
  271. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/brush_linked_genome_tracks.py +0 -0
  272. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/clinvar_variants.md +0 -0
  273. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/combined_laml_oncoplot.md +0 -0
  274. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/composing_genome_browser.md +0 -0
  275. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/copy_number.py +0 -0
  276. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/coverage_pileup.md +0 -0
  277. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/coverage_pileup.py +0 -0
  278. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/cytobands.md +0 -0
  279. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/cytobands.py +0 -0
  280. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/diverging_bars.md +0 -0
  281. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/diverging_bars.py +0 -0
  282. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
  283. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_bqtl.md +0 -0
  284. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/genome_tracks.py +0 -0
  285. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/geometric_zoom.md +0 -0
  286. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/geometric_zoom.py +0 -0
  287. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/gff3_gene_annotations.md +0 -0
  288. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/gff3_gene_annotations.py +0 -0
  289. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
  290. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/heatmap_with_text.md +0 -0
  291. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/heatmap_with_text.py +0 -0
  292. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/independent_scales.py +0 -0
  293. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/layered_lollipop.md +0 -0
  294. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/layered_lollipop.py +0 -0
  295. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/link_mark.py +0 -0
  296. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/luad_oncoprint.md +0 -0
  297. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/manhattan_plot.md +0 -0
  298. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/manhattan_plot.py +0 -0
  299. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/multiple_sequence_alignment.md +0 -0
  300. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/needle_plot.py +0 -0
  301. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/oncoprint.md +0 -0
  302. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/p53_sequence_comparison.md +0 -0
  303. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/penguin_brush.md +0 -0
  304. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/penguin_brush.py +0 -0
  305. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  306. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/point_mark.py +0 -0
  307. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/point_styles.md +0 -0
  308. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/point_styles.py +0 -0
  309. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/rainfall_plot.md +0 -0
  310. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/rainfall_plot.py +0 -0
  311. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/ranged_rule.py +0 -0
  312. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/rect_heatmap.py +0 -0
  313. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/refseq_scored_genes.md +0 -0
  314. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/refseq_scored_genes.py +0 -0
  315. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/rnf7_direct_rna.md +0 -0
  316. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/sashimi_plot.md +0 -0
  317. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/scrollable_viewport.py +0 -0
  318. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/six_frame_translation.md +0 -0
  319. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/stacked_bar.md +0 -0
  320. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/stacked_bar.py +0 -0
  321. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/stacked_genome_browser.py +0 -0
  322. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/tcga_ov_gistic.md +0 -0
  323. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/tcga_ov_gistic.py +0 -0
  324. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/tsne.md +0 -0
  325. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/tsne.py +0 -0
  326. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/vertical_concat.py +0 -0
  327. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/volcano_plot.md +0 -0
  328. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/examples/volcano_plot.py +0 -0
  329. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/getting-started.md +0 -0
  330. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/integration/component.py +0 -0
  331. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/integration/index.html +0 -0
  332. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/integration/notebook.ipynb +0 -0
  333. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/integration/server.py +0 -0
  334. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/annotations.py +0 -0
  335. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/charts_and_marks.py +0 -0
  336. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/configuration.py +0 -0
  337. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/data_inputs.py +0 -0
  338. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/display_controls.py +0 -0
  339. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/genome_browser_layouts.py +0 -0
  340. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/genomic_coordinates.py +0 -0
  341. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/genomic_data.py +0 -0
  342. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/getting_started.py +0 -0
  343. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/importing_specifications.py +0 -0
  344. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/notebooks.py +0 -0
  345. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/scales_and_guides.py +0 -0
  346. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/serialization.py +0 -0
  347. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/tutorials/transforms.py +0 -0
  348. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/annotations.md +0 -0
  349. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/charts.md +0 -0
  350. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/configuration.md +0 -0
  351. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/connect-python.md +0 -0
  352. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/display-controls.md +0 -0
  353. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/embed-api.md +0 -0
  354. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/genome-browser-layouts.md +0 -0
  355. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/genomic-axes.md +0 -0
  356. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/genomic-data.md +0 -0
  357. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/importing-specifications.md +0 -0
  358. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/notebooks.md +0 -0
  359. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/scales-axes-legends.md +0 -0
  360. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/serialization.md +0 -0
  361. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/using-charts.md +0 -0
  362. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/annotate-intervals.md +0 -0
  363. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/edit-sequence.md +0 -0
  364. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/pick-genes.md +0 -0
  365. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/select-genes.md +0 -0
  366. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/notebooks/annotate_genomic_intervals.ipynb +0 -0
  367. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
  368. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/notebooks/embed_api.ipynb +0 -0
  369. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_conditions.py +0 -0
  370. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_embed.py +0 -0
  371. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_expressions.py +0 -0
  372. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_parameters.py +0 -0
  373. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_render.py +0 -0
  374. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_utils.py +0 -0
  375. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/_widget.py +0 -0
  376. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/data.py +0 -0
  377. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/data_transformers.py +0 -0
  378. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_annotations.py +0 -0
  379. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_direct_rna.py +0 -0
  380. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_gistic.py +0 -0
  381. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_grammar.py +0 -0
  382. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_hapmap.py +0 -0
  383. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_mutation.py +0 -0
  384. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
  385. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  386. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  387. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  388. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  389. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  390. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  391. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
  392. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  393. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  394. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  395. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
  396. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  397. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  398. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  399. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  400. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
  401. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
  402. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
  403. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/embed.py +0 -0
  404. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/helpers.py +0 -0
  405. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/jupyter.py +0 -0
  406. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/py.typed +0 -0
  407. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/static/embed-bridge.js +0 -0
  408. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/src/genome_spy/static/widget.js +0 -0
  409. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/__init__.py +0 -0
  410. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/browser/test_docs_workflows.py +0 -0
  411. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/browser/test_embed_api.py +0 -0
  412. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/browser/test_offline_rendering.py +0 -0
  413. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/browser/test_python_web_example.py +0 -0
  414. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/embed-bridge.test.mjs +0 -0
  415. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_combined_gallery_data.py +0 -0
  416. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_data_transformers.py +0 -0
  417. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_embed.py +0 -0
  418. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_embed_notebook.py +0 -0
  419. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_expressions.py +0 -0
  420. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_generated_transform_methods.py +0 -0
  421. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_javascript_assets.py +0 -0
  422. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_python_connection_example.py +0 -0
  423. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_render_thumbnails.py +0 -0
  424. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_rnf7_direct_rna_example.py +0 -0
  425. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_widget.py +0 -0
  426. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/test_workflow_notebooks.py +0 -0
  427. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tests/widget.test.mjs +0 -0
  428. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/check_notebook_rendering.py +0 -0
  429. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/prepare_combined_gallery_data.py +0 -0
  430. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/prepare_refseq_gene_annotations.py +0 -0
  431. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/render_thumbnails.py +0 -0
  432. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/schemapi/__init__.py +0 -0
  433. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/schemapi/expression_codegen.py +0 -0
  434. {genome_spy_python-0.5.0 → genome_spy_python-0.7.0}/tools/vendor_javascript.py +0 -0
@@ -0,0 +1,48 @@
1
+ ---
2
+ name: commit
3
+ description: Commit repository changes in small thematic chunks using conventional commits and concise changelog staging.
4
+ ---
5
+
6
+ # Commit workflow
7
+
8
+ Prefer small, independently understandable commits. Keep unrelated user changes
9
+ unstaged. Do not amend, rewrite history, revert, force-push, or add co-author
10
+ trailers unless explicitly requested.
11
+
12
+ ## Inspect and commit
13
+
14
+ 1. Start with `git status --short` and `git diff --stat`.
15
+ 2. Group changes into thematic slices. Split separate features, fixes, refactors,
16
+ tooling/configuration, documentation, and unrelated test work when separable;
17
+ do not split mechanically by file.
18
+ 3. Keep implementation with its direct tests, API/schema changes with required
19
+ supporting code, and generated files with their source change.
20
+ 4. Read targeted diffs only when needed, including when grouping is unclear:
21
+ `git diff -- <files>`. Minimize token use; do not read the full diff or re-review
22
+ code by default.
23
+ 5. Stage one slice, check `git diff --cached --stat`, and commit with a conventional
24
+ message. Repeat for remaining slices.
25
+ 6. Finish with `git status --short`, update changelog staging once if needed, and
26
+ report commit hashes and remaining uncommitted files.
27
+
28
+ ## Commit messages
29
+
30
+ Use `<type>(<scope>): <description>`. Common types: `feat`, `fix`, `refactor`,
31
+ `perf`, `test`, `docs`, `chore`, `build`, and `ci`.
32
+
33
+ ```text
34
+ feat(parser): add strand-aware bigwig loading
35
+ fix(cache): invalidate stale entries
36
+ refactor(pipeline): simplify track dispatch
37
+ ```
38
+
39
+ ## Changelog staging
40
+
41
+ `CHANGELOG_STAGING.md` holds future release notes. Update it once per commit
42
+ session only for release-relevant changes:
43
+
44
+ - Read only the context needed.
45
+ - Add concise bullets under `Added`, `Changed`, `Fixed`, `Removed`, or `Performance`.
46
+ - Prefer one resulting-change bullet over one per commit; avoid duplicates.
47
+ - Omit routine refactors, formatting, test-only work, and internal details unless
48
+ release-relevant.
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: proper-code-review
3
+ description: Review code changes for correctness, simplicity, readability, maintainability, architectural fit, and meaningful system-level performance. Use when asked to review a diff, implementation, branch, or recent code changes.
4
+ ---
5
+
6
+ # Code review
7
+
8
+ Review as a senior engineer. Prioritize correctness and low lifecycle complexity:
9
+ simple, readable, maintainable code that fits the repository and performs well for
10
+ realistic workloads. Prefer a few high-confidence findings over exhaustive
11
+ commentary; do not manufacture findings.
12
+
13
+ Added complexity must provide a concrete benefit: correctness, meaningful reuse,
14
+ change locality, real variation, necessary scalability, or material performance.
15
+ Prefer local reasoning and localized changes. Reuse suitable repository concepts,
16
+ avoid duplicated knowledge and parallel mechanisms, and reject speculative
17
+ abstraction/extensibility. Judge performance across the system, not just locally.
18
+
19
+ ## Review method
20
+
21
+ 1. **Understand the change.** Read the diff first. Identify its problem, behavior
22
+ changes, affected interfaces, invariants, state, and architectural concepts.
23
+ Read only enough surrounding code to answer concrete questions, not the whole
24
+ repository. When relevant, inspect callers for compatibility, tests for intended
25
+ behavior/invariants, existing mechanisms before proposing new ones, analogous
26
+ implementations for duplication/fit, and broader execution paths for performance.
27
+ 2. **Verify hypotheses.** Check concerns against repository evidence when possible.
28
+ Locate duplicated representations, inspect callers before claiming breakage,
29
+ search for existing abstractions, and establish performance significance before
30
+ criticizing or recommending optimization. Do not present assumptions as facts.
31
+ 3. **Review correctness.** Look for concrete behavioral bugs/regressions, broken
32
+ invariants, invalid assumptions, relevant edge cases, unsafe mutations/state
33
+ transitions, error/resource lifecycle issues, concurrency problems, and
34
+ unintended compatibility changes. Passing tests are evidence, not proof.
35
+ Read [correctness](references/correctness.md) for deeper analysis.
36
+ 4. **Review design.** Consider simplicity (KISS), readability, maintainability,
37
+ cohesion, coupling, abstraction, change locality, blast radius, and fit together.
38
+ Check whether a simpler solution supports local understanding/change, whether
39
+ synchronized edits duplicate knowledge, whether machinery is unnecessary,
40
+ whether abstractions share real semantics, and whether scope is proportional.
41
+ Apply YAGNI: avoid cleverness or future machinery without concrete benefit.
42
+ Read [design](references/design.md) for deeper analysis.
43
+ 5. **Review performance.** Check algorithmic complexity, repeated expensive work,
44
+ I/O, memory/copying, serialization/data movement, CPU/GPU synchronization, and
45
+ realistic scaling. Judge end-to-end impact; reject meaningful complexity for
46
+ negligible local gains. Read [performance](references/performance.md) when relevant.
47
+ 6. **Validate findings.** Each problem must be concrete, consequential, supported
48
+ by evidence, and paired with a proportionate fix that reduces total complexity.
49
+ Remove speculative, cosmetic, generic, and low-value comments. No finding is
50
+ better than a weak finding.
51
+
52
+ ## Output
53
+
54
+ Order findings by practical impact. For each, use:
55
+
56
+ ### `[Severity] Short problem statement`
57
+
58
+ - **Location:** Smallest useful code region.
59
+ - **Problem:** What is wrong.
60
+ - **Impact:** Why it matters here.
61
+ - **Recommendation:** Smallest reasonable fix.
62
+
63
+ Severity:
64
+
65
+ - **Critical:** Correctness, data loss, security, or severe failure.
66
+ - **Important:** Substantial behavioral, architectural, maintainability,
67
+ performance, or scalability issue.
68
+ - **Minor:** Worthwhile simplification or readability improvement.
69
+
70
+ Combine findings with the same root cause and state uncertainty explicitly.
71
+ Normally omit stylistic nits. Do not add generic best-practice advice, speculative
72
+ future concerns, praise for unaffected code, or alternative architectures merely
73
+ because they are possible. If none remain, say no significant issues were found.
@@ -248,3 +248,6 @@ tools/__pycache__/
248
248
  scripts/*alphagenome*.py
249
249
  scripts/fetch_*_reference.py
250
250
  scripts/_fetch_reference.py
251
+
252
+ # Local recording demos and working files
253
+ /demos/
@@ -0,0 +1,65 @@
1
+ # Repository instructions
2
+
3
+ `genome-spy-python` wraps GenomeSpy in an idiomatic Python API, as Altair wraps
4
+ Vega-Lite. Users author compatible specs, serialize JSON, and render in notebooks.
5
+ Treat it as a library with a clean public API. Build the reusable Core grammar
6
+ before app-specific concepts. Notebook rendering is first-class; prefer `anywidget`.
7
+
8
+ ## Layout
9
+
10
+ | Path | Purpose |
11
+ | --- | --- |
12
+ | `src/genome_spy/` | Installable library |
13
+ | `tests/` | pytest suite |
14
+ | `scripts/` | Helpers run via `uv run` |
15
+ | `plans/` | Plans, context, and implementation notes |
16
+ | `material/` | Local reference documents; not committed |
17
+ | `tmp/` | External reference code/repos; not committed |
18
+
19
+ ## Working rules
20
+
21
+ - Think before coding: state assumptions and tradeoffs; push back when warranted.
22
+ - Solve the current problem with minimal code. Avoid speculative features and
23
+ premature abstractions; duplicate a little first. If 200 lines could be 50,
24
+ rewrite them.
25
+ - Make surgical changes: match existing style, remove imports/variables orphaned
26
+ by your edits, and leave unrelated code alone.
27
+ - Set verifiable goals and give a brief plan for multi-step work.
28
+ - Keep core logic pure Python; isolate I/O and integration at the edges.
29
+ - Follow the linked [language, docstring, formatting, and gallery standards](docs/contributing/standards.md).
30
+ Read the relevant sections before Python or gallery edits; they are requirements.
31
+
32
+ ## Testing and handoff
33
+
34
+ Use pytest. Add or update tests for behavior changes, with fixed seeds for random
35
+ behavior. Keep tests small and focused on one behavior. Apply the "Suspicious
36
+ Check": tighten any test that could pass for the wrong reason.
37
+
38
+ Use `uv` for environments and dependencies. Before handoff, run targeted tests for
39
+ changed behavior and lint. Format before finalizing non-trivial edits; type-check
40
+ when public Python code changes. Report anything you could not validate locally.
41
+ Ruff is the formatting/lint authority; fix issues rather than suppressing them by
42
+ default.
43
+
44
+ | Task | Command |
45
+ | --- | --- |
46
+ | Sync environment | `uv sync --dev` |
47
+ | Run tests | `uv run pytest tests/ -x` |
48
+ | Lint | `uv run ruff check .` |
49
+ | Format | `uv run ruff format .` |
50
+ | Type-check | `uv run mypy src/` |
51
+ | Install hooks | `uv run pre-commit install` |
52
+
53
+ Make small, thematic commits. Use conventional commits:
54
+ `<type>(<scope>): <description>` when a scope helps. Do not rewrite history unless
55
+ explicitly asked.
56
+
57
+ ## Plans and references
58
+
59
+ | Document | Read when |
60
+ | --- | --- |
61
+ | `plans/implementation_plan.md` | Starting implementation; understand phases and open questions |
62
+ | `plans/deferred.md` | Adding scope; avoid intentionally deferred work |
63
+ | `plans/architecture.md` | Changing public API shape, schema strategy, or notebook integration |
64
+ | `plans/tmp_repo_index.md` | Using `tmp/` repos for wrapper/widget design |
65
+ | `plans/project_bootstrap.md` | Updating or extending the initial scaffold |
@@ -5,6 +5,58 @@ 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.7.0] - 2026-10-20
9
+
10
+ ### Added
11
+
12
+ - Typed facet and surround compositions, dendrogram transforms, secondary-offset
13
+ channels, and the remaining schema and expression additions from GenomeSpy 1.2.0.
14
+ - Discoverable named field arguments on encoding constructors and named setters
15
+ for inline schema objects, with automatic public exports for generated channels.
16
+ - A DepMap clustered heatmap gallery example adapted from the official GenomeSpy
17
+ surround specification.
18
+
19
+ ### Changed
20
+
21
+ - Upgrade the bundled GenomeSpy Core, controls, Inspector, and schema to 1.2.0.
22
+ - Use surround layouts in the PISA interaction matrix, UpSet mutations, PBMC
23
+ marker matrix, and PBMC cell heatmap examples.
24
+ - Use named Python arguments and schema objects throughout gallery configuration,
25
+ and Python expression objects in the updated surround examples.
26
+
27
+ ### Fixed
28
+
29
+ - Keep chart colors aligned with the documentation's selected light or dark theme.
30
+ - Serialize named channel objects in shared surround-side encodings.
31
+ - Preserve secondary-offset field and expression types according to the schema.
32
+ - Support named resolution settings on unit charts and omit forbidden schema
33
+ properties from generated signatures.
34
+ - Avoid redundant validation of nested schema objects when validation is explicitly
35
+ disabled, while retaining default validation checks.
36
+
37
+ ## [0.6.0] - 2026-10-01
38
+
39
+ ### Added
40
+
41
+ - Add the prepared `airway_review` dataset for gene-review examples.
42
+
43
+ ### Changed
44
+
45
+ - Upgrade GenomeSpy Core, controls, and Inspector to 1.0.0 and regenerate
46
+ the Python schema API, including configurable `displace2d` animation half-life.
47
+ - Extend the sequence-editing notebook to support multi-base edits across the
48
+ displayed locus.
49
+ - Improve interaction and PISA documentation, gallery expressions, and README
50
+ animations.
51
+
52
+ ### Fixed
53
+
54
+ - Expose selection predicate classes through `gs` and support typed endpoint
55
+ projection setters, avoiding raw dictionaries in composed conditions.
56
+ - Restrict sequence-logo and alignment-logo zoom to the position axis and share
57
+ one bottom alignment axis.
58
+ - Render the ASCAT fitting example title as literal text.
59
+
8
60
  ## [0.5.0] - 2026-09-25
9
61
 
10
62
  ### Added
@@ -18,6 +70,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
18
70
 
19
71
  ### Changed
20
72
 
73
+ - Use browser-side `displace2d` label placement in the airway volcano and MA
74
+ gallery plots, with denser gene annotations and adaptive leader lines.
75
+
21
76
  - Reorganize the gallery into 13 categories, separating regulatory model
22
77
  interpretation, read alignments and RNA splicing, sequences and alignments,
23
78
  and interaction examples from the broader browser, annotation, and basic groups.
@@ -126,6 +181,8 @@ First public alpha release, targeting GenomeSpy Core 0.87.0.
126
181
  - Packaged example datasets, documentation, tutorials, and an interactive
127
182
  visualization gallery.
128
183
 
184
+ [0.7.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.6.0...v0.7.0
185
+ [0.6.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.5.0...v0.6.0
129
186
  [0.5.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.4.0...v0.5.0
130
187
  [0.4.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.3.0...v0.4.0
131
188
  [0.3.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.2.0...v0.3.0
@@ -90,6 +90,7 @@ Regenerate after changing that version or the generator:
90
90
 
91
91
  ```bash
92
92
  uv run python tools/generate_schema_wrapper.py
93
+ uv run python tools/vendor_javascript.py
93
94
  ```
94
95
 
95
96
  This requires `npm` and internet access. Use `--package-dir` for a local package,
@@ -111,6 +112,25 @@ New transforms should be generated from the schema. Add overrides in
111
112
  `tools/generate_schema_wrapper.py` only for Python conventions the schema
112
113
  cannot describe.
113
114
 
115
+ The generator emits explicit typed constructor and setter arguments from schema
116
+ properties, including inline objects; avoid replacing these with untyped
117
+ `**kwargs` or runtime-only signature patches. Channel imports and `__all__` are
118
+ generated too. A new channel must appear in the public namespace automatically.
119
+ New composition families still need renderable chart classes, serialization and
120
+ round-trip support. The schema-derived root coverage test must fail until that
121
+ support exists, rather than silently omitting unfamiliar roots.
122
+
123
+ When adapting examples, use named schema objects or nested setters such as
124
+ `gs.Scale().zoom(extent="data")`. Keep dictionaries for data records and authored
125
+ names such as datasets, templates and parameter values. Test generated signatures
126
+ and type-check a consumer example as well as validating its serialized JSON.
127
+
128
+ Altair uses the same separation between a generated schema API and handwritten
129
+ chart operations. Its [constructor and setter generator](https://github.com/vega/altair/blob/main/tools/schemapi/codegen.py)
130
+ emits typed signatures and overloads; its [property-setter runtime](https://github.com/vega/altair/blob/main/altair/utils/schemapi.py)
131
+ also supplies signatures for interactive completion. Prefer our existing explicit
132
+ Python methods so completion, static checking and runtime calls agree.
133
+
114
134
  ## Documentation
115
135
 
116
136
  ### API reference
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: genome-spy-python
3
- Version: 0.5.0
3
+ Version: 0.7.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/
@@ -33,6 +33,8 @@ Requires-Python: >=3.11
33
33
  Requires-Dist: anywidget>=0.11.0
34
34
  Requires-Dist: jsonschema>=4.26.0
35
35
  Requires-Dist: traitlets>=5.14.3
36
+ Provides-Extra: anndata
37
+ Requires-Dist: anndata>=0.11.0; extra == 'anndata'
36
38
  Provides-Extra: arrow
37
39
  Requires-Dist: pyarrow>=18.0.0; extra == 'arrow'
38
40
  Description-Content-Type: text/markdown
@@ -100,61 +102,130 @@ for supported tables and live updates.
100
102
 
101
103
  See the [getting-started guide](docs/getting-started.md) for the first example.
102
104
 
105
+ ## Agent skill
106
+
107
+ The package bundles a visualization skill for Codex and Claude Code. Installation
108
+ is explicit; importing or installing the Python package does not modify agent
109
+ configuration. To install for both agents in the current project:
110
+
111
+ ```bash
112
+ genome-spy-install-skills
113
+ ```
114
+
115
+ Use `--agent codex` or `--agent claude` to select one agent, `--project PATH` for
116
+ another project, or `--user` for personal installation. Existing modified skills
117
+ are preserved unless `--force` is supplied. See
118
+ [installation and update details](docs/agents/skill-distribution.md).
119
+
103
120
  ## Examples
104
121
 
122
+ A zoomable Manhattan plot using the bundled HapMap data (requires `pandas`):
123
+
105
124
  ```python
106
125
  import genome_spy as gs
126
+ from genome_spy.datasets import load_dataset
107
127
 
108
128
  chart = (
109
- gs.Chart(
110
- [
111
- {"x": 1, "y": 4, "group": "A"},
112
- {"x": 2, "y": 3, "group": "B"},
113
- {"x": 3, "y": 5, "group": "A"},
114
- ]
115
- )
116
- .mark_point(size=80)
129
+ # Load data.
130
+ gs.Chart(load_dataset("hapmap_gwas"))
131
+ # Format chromosome names.
132
+ .transform_formula(expr="datum.CHR == 23 ? 'chrX' : 'chr' + datum.CHR", as_="chrom")
133
+ # Calculate −log10 p.
134
+ .transform_formula(expr="-log(datum.P) / log(10)", as_="neglogp")
135
+ # Draw variants.
136
+ .mark_point(size=12)
137
+ # Set positions and colors.
117
138
  .encode(
118
- x="x:Q",
119
- y="y:Q",
120
- color="group:N",
139
+ x=gs.Locus("chrom", "BP").scale(assembly="hg18"),
140
+ y=gs.Y("neglogp:Q").title("−log10 p"),
141
+ color=gs.Color("CHR:N").scale(range=["#5b8fd6", "#8f98a3"]).legend(None),
121
142
  )
122
143
  )
123
-
124
144
  chart
125
145
  ```
126
146
 
127
- GenomeSpy also has locus-scaled axes for genomic coordinates. This small
128
- example renders intervals along a region of chromosome 1:
147
+ ![Manhattan plot zooming from the whole genome into an association peak](https://raw.githubusercontent.com/genome-spy/genome-spy-python/a6c724f48d94f86d8d0a8c3200549d7560a88a3c/docs/_static/readme-manhattan.webp)
148
+
149
+ [Explore the full example and data provenance](https://genomespy.app/genome-spy-python/gallery/manhattan_plot.html).
150
+
151
+ A sequence logo and aligned sequences with shared horizontal zoom:
129
152
 
130
153
  ```python
131
154
  import genome_spy as gs
132
155
 
133
- intervals = [
134
- {"chrom": "chr1", "start": 100, "end": 220, "name": "gene A"},
135
- {"chrom": "chr1", "start": 280, "end": 420, "name": "gene B"},
136
- ]
137
-
156
+ logo = (
157
+ gs.Chart()
158
+ # Count bases at each position.
159
+ .transform_aggregate(groupby=["pos", "sequence"])
160
+ # Handle gaps.
161
+ .transform_formula(expr="datum.sequence == '-' ? null : datum.sequence", as_="base")
162
+ # Stack bases by information content.
163
+ .transform_stack(
164
+ field="count",
165
+ groupby=["pos"],
166
+ offset="information",
167
+ baseField="base",
168
+ as_=["y0", "y1"],
169
+ )
170
+ # Draw logo letters.
171
+ .mark_text(logoLetters=True, fitToBand=True, fontWeight="bold")
172
+ # Set stack bounds.
173
+ .encode(
174
+ y=gs.Y("y0:Q").scale(domain=[0, 2], zoom=False).title("Bits"),
175
+ y2="y1:Q",
176
+ text="base:N",
177
+ )
178
+ .properties(height=100)
179
+ )
180
+ # Create sequence rows.
181
+ rows = gs.Chart().encode(y=gs.Y("identifier:N").scale(zoom=False).axis(None))
182
+ # Add base labels.
183
+ letters = rows.mark_text(size=11, fitToBand=True, opacity=0.7).encode(
184
+ text="sequence:N", color=gs.value("black")
185
+ )
186
+ # Layer tiles and labels.
187
+ sequences = (rows.mark_rect() + letters).properties(
188
+ height=gs.step(16), viewportHeight=160
189
+ )
138
190
  chart = (
139
- gs.Chart(intervals)
140
- .mark_rect()
191
+ # Combine panels.
192
+ (logo & sequences)
193
+ # Load data.
194
+ .properties(
195
+ data=gs.Data(
196
+ url="https://data.genomespy.app/sample-data/16SRNA_Deino_87seq.aln",
197
+ format=gs.data_format(type="fasta"),
198
+ )
199
+ )
200
+ # Split sequences into bases.
201
+ .transform_flatten_sequence()
202
+ # Set positions and colors.
141
203
  .encode(
142
- x=gs.Locus("chrom", "start"),
143
- x2="end:Q",
144
- y="name:N",
145
- color="name:N",
204
+ x=gs.X("pos:I").scale(domain=[190, 310], zoom=True).title(None),
205
+ color=gs.Color("sequence:N")
206
+ .scale(
207
+ domain=list("ACTGN-"),
208
+ range=["#4FBF45", "#4D96E8", "#E85F78", "#E8B322", "#BDBDBD", "#f5f5f5"],
209
+ )
210
+ .legend(None),
146
211
  )
212
+ # Share zoom and colors.
213
+ .resolve_scale(x="shared", color="shared")
214
+ .resolve_axis(x="shared")
147
215
  )
148
-
149
216
  chart
150
217
  ```
151
218
 
219
+ ![Sequence logo and aligned sequences zooming across multiple regions](https://raw.githubusercontent.com/genome-spy/genome-spy-python/main/docs/_static/readme-sequence-logo.webp?v=4cd9f86a0d31)
220
+
152
221
  Charts can be serialized to a portable GenomeSpy specification or standalone
153
222
  HTML:
154
223
 
155
224
  ```python
225
+ # Export JSON.
156
226
  chart.to_json()
157
- chart.save("intervals.html")
227
+ # Save HTML.
228
+ chart.save("chart.html")
158
229
  ```
159
230
 
160
231
  ### Update data without recreating the chart
@@ -165,12 +236,15 @@ existing GenomeSpy instance, so view state such as zoom is preserved.
165
236
 
166
237
  ```python
167
238
  chart = (
239
+ # Create an empty chart.
168
240
  gs.Chart(data={"name": "table"}, datasets={"table": []})
169
241
  .mark_point()
170
242
  .encode(x="x:Q", y="y:Q")
171
243
  )
244
+ # Show widget.
172
245
  view = chart.widget()
173
246
 
247
+ # Update data.
174
248
  view.set_dataset("table", updated_dataframe)
175
249
  ```
176
250
 
@@ -61,61 +61,130 @@ for supported tables and live updates.
61
61
 
62
62
  See the [getting-started guide](docs/getting-started.md) for the first example.
63
63
 
64
+ ## Agent skill
65
+
66
+ The package bundles a visualization skill for Codex and Claude Code. Installation
67
+ is explicit; importing or installing the Python package does not modify agent
68
+ configuration. To install for both agents in the current project:
69
+
70
+ ```bash
71
+ genome-spy-install-skills
72
+ ```
73
+
74
+ Use `--agent codex` or `--agent claude` to select one agent, `--project PATH` for
75
+ another project, or `--user` for personal installation. Existing modified skills
76
+ are preserved unless `--force` is supplied. See
77
+ [installation and update details](docs/agents/skill-distribution.md).
78
+
64
79
  ## Examples
65
80
 
81
+ A zoomable Manhattan plot using the bundled HapMap data (requires `pandas`):
82
+
66
83
  ```python
67
84
  import genome_spy as gs
85
+ from genome_spy.datasets import load_dataset
68
86
 
69
87
  chart = (
70
- gs.Chart(
71
- [
72
- {"x": 1, "y": 4, "group": "A"},
73
- {"x": 2, "y": 3, "group": "B"},
74
- {"x": 3, "y": 5, "group": "A"},
75
- ]
76
- )
77
- .mark_point(size=80)
88
+ # Load data.
89
+ gs.Chart(load_dataset("hapmap_gwas"))
90
+ # Format chromosome names.
91
+ .transform_formula(expr="datum.CHR == 23 ? 'chrX' : 'chr' + datum.CHR", as_="chrom")
92
+ # Calculate −log10 p.
93
+ .transform_formula(expr="-log(datum.P) / log(10)", as_="neglogp")
94
+ # Draw variants.
95
+ .mark_point(size=12)
96
+ # Set positions and colors.
78
97
  .encode(
79
- x="x:Q",
80
- y="y:Q",
81
- color="group:N",
98
+ x=gs.Locus("chrom", "BP").scale(assembly="hg18"),
99
+ y=gs.Y("neglogp:Q").title("−log10 p"),
100
+ color=gs.Color("CHR:N").scale(range=["#5b8fd6", "#8f98a3"]).legend(None),
82
101
  )
83
102
  )
84
-
85
103
  chart
86
104
  ```
87
105
 
88
- GenomeSpy also has locus-scaled axes for genomic coordinates. This small
89
- example renders intervals along a region of chromosome 1:
106
+ ![Manhattan plot zooming from the whole genome into an association peak](https://raw.githubusercontent.com/genome-spy/genome-spy-python/a6c724f48d94f86d8d0a8c3200549d7560a88a3c/docs/_static/readme-manhattan.webp)
107
+
108
+ [Explore the full example and data provenance](https://genomespy.app/genome-spy-python/gallery/manhattan_plot.html).
109
+
110
+ A sequence logo and aligned sequences with shared horizontal zoom:
90
111
 
91
112
  ```python
92
113
  import genome_spy as gs
93
114
 
94
- intervals = [
95
- {"chrom": "chr1", "start": 100, "end": 220, "name": "gene A"},
96
- {"chrom": "chr1", "start": 280, "end": 420, "name": "gene B"},
97
- ]
98
-
115
+ logo = (
116
+ gs.Chart()
117
+ # Count bases at each position.
118
+ .transform_aggregate(groupby=["pos", "sequence"])
119
+ # Handle gaps.
120
+ .transform_formula(expr="datum.sequence == '-' ? null : datum.sequence", as_="base")
121
+ # Stack bases by information content.
122
+ .transform_stack(
123
+ field="count",
124
+ groupby=["pos"],
125
+ offset="information",
126
+ baseField="base",
127
+ as_=["y0", "y1"],
128
+ )
129
+ # Draw logo letters.
130
+ .mark_text(logoLetters=True, fitToBand=True, fontWeight="bold")
131
+ # Set stack bounds.
132
+ .encode(
133
+ y=gs.Y("y0:Q").scale(domain=[0, 2], zoom=False).title("Bits"),
134
+ y2="y1:Q",
135
+ text="base:N",
136
+ )
137
+ .properties(height=100)
138
+ )
139
+ # Create sequence rows.
140
+ rows = gs.Chart().encode(y=gs.Y("identifier:N").scale(zoom=False).axis(None))
141
+ # Add base labels.
142
+ letters = rows.mark_text(size=11, fitToBand=True, opacity=0.7).encode(
143
+ text="sequence:N", color=gs.value("black")
144
+ )
145
+ # Layer tiles and labels.
146
+ sequences = (rows.mark_rect() + letters).properties(
147
+ height=gs.step(16), viewportHeight=160
148
+ )
99
149
  chart = (
100
- gs.Chart(intervals)
101
- .mark_rect()
150
+ # Combine panels.
151
+ (logo & sequences)
152
+ # Load data.
153
+ .properties(
154
+ data=gs.Data(
155
+ url="https://data.genomespy.app/sample-data/16SRNA_Deino_87seq.aln",
156
+ format=gs.data_format(type="fasta"),
157
+ )
158
+ )
159
+ # Split sequences into bases.
160
+ .transform_flatten_sequence()
161
+ # Set positions and colors.
102
162
  .encode(
103
- x=gs.Locus("chrom", "start"),
104
- x2="end:Q",
105
- y="name:N",
106
- color="name:N",
163
+ x=gs.X("pos:I").scale(domain=[190, 310], zoom=True).title(None),
164
+ color=gs.Color("sequence:N")
165
+ .scale(
166
+ domain=list("ACTGN-"),
167
+ range=["#4FBF45", "#4D96E8", "#E85F78", "#E8B322", "#BDBDBD", "#f5f5f5"],
168
+ )
169
+ .legend(None),
107
170
  )
171
+ # Share zoom and colors.
172
+ .resolve_scale(x="shared", color="shared")
173
+ .resolve_axis(x="shared")
108
174
  )
109
-
110
175
  chart
111
176
  ```
112
177
 
178
+ ![Sequence logo and aligned sequences zooming across multiple regions](https://raw.githubusercontent.com/genome-spy/genome-spy-python/main/docs/_static/readme-sequence-logo.webp?v=4cd9f86a0d31)
179
+
113
180
  Charts can be serialized to a portable GenomeSpy specification or standalone
114
181
  HTML:
115
182
 
116
183
  ```python
184
+ # Export JSON.
117
185
  chart.to_json()
118
- chart.save("intervals.html")
186
+ # Save HTML.
187
+ chart.save("chart.html")
119
188
  ```
120
189
 
121
190
  ### Update data without recreating the chart
@@ -126,12 +195,15 @@ existing GenomeSpy instance, so view state such as zoom is preserved.
126
195
 
127
196
  ```python
128
197
  chart = (
198
+ # Create an empty chart.
129
199
  gs.Chart(data={"name": "table"}, datasets={"table": []})
130
200
  .mark_point()
131
201
  .encode(x="x:Q", y="y:Q")
132
202
  )
203
+ # Show widget.
133
204
  view = chart.widget()
134
205
 
206
+ # Update data.
135
207
  view.set_dataset("table", updated_dataframe)
136
208
  ```
137
209