genome-spy-python 0.1.0__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.github/workflows/ci.yml +29 -0
- genome_spy_python-0.3.0/CHANGELOG.md +64 -0
- genome_spy_python-0.3.0/CONTRIBUTING.md +201 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/PKG-INFO +8 -2
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/README.md +6 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/THIRD_PARTY_NOTICES.md +5 -6
- genome_spy_python-0.3.0/docs/_static/gallery/p53_sequence_comparison.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/datasets.md +5 -5
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/brush_linked_genome_tracks.py +11 -5
- genome_spy_python-0.3.0/docs/examples/p53_sequence_comparison.md +41 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/p53_sequence_comparison.py +107 -52
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +5 -1
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/notebooks.md +8 -0
- genome_spy_python-0.3.0/notebooks/brush_linked_genome_tracks.ipynb +421 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/pyproject.toml +2 -2
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/__init__.py +1 -1
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/__init__.py +2 -2
- genome_spy_python-0.3.0/src/genome_spy/datasets/data/p53_sequence_comparison_aligned.fasta.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/expressions.py +18 -6
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_chart.py +1 -1
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_combined_gallery_data.py +21 -26
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_docs_gallery.py +75 -17
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_expressions.py +34 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_generated_schema_package.py +29 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_schema_codegen.py +2 -0
- genome_spy_python-0.3.0/tools/check_notebook_rendering.py +150 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/prepare_combined_gallery_data.py +3 -61
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/schemapi/codegen.py +13 -7
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/uv.lock +2 -2
- genome_spy_python-0.1.0/CHANGELOG.md +0 -30
- genome_spy_python-0.1.0/CONTRIBUTING.md +0 -218
- genome_spy_python-0.1.0/docs/_static/gallery/p53_sequence_comparison.png +0 -0
- genome_spy_python-0.1.0/docs/examples/p53_sequence_comparison.md +0 -29
- genome_spy_python-0.1.0/src/genome_spy/datasets/data/p53_sequence_comparison.json.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.gitattributes +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.github/workflows/docs.yml +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.github/workflows/release.yml +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.gitignore +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.pre-commit-config.yaml +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/.python-version +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/AGENTS.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/CLAUDE.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/LICENSE +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/LICENSES/GALLERY-DATA-MIT.txt +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_ext/genomespy_gallery.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/README.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/external-links.js +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/airway_ma_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/airway_volcano_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/ascat_fitting.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/clinvar_variants.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/copy_number.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/cytobands.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/genome_tracks.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/link_mark.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/manhattan_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/needle_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/oncoprint.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/point_mark.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/rainfall_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/ranged_rule.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/rect_heatmap.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/sashimi_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/sequence_logo.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/six_frame_translation.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/upset_mutations.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/vertical_concat.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/gallery/volcano_plot.png +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/genomespy.css +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_static/snaketie.svg +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_templates/autosummary/class.rst +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/_templates/components/view-this-page.html +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/about.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/api.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/conf.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_ma_plot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_ma_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_volcano_plot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/airway_volcano_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_copy_number.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_copy_number.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_fitting.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ascat_fitting.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/bam_read_alignments.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/bam_read_alignments.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/bigbed_ccre_track.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/clinvar_variants.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/clinvar_variants.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/combined_laml_oncoplot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/combined_laml_oncoplot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/composing_genome_browser.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/composing_genome_browser.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/copy_number.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/cytobands.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/cytobands.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/dynseq_bqtl.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/dynseq_bqtl.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/genome_tracks.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/gff3_gene_annotations.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/gff3_gene_annotations.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/hcc1954_sv_cnv.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/indexed_fasta_sequence.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/link_mark.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/luad_oncoprint.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/luad_oncoprint.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/manhattan_plot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/manhattan_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/multiple_sequence_alignment.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/multiple_sequence_alignment.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/needle_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/oncoprint.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/oncoprint.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/point_mark.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/rainfall_plot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/rainfall_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/ranged_rule.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/rect_heatmap.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/refseq_scored_genes.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/refseq_scored_genes.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/sashimi_plot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/sashimi_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/scrollable_viewport.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/sequence_logo.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/six_frame_translation.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/six_frame_translation.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/stacked_genome_browser.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/tcga_ov_gistic.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/tcga_ov_gistic.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/upset_mutations.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/upset_mutations.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/vertical_concat.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/volcano_plot.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/volcano_plot.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/getting-started.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/index.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/annotations.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/charts_and_marks.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/composition.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/configuration.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/data_inputs.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/display_controls.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/encoding_channels.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/genome_browser_layouts.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/genomic_coordinates.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/genomic_data.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/getting_started.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/importing_specifications.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/interaction.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/notebooks.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/scales_and_guides.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/serialization.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/tutorials/transforms.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/annotations.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/charts.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/composition.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/configuration.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/data.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/display-controls.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/encodings.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/genome-browser-layouts.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/genomic-axes.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/genomic-data.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/importing-specifications.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/index.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/interaction.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/scales-axes-legends.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/serialization.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/user-guide/transforms.md +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_chart_authoring.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_conditions.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_embed.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_expressions.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_parameters.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_render.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_utils.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/_widget.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/api.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/arrow.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/channels.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/chart.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/data.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/data_transformers.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_airway.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_annotations.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_gistic.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_grammar.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_hapmap.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_mutation.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_laml_combined_oncoplot.json.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_ov_gistic_lesions.tsv.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/datasets/data/tcga_ov_gistic_scores.tsv.gz +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/helpers.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/jupyter.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/py.typed +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/__init__.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/_kwds.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/_typing.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/capabilities.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/channels.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/composition.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/core.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/ergonomics.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/genome-spy-schema.json +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/lazy.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schema/mixins.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/schemapi.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/src/genome_spy/static/widget.js +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/__init__.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_arrow.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_data_transformers.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_datasets.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_docs_api_reference.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_docs_tutorial.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_generated_transform_methods.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_render_thumbnails.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/test_widget.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tests/widget.test.mjs +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/docs_gallery.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/generate_api_docs.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/generate_schema_wrapper.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/prepare_refseq_gene_annotations.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/render_thumbnails.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/schemapi/__init__.py +0 -0
- {genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/tools/schemapi/expression_codegen.py +0 -0
|
@@ -68,3 +68,32 @@ jobs:
|
|
|
68
68
|
- run: uv run python tools/generate_schema_wrapper.py
|
|
69
69
|
- run: uv run ruff format src/genome_spy/schema src/genome_spy/helpers.py src/genome_spy/api.py src/genome_spy/__init__.py
|
|
70
70
|
- run: git diff --exit-code src/genome_spy/schema src/genome_spy/helpers.py src/genome_spy/api.py src/genome_spy/__init__.py tools
|
|
71
|
+
|
|
72
|
+
notebook-rendering:
|
|
73
|
+
runs-on: ubuntu-latest
|
|
74
|
+
timeout-minutes: 10
|
|
75
|
+
steps:
|
|
76
|
+
- uses: actions/checkout@v7
|
|
77
|
+
- uses: astral-sh/setup-uv@v9.0.0
|
|
78
|
+
with:
|
|
79
|
+
python-version: "3.11"
|
|
80
|
+
- run: uv build --wheel
|
|
81
|
+
- name: Install the wheel with the minimum supported AnyWidget
|
|
82
|
+
run: |
|
|
83
|
+
uv venv --seed --python 3.11 "$RUNNER_TEMP/notebook-env"
|
|
84
|
+
for wheel in "$GITHUB_WORKSPACE"/dist/*.whl; do
|
|
85
|
+
uv pip install --python "$RUNNER_TEMP/notebook-env/bin/python" \
|
|
86
|
+
"$wheel[arrow]" "anywidget==0.11.0" jupyterlab pandas numpy playwright pillow
|
|
87
|
+
done
|
|
88
|
+
"$RUNNER_TEMP/notebook-env/bin/python" -m playwright install --with-deps chromium
|
|
89
|
+
- name: Render the brush notebook in JupyterLab
|
|
90
|
+
run: |
|
|
91
|
+
"$RUNNER_TEMP/notebook-env/bin/python" tools/check_notebook_rendering.py \
|
|
92
|
+
notebooks/brush_linked_genome_tracks.ipynb \
|
|
93
|
+
--screenshot "$RUNNER_TEMP/notebook-rendering.png"
|
|
94
|
+
- uses: actions/upload-artifact@v7
|
|
95
|
+
if: always()
|
|
96
|
+
with:
|
|
97
|
+
name: notebook-rendering
|
|
98
|
+
path: ${{ runner.temp }}/notebook-rendering.png
|
|
99
|
+
if-no-files-found: ignore
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.3.0] - 2026-09-09
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **Dataset format change:** `p53_sequence_comparison` now contains 34 protein
|
|
13
|
+
sequences aligned with MAFFT L-INS-i, replacing the unaligned JSON tables.
|
|
14
|
+
Load the aligned FASTA with
|
|
15
|
+
`load_dataset("p53_sequence_comparison", as_format="text")`; code expecting
|
|
16
|
+
the previous mapping of prepared tables must be updated.
|
|
17
|
+
- Updated the P53 gallery example to show the aligned sequences and calculate
|
|
18
|
+
conservation, gap-free fractions, and sequence logos in GenomeSpy.
|
|
19
|
+
- Made the brush notebook build progressively from a simple p-value chart to
|
|
20
|
+
linked tracks, and added an effect-size zero baseline in the notebook and gallery.
|
|
21
|
+
|
|
22
|
+
## [0.2.0] - 2026-09-09
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Python lists and tuples in `gs.expr()` for array expressions containing
|
|
27
|
+
values, parameters, and calculations.
|
|
28
|
+
- A brush-linked notebook example with an Open in Colab link in the README.
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- Require AnyWidget 0.11.0 or newer to match the widget lifecycle API used for rendering.
|
|
33
|
+
- Simplified the contributing guide and added brief notebook troubleshooting advice.
|
|
34
|
+
|
|
35
|
+
### Fixed
|
|
36
|
+
|
|
37
|
+
- PIK3CA lollipop connectors now reach the protein track.
|
|
38
|
+
- Packaged datasets can be imported on Python 3.14.
|
|
39
|
+
|
|
40
|
+
## [0.1.0] - 2026-09-09
|
|
41
|
+
|
|
42
|
+
First public alpha release, targeting GenomeSpy Core 0.87.0.
|
|
43
|
+
|
|
44
|
+
### Added
|
|
45
|
+
|
|
46
|
+
- Declarative, schema-backed Python API for authoring GenomeSpy specifications.
|
|
47
|
+
- Altair-style marks, encodings, transforms, parameters, conditions, and chart
|
|
48
|
+
composition.
|
|
49
|
+
- Genomics-native locus channels, genome assemblies, genomic data sources, and
|
|
50
|
+
coordinated multi-view interactions.
|
|
51
|
+
- Specification validation and serialization to dictionaries, JSON, and
|
|
52
|
+
standalone HTML.
|
|
53
|
+
- Interactive notebook rendering in Jupyter, VS Code, and Marimo through
|
|
54
|
+
`anywidget`.
|
|
55
|
+
- Arrow transport and live named-dataset updates for pandas, Polars, and
|
|
56
|
+
PyArrow tables.
|
|
57
|
+
- Per-render GenomeSpy controls and embed options, including image export and
|
|
58
|
+
full-window display controls.
|
|
59
|
+
- Packaged example datasets, documentation, tutorials, and an interactive
|
|
60
|
+
visualization gallery.
|
|
61
|
+
|
|
62
|
+
[0.3.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.2.0...v0.3.0
|
|
63
|
+
[0.2.0]: https://github.com/genome-spy/genome-spy-python/compare/v0.1.0...v0.2.0
|
|
64
|
+
[0.1.0]: https://github.com/genome-spy/genome-spy-python/releases/tag/v0.1.0
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
# Contributing to genome-spy-python
|
|
2
|
+
|
|
3
|
+
Bug reports, documentation, examples, tests, and code contributions are welcome.
|
|
4
|
+
|
|
5
|
+
## How to contribute
|
|
6
|
+
|
|
7
|
+
Open an issue before starting a large change. Small fixes can go straight to a
|
|
8
|
+
pull request.
|
|
9
|
+
|
|
10
|
+
Explain what your pull request changes and why. Keep unrelated changes separate,
|
|
11
|
+
and update tests and docs when behavior or the public API changes.
|
|
12
|
+
|
|
13
|
+
## Development setup
|
|
14
|
+
|
|
15
|
+
Use Python 3.11 or newer and [`uv`](https://docs.astral.sh/uv/). Install the
|
|
16
|
+
development and docs dependencies from the repository root:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
uv sync --group dev --group docs
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Main directories:
|
|
23
|
+
|
|
24
|
+
- `src/genome_spy/` — library code
|
|
25
|
+
- `tests/` — tests
|
|
26
|
+
- `docs/examples/` — gallery examples
|
|
27
|
+
- `tools/` — code and documentation generators
|
|
28
|
+
|
|
29
|
+
Install pre-commit hooks to check changes before committing:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
uv run pre-commit install
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Coding practices
|
|
36
|
+
|
|
37
|
+
### Python and typing
|
|
38
|
+
|
|
39
|
+
Use type hints such as `list[T]`, `dict[K, V]`, and `X | Y` for public APIs.
|
|
40
|
+
Add Google-style docstrings covering purpose, arguments, results, exceptions,
|
|
41
|
+
and an example. Keep file, network, and notebook code separate from core logic.
|
|
42
|
+
|
|
43
|
+
Keep changes small. Prefer generating APIs from the GenomeSpy schema over
|
|
44
|
+
adding handwritten alternatives.
|
|
45
|
+
|
|
46
|
+
### Formatting and linting
|
|
47
|
+
|
|
48
|
+
Format and lint with [Ruff](https://docs.astral.sh/ruff/):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
uv run ruff format .
|
|
52
|
+
uv run ruff check .
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Check types after changing library code:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
uv run mypy src/
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Testing
|
|
62
|
+
|
|
63
|
+
Add a focused test for each behavior change. Run the Python tests with:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
uv run pytest tests/ -x
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Run the widget's JavaScript tests with:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
node --test tests/widget.test.mjs
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Run the checks relevant to your changes before submitting a pull request.
|
|
76
|
+
CI also checks generated code, docs, and the installed package.
|
|
77
|
+
|
|
78
|
+
### Performance
|
|
79
|
+
|
|
80
|
+
Avoid unnecessary data copies and large chart specifications. Measure performance
|
|
81
|
+
before adding complexity to make code faster.
|
|
82
|
+
|
|
83
|
+
## Generated schema and expression APIs
|
|
84
|
+
|
|
85
|
+
Do not edit generated files in `src/genome_spy/schema/` by hand. The generator
|
|
86
|
+
uses the GenomeSpy version in `pyproject.toml`, its schema, and the matching
|
|
87
|
+
GenomeSpy and Vega expression documentation.
|
|
88
|
+
|
|
89
|
+
Regenerate after changing that version or the generator:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
uv run python tools/generate_schema_wrapper.py
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
This requires `npm` and internet access. Use `--package-dir` for a local package,
|
|
96
|
+
or both `--genome-spy-expression-docs` and `--vega-expression-docs` for local
|
|
97
|
+
expression docs.
|
|
98
|
+
|
|
99
|
+
Then check the results:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
uv run pytest tests/test_schema_codegen.py -x
|
|
103
|
+
uv run ruff format src/genome_spy/schema src/genome_spy/helpers.py src/genome_spy/api.py src/genome_spy/__init__.py
|
|
104
|
+
git diff --check
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Review and commit the generated files alongside your changes. CI checks that
|
|
108
|
+
regenerating them produces no differences.
|
|
109
|
+
|
|
110
|
+
New transforms should be generated from the schema. Add overrides in
|
|
111
|
+
`tools/generate_schema_wrapper.py` only for Python conventions the schema
|
|
112
|
+
cannot describe.
|
|
113
|
+
|
|
114
|
+
## Documentation
|
|
115
|
+
|
|
116
|
+
### API reference
|
|
117
|
+
|
|
118
|
+
After changing the public API, regenerate `docs/api.md` from `genome_spy.__all__`:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
uv run python tools/generate_api_docs.py
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Sphinx creates the individual pages in `docs/generated/`; do not commit them.
|
|
125
|
+
|
|
126
|
+
### Build and preview
|
|
127
|
+
|
|
128
|
+
Build the docs and check for warnings:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
uv run sphinx-build -b html -W --keep-going docs docs/_build/html
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Rerun the same command to rebuild changed pages and examples. Keep `docs/_build/`
|
|
135
|
+
and avoid `-E` and `-a` for faster builds. Changes to shared code, data, build
|
|
136
|
+
tools, or the lockfile regenerate all examples.
|
|
137
|
+
|
|
138
|
+
To force example regeneration, delete the gallery cache (normally
|
|
139
|
+
`docs/_build/html/.doctrees/genomespy-gallery`). Changes to remote data or files
|
|
140
|
+
outside the tracked dependencies are not detected automatically.
|
|
141
|
+
|
|
142
|
+
Preview locally:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
cd docs/_build/html
|
|
146
|
+
python3 -m http.server
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Open <http://localhost:8000>. Interactive examples need internet access to load
|
|
150
|
+
GenomeSpy.
|
|
151
|
+
|
|
152
|
+
### Gallery examples
|
|
153
|
+
|
|
154
|
+
Write examples in `docs/examples/`. Put explanations, data sources, any
|
|
155
|
+
necessary disclaimers, and upstream links in an optional Markdown file with
|
|
156
|
+
the same name.
|
|
157
|
+
|
|
158
|
+
Focus on plotting, not data preparation: load prepared packaged datasets and
|
|
159
|
+
prefer Python expressions such as `gs.datum.score > 0`. Remember that
|
|
160
|
+
`.transform_*()` defines work that GenomeSpy runs in the browser, not Python.
|
|
161
|
+
|
|
162
|
+
After editing an example, run:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
uv run pytest tests/test_docs_gallery.py -q
|
|
166
|
+
uv run sphinx-build -b html -W --keep-going docs docs/_build/html
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Check the chart visually before updating its committed thumbnail.
|
|
170
|
+
|
|
171
|
+
### Notebook rendering
|
|
172
|
+
|
|
173
|
+
CI checks that the brush notebook renders in a fresh environment. Follow
|
|
174
|
+
[the workflow](.github/workflows/ci.yml) for setup, then run with that
|
|
175
|
+
environment's Python:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
python -m playwright install chromium
|
|
179
|
+
python tools/check_notebook_rendering.py notebooks/brush_linked_genome_tracks.ipynb --screenshot /tmp/notebook-rendering.png
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## Commit guidelines
|
|
183
|
+
|
|
184
|
+
Keep each commit focused on one change. Use
|
|
185
|
+
[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/):
|
|
186
|
+
|
|
187
|
+
```text
|
|
188
|
+
feat(expressions): generate runtime helpers
|
|
189
|
+
fix(widget): preserve zoom during data updates
|
|
190
|
+
docs(gallery): add a sequence example
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Do not rewrite shared history unless reviewers ask you to.
|
|
194
|
+
|
|
195
|
+
## Community and communication
|
|
196
|
+
|
|
197
|
+
Report wrapper bugs and request features in the
|
|
198
|
+
[Python package issue tracker](https://github.com/genome-spy/genome-spy-python/issues).
|
|
199
|
+
For GenomeSpy's grammar or renderer, use the upstream
|
|
200
|
+
[discussions](https://github.com/genome-spy/genome-spy/discussions) or
|
|
201
|
+
[issues](https://github.com/genome-spy/genome-spy/issues).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: genome-spy-python
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: genome-spy-python is a declarative genomics visualization library for Python, built on top of the genome-spy JSON specification.
|
|
5
5
|
Project-URL: Homepage, https://github.com/genome-spy/genome-spy-python
|
|
6
6
|
Project-URL: Documentation, https://genomespy.app/genome-spy-python/
|
|
@@ -23,7 +23,7 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
23
23
|
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
24
24
|
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
25
25
|
Requires-Python: >=3.11
|
|
26
|
-
Requires-Dist: anywidget>=0.
|
|
26
|
+
Requires-Dist: anywidget>=0.11.0
|
|
27
27
|
Requires-Dist: jsonschema>=4.26.0
|
|
28
28
|
Requires-Dist: traitlets>=5.14.3
|
|
29
29
|
Provides-Extra: arrow
|
|
@@ -36,6 +36,12 @@ Description-Content-Type: text/markdown
|
|
|
36
36
|
|
|
37
37
|
<h1 align="center">genome-spy-python</h1>
|
|
38
38
|
|
|
39
|
+
<p align="center">
|
|
40
|
+
<a href="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml"><img src="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
|
|
41
|
+
<a href="https://pypi.org/project/genome-spy-python/"><img src="https://img.shields.io/pypi/v/genome-spy-python" alt="PyPI version"></a>
|
|
42
|
+
<a href="https://colab.research.google.com/github/genome-spy/genome-spy-python/blob/main/notebooks/brush_linked_genome_tracks.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open brush example in Colab"></a>
|
|
43
|
+
</p>
|
|
44
|
+
|
|
39
45
|
`genome-spy-python` is a Python interface for
|
|
40
46
|
<a href="https://genomespy.app/" target="_blank" rel="noopener noreferrer">GenomeSpy</a>,
|
|
41
47
|
a grammar for interactive and scalable genomic visualization. It lets Python
|
|
@@ -4,6 +4,12 @@
|
|
|
4
4
|
|
|
5
5
|
<h1 align="center">genome-spy-python</h1>
|
|
6
6
|
|
|
7
|
+
<p align="center">
|
|
8
|
+
<a href="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml"><img src="https://github.com/genome-spy/genome-spy-python/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI status"></a>
|
|
9
|
+
<a href="https://pypi.org/project/genome-spy-python/"><img src="https://img.shields.io/pypi/v/genome-spy-python" alt="PyPI version"></a>
|
|
10
|
+
<a href="https://colab.research.google.com/github/genome-spy/genome-spy-python/blob/main/notebooks/brush_linked_genome_tracks.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open brush example in Colab"></a>
|
|
11
|
+
</p>
|
|
12
|
+
|
|
7
13
|
`genome-spy-python` is a Python interface for
|
|
8
14
|
<a href="https://genomespy.app/" target="_blank" rel="noopener noreferrer">GenomeSpy</a>,
|
|
9
15
|
a grammar for interactive and scalable genomic visualization. It lets Python
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
`tcga_laml_combined_oncoplot.json.gz` contains prepared TCGA LAML tables from
|
|
6
6
|
maftools revision `015a4cf8c69ba89a55a3fdcea911421509e9a198` (Anand Mayakonda,
|
|
7
|
-
MIT). `
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
`LICENSES/GALLERY-DATA-MIT.txt`.
|
|
7
|
+
MIT). `p53_sequence_comparison_aligned.fasta.gz` contains p53 sequences from
|
|
8
|
+
Plotly's datasets revision `0c447c47b757ad74edecab31f0d72f849d2e67c2`
|
|
9
|
+
(Plotly Technologies Inc., MIT), aligned with MAFFT v7.526 using L-INS-i. The
|
|
10
|
+
corresponding gallery pages describe processing. Copyright notices and terms
|
|
11
|
+
are included in `LICENSES/GALLERY-DATA-MIT.txt`.
|
|
13
12
|
|
|
14
13
|
## Code adapted from Vega-Altair
|
|
15
14
|
|
|
Binary file
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Example datasets
|
|
2
2
|
|
|
3
3
|
The combined LAML oncoplot uses `load_dataset("tcga_laml_combined_oncoplot")`;
|
|
4
|
-
the p53 sequence comparison
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
the p53 sequence comparison loads aligned FASTA text with
|
|
5
|
+
`load_dataset("p53_sequence_comparison", as_format="text")`. Their
|
|
6
|
+
MIT-licensed sources and processing are described in the
|
|
7
|
+
[combined oncoplot](gallery/combined_laml_oncoplot.md) and
|
|
8
8
|
[p53 comparison](gallery/p53_sequence_comparison.md) gallery pages.
|
|
9
9
|
|
|
10
10
|
The package ships the tables that the [gallery](gallery/index.md) examples use,
|
|
@@ -30,7 +30,7 @@ for JSON files. Pass `as_format="text"` to get the raw file contents instead.
|
|
|
30
30
|
| `tcga_laml_maf` | Somatic mutation calls for TCGA acute myeloid leukemia |
|
|
31
31
|
| `tcga_laml_annotations` | Clinical annotations for those leukemia samples |
|
|
32
32
|
| `tcga_laml_combined_oncoplot` | Prepared mutation, copy-number, clinical, pathway, VAF, and MutSig tables |
|
|
33
|
-
| `p53_sequence_comparison` | 34
|
|
33
|
+
| `p53_sequence_comparison` | 34 p53 protein sequences aligned with MAFFT L-INS-i, compressed FASTA |
|
|
34
34
|
| `pyoncoprint_tcga` | Alteration matrix for TCGA lung adenocarcinoma samples |
|
|
35
35
|
| `tcga_ov_gistic_scores` | GISTIC2 copy-number scores for TCGA ovarian tumors |
|
|
36
36
|
| `tcga_ov_gistic_lesions` | GISTIC2 peak regions for the same cohort |
|
{genome_spy_python-0.1.0 → genome_spy_python-0.3.0}/docs/examples/brush_linked_genome_tracks.py
RENAMED
|
@@ -86,7 +86,7 @@ association_track = (
|
|
|
86
86
|
)
|
|
87
87
|
|
|
88
88
|
# Show effect sizes for the same range.
|
|
89
|
-
|
|
89
|
+
effect_points = (
|
|
90
90
|
gs.Chart()
|
|
91
91
|
.mark_point(filled=True, size=24, opacity=0.78, color="#f58518")
|
|
92
92
|
.encode(
|
|
@@ -96,10 +96,16 @@ effect_track = (
|
|
|
96
96
|
y=gs.Y("EFFECTSIZE:Q").scale(domain=[-3, 3]).title("Effect size"),
|
|
97
97
|
tooltip=["SNP:N", "GENE:N", "EFFECTSIZE:Q"],
|
|
98
98
|
)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# Put a zero line behind the points to separate positive and negative effects.
|
|
102
|
+
effect_baseline = (
|
|
103
|
+
gs.Chart([{"EFFECTSIZE": 0}])
|
|
104
|
+
.mark_rule(color="#888888", size=1, tooltip=None)
|
|
105
|
+
.encode(y=gs.Y("EFFECTSIZE:Q").scale(domain=[-3, 3]).title("Effect size"))
|
|
106
|
+
)
|
|
107
|
+
effect_track = (effect_baseline + effect_points).properties(
|
|
108
|
+
name="effect-size", height=95
|
|
103
109
|
)
|
|
104
110
|
|
|
105
111
|
# Add Z-scores as the third view of the selected range.
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
## What to notice
|
|
2
|
+
|
|
3
|
+
Drag the overview at the bottom to choose the positions shown above. The
|
|
4
|
+
summary tracks, sequence logo, and residue matrix stay aligned as the view
|
|
5
|
+
moves. Move the pointer across the detail tracks to follow one position with
|
|
6
|
+
the vertical ruler. Hover a tile for its accession and position. Zoom in to
|
|
7
|
+
read letters.
|
|
8
|
+
|
|
9
|
+
**Conservation** shows the fraction of non-gap sequences that share the most
|
|
10
|
+
common amino acid at each alignment column. **Gap-free** shows
|
|
11
|
+
the fraction of sequences containing a residue there. Keeping the two measures
|
|
12
|
+
separate makes it clear whether a low score reflects disagreement or missing
|
|
13
|
+
aligned residues. The sequence logo shows the full non-gap residue mixture,
|
|
14
|
+
with larger letters for larger shares. The x-axis reports one-based alignment
|
|
15
|
+
columns, not residue numbers in any individual protein.
|
|
16
|
+
|
|
17
|
+
This adapts [Dash Bio AlignmentChart](https://dash.plotly.com/dash-bio/alignmentchart)
|
|
18
|
+
with GenomeSpy rectangles, text, bars, a sequence logo, and a shared brush.
|
|
19
|
+
|
|
20
|
+
:::{admonition} Data use and provenance
|
|
21
|
+
:class: note
|
|
22
|
+
|
|
23
|
+
The 34 UniProt-labelled p53 protein sequences come from the
|
|
24
|
+
[Plotly FASTA](https://github.com/plotly/datasets/blob/0c447c47b757ad74edecab31f0d72f849d2e67c2/Dash_Bio/Genetic/alignment_viewer_p53.fasta)
|
|
25
|
+
in Plotly's MIT-licensed datasets repository. They were aligned with MAFFT
|
|
26
|
+
v7.526 using the L-INS-i strategy:
|
|
27
|
+
`mafft-linsi p53.unaligned.fasta > p53.aligned.fasta`. The resulting alignment
|
|
28
|
+
is packaged as `p53_sequence_comparison_aligned.fasta.gz`.
|
|
29
|
+
:::
|
|
30
|
+
|
|
31
|
+
## Python and GenomeSpy processing
|
|
32
|
+
|
|
33
|
+
Python reads the packaged compressed FASTA, splits its 34 records, preserves
|
|
34
|
+
the UniProt identifiers and headers, and verifies that every aligned sequence
|
|
35
|
+
has the same length. GenomeSpy then flattens each sequence into residues in the
|
|
36
|
+
browser and declaratively calculates gap-free fractions, non-gap conservation,
|
|
37
|
+
and logo stacks. The Python API authors and serializes
|
|
38
|
+
those transforms; GenomeSpy executes them while rendering and interacting with
|
|
39
|
+
the visualization. For comparison, the
|
|
40
|
+
[multiple sequence alignment example](multiple_sequence_alignment.md) sends
|
|
41
|
+
FASTA directly to GenomeSpy and parses it in the browser-side dataflow.
|