genome-spy-python 0.6.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 (429) 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.7.0/AGENTS.md +65 -0
  4. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/CHANGELOG.md +31 -0
  5. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/CONTRIBUTING.md +20 -0
  6. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/PKG-INFO +18 -1
  7. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/README.md +15 -0
  8. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/THIRD_PARTY_NOTICES.md +13 -0
  9. genome_spy_python-0.7.0/docs/_ext/genomespy_agents.py +36 -0
  10. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_ext/genomespy_gallery.py +9 -0
  11. genome_spy_python-0.7.0/docs/_static/gallery/clustered_heatmap.png +0 -0
  12. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
  13. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
  14. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
  15. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_umap.png +0 -0
  16. genome_spy_python-0.7.0/docs/_static/gallery/pbmc_umap_genes.png +0 -0
  17. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/genomespy.css +12 -0
  18. genome_spy_python-0.7.0/docs/agents/data.md +121 -0
  19. genome_spy_python-0.7.0/docs/agents/encodings.md +144 -0
  20. genome_spy_python-0.7.0/docs/agents/manifest.json +92 -0
  21. genome_spy_python-0.7.0/docs/agents/quickstart.md +81 -0
  22. genome_spy_python-0.7.0/docs/agents/rendering.md +64 -0
  23. genome_spy_python-0.7.0/docs/agents/scales-axes-legends.md +100 -0
  24. genome_spy_python-0.7.0/docs/agents/skill-distribution.md +62 -0
  25. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/api.md +35 -0
  26. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/conf.py +3 -1
  27. genome_spy_python-0.7.0/docs/contributing/standards.md +75 -0
  28. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/datasets.md +9 -0
  29. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_fitting.py +40 -33
  30. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_alignments.py +5 -4
  31. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_pileup.py +3 -2
  32. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bigbed_ccre_track.py +3 -2
  33. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/clinvar_variants.py +3 -2
  34. genome_spy_python-0.7.0/docs/examples/clustered_heatmap.md +47 -0
  35. genome_spy_python-0.7.0/docs/examples/clustered_heatmap.py +394 -0
  36. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/combined_laml_oncoplot.py +1 -1
  37. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/composing_genome_browser.py +3 -2
  38. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_adaptive_bqtl.py +22 -16
  39. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_bqtl.py +22 -16
  40. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/hcc1954_sv_cnv.py +4 -3
  41. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/independent_scales.md +14 -0
  42. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/indexed_fasta_sequence.py +3 -2
  43. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/luad_oncoprint.py +12 -10
  44. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/multiple_sequence_alignment.py +2 -1
  45. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/oncoprint.py +14 -12
  46. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/p53_sequence_comparison.py +1 -1
  47. genome_spy_python-0.7.0/docs/examples/pbmc_cell_heatmap.md +24 -0
  48. genome_spy_python-0.7.0/docs/examples/pbmc_cell_heatmap.py +103 -0
  49. genome_spy_python-0.7.0/docs/examples/pbmc_expression_tracks.md +18 -0
  50. genome_spy_python-0.7.0/docs/examples/pbmc_expression_tracks.py +124 -0
  51. genome_spy_python-0.7.0/docs/examples/pbmc_marker_matrix.md +24 -0
  52. genome_spy_python-0.7.0/docs/examples/pbmc_marker_matrix.py +160 -0
  53. genome_spy_python-0.7.0/docs/examples/pbmc_umap.md +15 -0
  54. genome_spy_python-0.7.0/docs/examples/pbmc_umap.py +58 -0
  55. genome_spy_python-0.7.0/docs/examples/pbmc_umap_genes.md +18 -0
  56. genome_spy_python-0.7.0/docs/examples/pbmc_umap_genes.py +96 -0
  57. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +1 -1
  58. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_interaction_matrix.md +4 -4
  59. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_interaction_matrix.py +28 -18
  60. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_squid.py +18 -12
  61. genome_spy_python-0.7.0/docs/examples/point_mark.md +14 -0
  62. genome_spy_python-0.7.0/docs/examples/rect_heatmap.md +15 -0
  63. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rnf7_direct_rna.py +1 -1
  64. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/six_frame_translation.py +5 -4
  65. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/upset_mutations.md +4 -3
  66. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/upset_mutations.py +29 -39
  67. genome_spy_python-0.7.0/docs/examples/vertical_concat.md +14 -0
  68. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/index.md +3 -0
  69. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/composition.py +34 -0
  70. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/encoding_channels.py +9 -0
  71. genome_spy_python-0.7.0/docs/tutorials/expressions.py +34 -0
  72. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/interaction.py +10 -0
  73. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/composition.md +39 -0
  74. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/data.md +54 -5
  75. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/encodings.md +23 -2
  76. genome_spy_python-0.7.0/docs/user-guide/expressions.md +90 -0
  77. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/index.md +2 -0
  78. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/interaction.md +21 -9
  79. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/transforms.md +6 -41
  80. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/pyproject.toml +14 -2
  81. genome_spy_python-0.7.0/skills/create-genomespy-visualization/SKILL.md +91 -0
  82. genome_spy_python-0.7.0/skills/create-genomespy-visualization/agents/openai.yaml +4 -0
  83. genome_spy_python-0.7.0/skills/create-genomespy-visualization/references/grouped-charts.md +102 -0
  84. genome_spy_python-0.7.0/skills/create-genomespy-visualization/references/table-chart.md +157 -0
  85. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/__init__.py +102 -57
  86. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_chart_authoring.py +6 -1
  87. genome_spy_python-0.7.0/src/genome_spy/_skill_install.py +158 -0
  88. genome_spy_python-0.7.0/src/genome_spy/anndata.py +159 -0
  89. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/api.py +71 -27
  90. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/arrow.py +7 -2
  91. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/channels.py +5 -2
  92. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/chart.py +66 -6
  93. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/__init__.py +1 -0
  94. genome_spy_python-0.7.0/src/genome_spy/datasets/_pbmc.py +87 -0
  95. genome_spy_python-0.7.0/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
  96. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/__init__.py +31 -1
  97. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/_kwds.py +72 -45
  98. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/_typing.py +3 -0
  99. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/capabilities.json +25 -2
  100. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/channels.py +1115 -282
  101. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/composition.py +464 -21
  102. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/core.py +35222 -24526
  103. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/ergonomics.py +105 -48
  104. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/expressions.py +7 -0
  105. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/genome-spy-schema.json +13754 -5658
  106. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/lazy.py +3 -0
  107. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/mixins.py +2500 -780
  108. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schemapi.py +1 -5
  109. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/controls.js +1 -1
  110. genome_spy_python-0.7.0/src/genome_spy/static/genome-spy.js +1131 -0
  111. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/inspector.js +4 -4
  112. genome_spy_python-0.7.0/tests/browser/test_core_upgrade.py +80 -0
  113. genome_spy_python-0.7.0/tests/browser/test_docs_theme.py +68 -0
  114. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/README.md +15 -0
  115. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +445 -0
  116. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/clustered-heatmap.json +594 -0
  117. genome_spy_python-0.7.0/tests/fixtures/upstream_examples/upsetr-mutations.json +403 -0
  118. genome_spy_python-0.7.0/tests/test_agent_docs.py +262 -0
  119. genome_spy_python-0.7.0/tests/test_anndata.py +287 -0
  120. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_arrow.py +4 -1
  121. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_chart.py +1 -1
  122. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_datasets.py +1 -0
  123. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_docs_api_reference.py +8 -0
  124. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_docs_gallery.py +46 -22
  125. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_docs_tutorial.py +2 -0
  126. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_generated_schema_package.py +46 -0
  127. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_licensing.py +1 -0
  128. genome_spy_python-0.7.0/tests/test_new_compositions.py +159 -0
  129. genome_spy_python-0.7.0/tests/test_pbmc_gallery.py +354 -0
  130. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_pisa_gallery.py +6 -4
  131. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_schema_codegen.py +48 -4
  132. genome_spy_python-0.7.0/tests/test_skill_install.py +130 -0
  133. genome_spy_python-0.7.0/tests/test_upstream_surround_gallery.py +161 -0
  134. genome_spy_python-0.7.0/tools/agent_docs.py +239 -0
  135. genome_spy_python-0.7.0/tools/agent_markdown.py +277 -0
  136. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/docs_gallery.py +8 -0
  137. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/generate_api_docs.py +12 -0
  138. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/generate_schema_wrapper.py +24 -4
  139. genome_spy_python-0.7.0/tools/prepare_pbmc_gallery_data.py +244 -0
  140. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/schemapi/codegen.py +68 -59
  141. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/uv.lock +703 -17
  142. genome_spy_python-0.6.0/.agents/skills/proper-code-review/SKILL.md +0 -165
  143. genome_spy_python-0.6.0/.claude/skills/commit/SKILL.md +0 -105
  144. genome_spy_python-0.6.0/AGENTS.md +0 -153
  145. genome_spy_python-0.6.0/src/genome_spy/static/genome-spy.js +0 -1005
  146. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
  147. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/design.md +0 -0
  148. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
  149. {genome_spy_python-0.6.0/.agents → genome_spy_python-0.7.0/.claude}/skills/commit/SKILL.md +0 -0
  150. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
  151. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
  152. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/design.md +0 -0
  153. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
  154. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.gitattributes +0 -0
  155. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.github/workflows/ci.yml +0 -0
  156. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.github/workflows/docs.yml +0 -0
  157. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.github/workflows/release.yml +0 -0
  158. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.gitignore +0 -0
  159. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.pre-commit-config.yaml +0 -0
  160. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.python-version +0 -0
  161. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/CLAUDE.md +0 -0
  162. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSE +0 -0
  163. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
  164. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/CC-BY-4.0.txt +0 -0
  165. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
  166. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/CC0-1.0.txt +0 -0
  167. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
  168. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/GENOMESPY-MIT.txt +0 -0
  169. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/LATO-OFL-1.1.txt +0 -0
  170. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
  171. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
  172. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/README.md +0 -0
  173. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/airway_metadata.csv +0 -0
  174. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
  175. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/hapmap_gwas.csv +0 -0
  176. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
  177. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/pik3ca_mutations.json +0 -0
  178. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/external-links.js +0 -0
  179. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/airway_ma_plot.png +0 -0
  180. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/airway_volcano_plot.png +0 -0
  181. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
  182. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ascat_fitting.png +0 -0
  183. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
  184. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bam_read_pileup.png +0 -0
  185. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
  186. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
  187. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/clinvar_variants.png +0 -0
  188. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
  189. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
  190. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/copy_number.png +0 -0
  191. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/coverage_pileup.png +0 -0
  192. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/cytobands.png +0 -0
  193. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/diverging_bars.png +0 -0
  194. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
  195. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
  196. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/genome_tracks.png +0 -0
  197. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/geometric_zoom.png +0 -0
  198. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
  199. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
  200. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/heatmap_with_text.png +0 -0
  201. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/independent_scales.png +0 -0
  202. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
  203. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/layered_lollipop.png +0 -0
  204. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/link_mark.png +0 -0
  205. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
  206. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/manhattan_plot.png +0 -0
  207. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
  208. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/needle_plot.png +0 -0
  209. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/oncoprint.png +0 -0
  210. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
  211. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/penguin_brush.png +0 -0
  212. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
  213. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
  214. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pisa_squid.png +0 -0
  215. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/point_mark.png +0 -0
  216. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/point_styles.png +0 -0
  217. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rainfall_plot.png +0 -0
  218. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ranged_rule.png +0 -0
  219. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rect_heatmap.png +0 -0
  220. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
  221. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
  222. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/sashimi_plot.png +0 -0
  223. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
  224. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/sequence_logo.png +0 -0
  225. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/six_frame_translation.png +0 -0
  226. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/stacked_bar.png +0 -0
  227. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
  228. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
  229. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/tsne.png +0 -0
  230. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/upset_mutations.png +0 -0
  231. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/vertical_concat.png +0 -0
  232. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/volcano_plot.png +0 -0
  233. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/readme-manhattan.webp +0 -0
  234. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/readme-sequence-logo.webp +0 -0
  235. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/showcase.js +0 -0
  236. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/snaketie.svg +0 -0
  237. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/workflows.css +0 -0
  238. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/workflows.js +0 -0
  239. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/autosummary/class.rst +0 -0
  240. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
  241. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/base.html +0 -0
  242. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/components/view-this-page.html +0 -0
  243. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/about.md +0 -0
  244. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_ma_plot.md +0 -0
  245. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_ma_plot.py +0 -0
  246. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_volcano_plot.md +0 -0
  247. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_volcano_plot.py +0 -0
  248. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_copy_number.md +0 -0
  249. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_copy_number.py +0 -0
  250. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_fitting.md +0 -0
  251. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_alignments.md +0 -0
  252. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_pileup.md +0 -0
  253. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
  254. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/brush_linked_genome_tracks.py +0 -0
  255. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/clinvar_variants.md +0 -0
  256. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/combined_laml_oncoplot.md +0 -0
  257. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/composing_genome_browser.md +0 -0
  258. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/copy_number.py +0 -0
  259. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/coverage_pileup.md +0 -0
  260. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/coverage_pileup.py +0 -0
  261. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/cytobands.md +0 -0
  262. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/cytobands.py +0 -0
  263. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/diverging_bars.md +0 -0
  264. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/diverging_bars.py +0 -0
  265. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
  266. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_bqtl.md +0 -0
  267. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/genome_tracks.py +0 -0
  268. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/geometric_zoom.md +0 -0
  269. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/geometric_zoom.py +0 -0
  270. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/gff3_gene_annotations.md +0 -0
  271. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/gff3_gene_annotations.py +0 -0
  272. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
  273. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/heatmap_with_text.md +0 -0
  274. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/heatmap_with_text.py +0 -0
  275. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/independent_scales.py +0 -0
  276. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/layered_lollipop.md +0 -0
  277. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/layered_lollipop.py +0 -0
  278. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/link_mark.py +0 -0
  279. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/luad_oncoprint.md +0 -0
  280. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/manhattan_plot.md +0 -0
  281. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/manhattan_plot.py +0 -0
  282. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/multiple_sequence_alignment.md +0 -0
  283. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/needle_plot.py +0 -0
  284. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/oncoprint.md +0 -0
  285. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/p53_sequence_comparison.md +0 -0
  286. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/penguin_brush.md +0 -0
  287. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/penguin_brush.py +0 -0
  288. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
  289. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_squid.md +0 -0
  290. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/point_mark.py +0 -0
  291. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/point_styles.md +0 -0
  292. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/point_styles.py +0 -0
  293. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rainfall_plot.md +0 -0
  294. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rainfall_plot.py +0 -0
  295. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ranged_rule.py +0 -0
  296. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rect_heatmap.py +0 -0
  297. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/refseq_scored_genes.md +0 -0
  298. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/refseq_scored_genes.py +0 -0
  299. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rnf7_direct_rna.md +0 -0
  300. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/sashimi_plot.md +0 -0
  301. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/sashimi_plot.py +0 -0
  302. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/scrollable_viewport.py +0 -0
  303. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/sequence_logo.py +0 -0
  304. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/six_frame_translation.md +0 -0
  305. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/stacked_bar.md +0 -0
  306. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/stacked_bar.py +0 -0
  307. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/stacked_genome_browser.py +0 -0
  308. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tcga_ov_gistic.md +0 -0
  309. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tcga_ov_gistic.py +0 -0
  310. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tsne.md +0 -0
  311. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tsne.py +0 -0
  312. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/vertical_concat.py +0 -0
  313. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/volcano_plot.md +0 -0
  314. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/volcano_plot.py +0 -0
  315. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/getting-started.md +0 -0
  316. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/component.py +0 -0
  317. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/index.html +0 -0
  318. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/notebook.ipynb +0 -0
  319. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/server.py +0 -0
  320. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/annotations.py +0 -0
  321. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/charts_and_marks.py +0 -0
  322. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/configuration.py +0 -0
  323. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/data_inputs.py +0 -0
  324. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/display_controls.py +0 -0
  325. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/genome_browser_layouts.py +0 -0
  326. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/genomic_coordinates.py +0 -0
  327. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/genomic_data.py +0 -0
  328. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/getting_started.py +0 -0
  329. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/importing_specifications.py +0 -0
  330. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/notebooks.py +0 -0
  331. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/scales_and_guides.py +0 -0
  332. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/serialization.py +0 -0
  333. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/transforms.py +0 -0
  334. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/annotations.md +0 -0
  335. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/charts.md +0 -0
  336. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/configuration.md +0 -0
  337. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/connect-python.md +0 -0
  338. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/display-controls.md +0 -0
  339. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/embed-api.md +0 -0
  340. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/genome-browser-layouts.md +0 -0
  341. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/genomic-axes.md +0 -0
  342. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/genomic-data.md +0 -0
  343. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/importing-specifications.md +0 -0
  344. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/notebooks.md +0 -0
  345. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/scales-axes-legends.md +0 -0
  346. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/serialization.md +0 -0
  347. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/using-charts.md +0 -0
  348. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/annotate-intervals.md +0 -0
  349. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/edit-sequence.md +0 -0
  350. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/index.md +0 -0
  351. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/pick-genes.md +0 -0
  352. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/select-genes.md +0 -0
  353. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/annotate_genomic_intervals.ipynb +0 -0
  354. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
  355. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/edit_sequence.ipynb +0 -0
  356. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/embed_api.ipynb +0 -0
  357. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/pick_genes.ipynb +0 -0
  358. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/select_genes.ipynb +0 -0
  359. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_conditions.py +0 -0
  360. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_embed.py +0 -0
  361. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_expressions.py +0 -0
  362. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_parameters.py +0 -0
  363. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_render.py +0 -0
  364. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_utils.py +0 -0
  365. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_widget.py +0 -0
  366. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/data.py +0 -0
  367. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/data_transformers.py +0 -0
  368. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_airway.py +0 -0
  369. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_annotations.py +0 -0
  370. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_direct_rna.py +0 -0
  371. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_gistic.py +0 -0
  372. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_grammar.py +0 -0
  373. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_hapmap.py +0 -0
  374. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_mutation.py +0 -0
  375. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
  376. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
  377. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
  378. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
  379. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
  380. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
  381. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
  382. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
  383. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
  384. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
  385. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
  386. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
  387. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
  388. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
  389. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
  390. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
  391. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
  392. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
  393. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
  394. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
  395. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/embed.py +0 -0
  396. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/helpers.py +0 -0
  397. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/jupyter.py +0 -0
  398. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/py.typed +0 -0
  399. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/embed-bridge.js +0 -0
  400. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/widget.js +0 -0
  401. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/__init__.py +0 -0
  402. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_docs_workflows.py +0 -0
  403. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_embed_api.py +0 -0
  404. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_offline_rendering.py +0 -0
  405. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_python_web_example.py +0 -0
  406. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/embed-bridge.test.mjs +0 -0
  407. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_combined_gallery_data.py +0 -0
  408. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_conditions.py +0 -0
  409. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_data_transformers.py +0 -0
  410. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_embed.py +0 -0
  411. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_embed_notebook.py +0 -0
  412. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_expressions.py +0 -0
  413. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_generated_transform_methods.py +0 -0
  414. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_javascript_assets.py +0 -0
  415. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_python_connection_example.py +0 -0
  416. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_render_thumbnails.py +0 -0
  417. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_rnf7_direct_rna_example.py +0 -0
  418. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_widget.py +0 -0
  419. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_workflow_notebooks.py +0 -0
  420. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/widget.test.mjs +0 -0
  421. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/check_notebook_rendering.py +0 -0
  422. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/docs_workflows.py +0 -0
  423. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/prepare_airway_review.py +0 -0
  424. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/prepare_combined_gallery_data.py +0 -0
  425. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/prepare_refseq_gene_annotations.py +0 -0
  426. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/render_thumbnails.py +0 -0
  427. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/schemapi/__init__.py +0 -0
  428. {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/schemapi/expression_codegen.py +0 -0
  429. {genome_spy_python-0.6.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.
@@ -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,35 @@ 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
+
8
37
  ## [0.6.0] - 2026-10-01
9
38
 
10
39
  ### Added
@@ -152,6 +181,8 @@ First public alpha release, targeting GenomeSpy Core 0.87.0.
152
181
  - Packaged example datasets, documentation, tutorials, and an interactive
153
182
  visualization gallery.
154
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
155
186
  [0.5.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.4.0...v0.5.0
156
187
  [0.4.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.3.0...v0.4.0
157
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.6.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,6 +102,21 @@ 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
 
105
122
  A zoomable Manhattan plot using the bundled HapMap data (requires `pandas`):
@@ -61,6 +61,21 @@ 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
 
66
81
  A zoomable Manhattan plot using the bundled HapMap data (requires `pandas`):
@@ -106,6 +106,19 @@ The full CC BY 4.0 and CC0 texts are in `LICENSES/CC-BY-4.0.txt` and
106
106
  `LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt` accompany the corresponding
107
107
  selection, formatting and example contributions.
108
108
 
109
+ ## PBMC marker expression
110
+
111
+ `pbmc_markers.json.gz` contains selected markers from 2,638 cells in Scanpy's processed
112
+ PBMC3k fixture, obtained from [cellxgene revision
113
+ 68dfbcc](https://github.com/chanzuckerberg/cellxgene/blob/68dfbcc2eb675e96c6a5e2a6b7a0d3465ccf46bc/example-dataset/pbmc3k.h5ad).
114
+ The original [10x Genomics PBMC3k dataset](https://www.10xgenomics.com/datasets/3-k-pbm-cs-from-a-healthy-donor-1-standard-1-1-0)
115
+ is licensed CC BY 4.0; credit 10x Genomics and Scanpy's preprocessing contributors.
116
+ The subset retains saved UMAP coordinates, `raw.X` log1p counts and cell-type annotations, groups
117
+ cells while preserving within-group order, and adds marker means, a single-linkage
118
+ Euclidean group tree, and plotting coordinates. `tools/prepare_pbmc_gallery_data.py` reproduces these modifications;
119
+ the source checksum is retained in the bundle. The CC BY 4.0 text is in
120
+ `LICENSES/CC-BY-4.0.txt`.
121
+
109
122
  ## Bundled TCGA example tables
110
123
 
111
124
  | Files | Source and processing |
@@ -0,0 +1,36 @@
1
+ """Publish plain agent Markdown after successful HTML builds."""
2
+
3
+ from pathlib import Path
4
+ import sys
5
+ from typing import Any
6
+
7
+ from sphinx.application import Sphinx
8
+
9
+ _ROOT = Path(__file__).resolve().parents[2]
10
+ sys.path.insert(0, str(_ROOT))
11
+
12
+ from tools.agent_docs import publish_agent_docs # noqa: E402
13
+
14
+
15
+ def _publish(app: Sphinx, exception: Exception | None) -> None:
16
+ if exception is None and app.builder.format == "html":
17
+ publish_agent_docs(_ROOT, Path(app.outdir), app.config.html_baseurl)
18
+
19
+
20
+ def setup(app: Sphinx) -> dict[str, Any]:
21
+ """Register agent-doc publication after successful HTML builds.
22
+
23
+ Args:
24
+ app: Sphinx application.
25
+
26
+ Returns:
27
+ Extension version and parallel-read safety metadata.
28
+
29
+ Raises:
30
+ None.
31
+
32
+ Example:
33
+ >>> setup(app) # doctest: +SKIP
34
+ """
35
+ app.connect("build-finished", _publish)
36
+ return {"version": "1", "parallel_read_safe": True}
@@ -107,6 +107,15 @@ def _remove_stale_arrow_assets(referenced: set[str]) -> None:
107
107
  # Cards share titles, but only the gallery index shows data subtitles.
108
108
  # Example headings stay unchanged; new examples fall back to their source title.
109
109
  GALLERY_CARD_LABELS = {
110
+ "pbmc_umap": ("PBMC UMAP", "PBMC3k · Cell types"),
111
+ "pbmc_umap_genes": ("PBMC UMAP panels", "PBMC3k · Markers and cell types"),
112
+ "pbmc_marker_matrix": ("PBMC marker matrix", "PBMC3k · 12 marker genes"),
113
+ "pbmc_cell_heatmap": ("PBMC cell heatmap", "PBMC3k · 2,638 cells"),
114
+ "pbmc_expression_tracks": ("PBMC expression tracks", "PBMC3k · AnnData"),
115
+ "clustered_heatmap": (
116
+ "Clustered heatmap with dendrograms",
117
+ "DepMap · 60 cell lines and 72 genes",
118
+ ),
110
119
  "stacked_bar": ("Horizontal stacked bars", "Barley yields · Vega datasets"),
111
120
  "layered_lollipop": ("Layered lollipop plot", "Synthetic sine wave"),
112
121
  "independent_scales": (
@@ -432,6 +432,7 @@ p.lead {
432
432
  /* ---------- Live documentation embeds ---------- */
433
433
  /* Render gallery and prose charts inline at the full available width. */
434
434
  .gs-doc-embed {
435
+ color-scheme: light;
435
436
  display: block;
436
437
  width: 100%;
437
438
  height: 400px;
@@ -439,6 +440,17 @@ p.lead {
439
440
  margin: 1.25rem 0 0.5rem;
440
441
  }
441
442
 
443
+ /* Match Furo's selected theme instead of the operating system's preference. */
444
+ body[data-theme="dark"] .gs-doc-embed {
445
+ color-scheme: dark;
446
+ }
447
+
448
+ @media (prefers-color-scheme: dark) {
449
+ body:not([data-theme="light"]) .gs-doc-embed {
450
+ color-scheme: dark;
451
+ }
452
+ }
453
+
442
454
  .gs-embed-actions {
443
455
  margin: 0.3rem 0 0.6rem;
444
456
  text-align: center;
@@ -0,0 +1,121 @@
1
+ # Data inputs
2
+
3
+ ## Records: base package
4
+
5
+ Use when the input is a list of records with numeric `x` and `y`, plus an `id`.
6
+
7
+ ```python
8
+ import genome_spy as gs
9
+
10
+ rows = [{"id": "a", "x": 2, "y": 5}, {"id": "b", "x": 4, "y": 3}]
11
+ chart = gs.Chart(rows).mark_point().encode(x="x:Q", y="y:Q", tooltip=["id:N"])
12
+ chart.to_dict()
13
+ ```
14
+
15
+ ## Dataframes and indexes: `arrow` extra
16
+
17
+ Pandas, Polars, and PyArrow tables are accepted directly. Expose useful indexes
18
+ as columns; inspect types, bounded samples, missing values, ranges, and order.
19
+
20
+ ```python
21
+ import genome_spy as gs
22
+ import pandas as pd
23
+
24
+ rows = [{"id": "a", "x": 2, "y": 5}, {"id": "b", "x": 4, "y": 3}]
25
+ frame = pd.DataFrame(rows).set_index("id")
26
+ records_with_ids = frame.reset_index()
27
+ assert records_with_ids["id"].is_unique
28
+ chart = gs.Chart(records_with_ids).mark_point().encode(
29
+ x="x:Q", y="y:Q", tooltip=["id:N"]
30
+ )
31
+ chart.to_dict()
32
+ ```
33
+
34
+ CSV loading and data checks happen in Python; [declarative transforms](encodings.md#browser-transforms)
35
+ execute in GenomeSpy. Preserve supplied measurements and report any filtering,
36
+ sampling, conversions, or derived columns.
37
+
38
+ ## Measurement source and selection scope
39
+
40
+ Before encoding, identify the source table/field, units, transformations and
41
+ aggregation. Normalizing before grouping differs from normalizing group means;
42
+ fractions also need a denominator and missing/zero rules.
43
+
44
+ Feature selection and record filtering are separate. Here a supplied feature
45
+ list chooses columns to show; both observation groups remain visible. The means
46
+ are prepared inputs, not calculated by this chart.
47
+
48
+ ```python
49
+ import genome_spy as gs
50
+
51
+ summaries = [
52
+ {"group": "A", "feature": "f1", "mean_normalized_score": 0.2},
53
+ {"group": "B", "feature": "f1", "mean_normalized_score": 0.8},
54
+ {"group": "A", "feature": "f2", "mean_normalized_score": 0.5},
55
+ {"group": "B", "feature": "f2", "mean_normalized_score": 0.4},
56
+ ]
57
+ feature_lists = {"A": ["f1"], "B": ["f2"]}
58
+ selected_features = feature_lists["A"]
59
+ visible_groups = ["A", "B"]
60
+ selected = [
61
+ row for row in summaries
62
+ if row["feature"] in selected_features and row["group"] in visible_groups
63
+ ]
64
+ chart = gs.Chart(selected).mark_point(filled=True).encode(
65
+ x=gs.X("feature:N").scale(type="band", domain=selected_features),
66
+ y=gs.Y("group:N").scale(type="band", domain=visible_groups, reverse=True),
67
+ color=gs.Color("mean_normalized_score:Q").legend(title="Mean normalized score"),
68
+ )
69
+ chart.to_dict()
70
+ ```
71
+
72
+ Expected: two points for `f1`, one per group. Changing `visible_groups` filters
73
+ records; changing its order changes display order. Choosing a different value
74
+ field changes the measurement. Keep these decisions explicit.
75
+
76
+ ## Remote CSV
77
+
78
+ ```python
79
+ import genome_spy as gs
80
+
81
+ remote = gs.Chart(
82
+ gs.Data(url="https://example.org/measurements.csv", format=gs.data_format(type="csv"))
83
+ ).mark_point().encode(x="x:Q", y="y:Q")
84
+ remote.to_dict() # Serializes the URL; does not fetch or validate its contents.
85
+ ```
86
+
87
+ Replace the illustrative URL with an accessible table. `inline=True` bundles the
88
+ runtime, not URL data; rendering still needs network access.
89
+
90
+ ## AnnData projection: `anndata` and `arrow` extras
91
+
92
+ A small synthetic input makes the source selection explicit:
93
+
94
+ ```python
95
+ import anndata as ad
96
+ import genome_spy as gs
97
+ import numpy as np
98
+ import pandas as pd
99
+ from genome_spy.anndata import from_anndata
100
+
101
+ adata = ad.AnnData(
102
+ X=np.array([[1.0], [2.0]]),
103
+ obs=pd.DataFrame({"group": ["A", "B"]}, index=["a", "b"]),
104
+ var=pd.DataFrame(index=["feature_a"]),
105
+ )
106
+ adata.obsm["embedding"] = np.array([[0.0, 1.0], [2.0, 3.0]])
107
+ snapshot = from_anndata(
108
+ adata, obs=["group"], genes=["feature_a"], obsm_keys=[("embedding", 0)]
109
+ ).reset_index()
110
+ projected = gs.Chart(snapshot).mark_point().encode(
111
+ x="embedding-0:Q", y="feature_a:Q", color="group:N"
112
+ )
113
+ projected.to_dict()
114
+ ```
115
+
116
+ `from_anndata` reads selected `X` genes, `obs` fields, and zero-based `obsm`
117
+ components into a pandas snapshot. It does not select `.raw` or a layer.
118
+ Resolve the intended source before calling it; no analysis is performed.
119
+ Expected: two points with `embedding-0` on x, `feature_a` on y, colored by group.
120
+
121
+ Continue with [encodings](encodings.md) or [quickstart](quickstart.md).