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.
- genome_spy_python-0.7.0/.agents/skills/commit/SKILL.md +48 -0
- genome_spy_python-0.7.0/.agents/skills/proper-code-review/SKILL.md +73 -0
- genome_spy_python-0.7.0/AGENTS.md +65 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/CHANGELOG.md +31 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/CONTRIBUTING.md +20 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/PKG-INFO +18 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/README.md +15 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/THIRD_PARTY_NOTICES.md +13 -0
- genome_spy_python-0.7.0/docs/_ext/genomespy_agents.py +36 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_ext/genomespy_gallery.py +9 -0
- genome_spy_python-0.7.0/docs/_static/gallery/clustered_heatmap.png +0 -0
- genome_spy_python-0.7.0/docs/_static/gallery/pbmc_cell_heatmap.png +0 -0
- genome_spy_python-0.7.0/docs/_static/gallery/pbmc_expression_tracks.png +0 -0
- genome_spy_python-0.7.0/docs/_static/gallery/pbmc_marker_matrix.png +0 -0
- genome_spy_python-0.7.0/docs/_static/gallery/pbmc_umap.png +0 -0
- genome_spy_python-0.7.0/docs/_static/gallery/pbmc_umap_genes.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/genomespy.css +12 -0
- genome_spy_python-0.7.0/docs/agents/data.md +121 -0
- genome_spy_python-0.7.0/docs/agents/encodings.md +144 -0
- genome_spy_python-0.7.0/docs/agents/manifest.json +92 -0
- genome_spy_python-0.7.0/docs/agents/quickstart.md +81 -0
- genome_spy_python-0.7.0/docs/agents/rendering.md +64 -0
- genome_spy_python-0.7.0/docs/agents/scales-axes-legends.md +100 -0
- genome_spy_python-0.7.0/docs/agents/skill-distribution.md +62 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/api.md +35 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/conf.py +3 -1
- genome_spy_python-0.7.0/docs/contributing/standards.md +75 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/datasets.md +9 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_fitting.py +40 -33
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_alignments.py +5 -4
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_pileup.py +3 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bigbed_ccre_track.py +3 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/clinvar_variants.py +3 -2
- genome_spy_python-0.7.0/docs/examples/clustered_heatmap.md +47 -0
- genome_spy_python-0.7.0/docs/examples/clustered_heatmap.py +394 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/combined_laml_oncoplot.py +1 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/composing_genome_browser.py +3 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_adaptive_bqtl.py +22 -16
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_bqtl.py +22 -16
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/hcc1954_sv_cnv.py +4 -3
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/independent_scales.md +14 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/indexed_fasta_sequence.py +3 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/luad_oncoprint.py +12 -10
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/multiple_sequence_alignment.py +2 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/oncoprint.py +14 -12
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/p53_sequence_comparison.py +1 -1
- genome_spy_python-0.7.0/docs/examples/pbmc_cell_heatmap.md +24 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_cell_heatmap.py +103 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_expression_tracks.md +18 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_expression_tracks.py +124 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_marker_matrix.md +24 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_marker_matrix.py +160 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_umap.md +15 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_umap.py +58 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_umap_genes.md +18 -0
- genome_spy_python-0.7.0/docs/examples/pbmc_umap_genes.py +96 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pik3ca_tcga_brca_lollipop.py +1 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_interaction_matrix.md +4 -4
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_interaction_matrix.py +28 -18
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_squid.py +18 -12
- genome_spy_python-0.7.0/docs/examples/point_mark.md +14 -0
- genome_spy_python-0.7.0/docs/examples/rect_heatmap.md +15 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rnf7_direct_rna.py +1 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/six_frame_translation.py +5 -4
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/upset_mutations.md +4 -3
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/upset_mutations.py +29 -39
- genome_spy_python-0.7.0/docs/examples/vertical_concat.md +14 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/index.md +3 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/composition.py +34 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/encoding_channels.py +9 -0
- genome_spy_python-0.7.0/docs/tutorials/expressions.py +34 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/interaction.py +10 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/composition.md +39 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/data.md +54 -5
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/encodings.md +23 -2
- genome_spy_python-0.7.0/docs/user-guide/expressions.md +90 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/index.md +2 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/interaction.md +21 -9
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/transforms.md +6 -41
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/pyproject.toml +14 -2
- genome_spy_python-0.7.0/skills/create-genomespy-visualization/SKILL.md +91 -0
- genome_spy_python-0.7.0/skills/create-genomespy-visualization/agents/openai.yaml +4 -0
- genome_spy_python-0.7.0/skills/create-genomespy-visualization/references/grouped-charts.md +102 -0
- genome_spy_python-0.7.0/skills/create-genomespy-visualization/references/table-chart.md +157 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/__init__.py +102 -57
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_chart_authoring.py +6 -1
- genome_spy_python-0.7.0/src/genome_spy/_skill_install.py +158 -0
- genome_spy_python-0.7.0/src/genome_spy/anndata.py +159 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/api.py +71 -27
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/arrow.py +7 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/channels.py +5 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/chart.py +66 -6
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/__init__.py +1 -0
- genome_spy_python-0.7.0/src/genome_spy/datasets/_pbmc.py +87 -0
- genome_spy_python-0.7.0/src/genome_spy/datasets/data/pbmc_markers.json.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/__init__.py +31 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/_kwds.py +72 -45
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/_typing.py +3 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/capabilities.json +25 -2
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/channels.py +1115 -282
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/composition.py +464 -21
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/core.py +35222 -24526
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/ergonomics.py +105 -48
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/expressions.py +7 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/genome-spy-schema.json +13754 -5658
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/lazy.py +3 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schema/mixins.py +2500 -780
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/schemapi.py +1 -5
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/controls.js +1 -1
- genome_spy_python-0.7.0/src/genome_spy/static/genome-spy.js +1131 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/inspector.js +4 -4
- genome_spy_python-0.7.0/tests/browser/test_core_upgrade.py +80 -0
- genome_spy_python-0.7.0/tests/browser/test_docs_theme.py +68 -0
- genome_spy_python-0.7.0/tests/fixtures/upstream_examples/README.md +15 -0
- genome_spy_python-0.7.0/tests/fixtures/upstream_examples/bpreveal-pisa-matrix.json +445 -0
- genome_spy_python-0.7.0/tests/fixtures/upstream_examples/clustered-heatmap.json +594 -0
- genome_spy_python-0.7.0/tests/fixtures/upstream_examples/upsetr-mutations.json +403 -0
- genome_spy_python-0.7.0/tests/test_agent_docs.py +262 -0
- genome_spy_python-0.7.0/tests/test_anndata.py +287 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_arrow.py +4 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_chart.py +1 -1
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_datasets.py +1 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_docs_api_reference.py +8 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_docs_gallery.py +46 -22
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_docs_tutorial.py +2 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_generated_schema_package.py +46 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_licensing.py +1 -0
- genome_spy_python-0.7.0/tests/test_new_compositions.py +159 -0
- genome_spy_python-0.7.0/tests/test_pbmc_gallery.py +354 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_pisa_gallery.py +6 -4
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_schema_codegen.py +48 -4
- genome_spy_python-0.7.0/tests/test_skill_install.py +130 -0
- genome_spy_python-0.7.0/tests/test_upstream_surround_gallery.py +161 -0
- genome_spy_python-0.7.0/tools/agent_docs.py +239 -0
- genome_spy_python-0.7.0/tools/agent_markdown.py +277 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/docs_gallery.py +8 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/generate_api_docs.py +12 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/generate_schema_wrapper.py +24 -4
- genome_spy_python-0.7.0/tools/prepare_pbmc_gallery_data.py +244 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/schemapi/codegen.py +68 -59
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/uv.lock +703 -17
- genome_spy_python-0.6.0/.agents/skills/proper-code-review/SKILL.md +0 -165
- genome_spy_python-0.6.0/.claude/skills/commit/SKILL.md +0 -105
- genome_spy_python-0.6.0/AGENTS.md +0 -153
- genome_spy_python-0.6.0/src/genome_spy/static/genome-spy.js +0 -1005
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.agents/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.6.0/.agents → genome_spy_python-0.7.0/.claude}/skills/commit/SKILL.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/SKILL.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/correctness.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/design.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.claude/skills/proper-code-review/references/performance.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.gitattributes +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.github/workflows/ci.yml +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.github/workflows/docs.yml +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.github/workflows/release.yml +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.gitignore +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.pre-commit-config.yaml +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/.python-version +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/CLAUDE.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSE +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/ALTAIR-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/CC-BY-4.0.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/CC-BY-NC-SA-4.0.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/CC0-1.0.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/DATA-SOURCE-REPOSITORIES-MIT.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/GENOMESPY-MIT.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/LATO-OFL-1.1.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/VEGA-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/LICENSES/VEGA-LITE-BSD-3-Clause.txt +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/README.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/oncoprint_dataset3.json +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/external-links.js +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/airway_ma_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/airway_volcano_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ascat_copy_number.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ascat_fitting.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bam_read_alignments.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bam_read_pileup.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/bigbed_ccre_track.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/brush_linked_genome_tracks.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/clinvar_variants.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/combined_laml_oncoplot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/composing_genome_browser.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/copy_number.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/coverage_pileup.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/cytobands.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/diverging_bars.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/dynseq_adaptive_bqtl.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/dynseq_bqtl.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/genome_tracks.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/geometric_zoom.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/gff3_gene_annotations.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/hcc1954_sv_cnv.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/heatmap_with_text.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/independent_scales.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/indexed_fasta_sequence.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/layered_lollipop.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/link_mark.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/luad_oncoprint.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/manhattan_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/multiple_sequence_alignment.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/needle_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/oncoprint.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/p53_sequence_comparison.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/penguin_brush.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pik3ca_tcga_brca_lollipop.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pisa_interaction_matrix.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/pisa_squid.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/point_mark.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/point_styles.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rainfall_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/ranged_rule.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rect_heatmap.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/refseq_scored_genes.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/rnf7_direct_rna.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/sashimi_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/scrollable_viewport.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/sequence_logo.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/six_frame_translation.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/stacked_bar.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/stacked_genome_browser.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/tcga_ov_gistic.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/tsne.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/upset_mutations.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/vertical_concat.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/gallery/volcano_plot.png +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/readme-manhattan.webp +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/readme-sequence-logo.webp +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/showcase.js +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/snaketie.svg +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/workflows.css +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_static/workflows.js +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/autosummary/class.rst +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/autosummary/class_own_members.rst +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/base.html +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/_templates/components/view-this-page.html +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/about.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_ma_plot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_ma_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_volcano_plot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/airway_volcano_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_copy_number.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_copy_number.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ascat_fitting.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_alignments.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/bam_read_pileup.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/brush_linked_genome_tracks.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/brush_linked_genome_tracks.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/clinvar_variants.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/combined_laml_oncoplot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/composing_genome_browser.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/copy_number.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/coverage_pileup.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/coverage_pileup.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/cytobands.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/cytobands.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/diverging_bars.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/diverging_bars.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_adaptive_bqtl.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/dynseq_bqtl.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/genome_tracks.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/geometric_zoom.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/geometric_zoom.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/gff3_gene_annotations.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/gff3_gene_annotations.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/hcc1954_sv_cnv.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/heatmap_with_text.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/heatmap_with_text.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/independent_scales.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/layered_lollipop.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/layered_lollipop.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/link_mark.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/luad_oncoprint.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/manhattan_plot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/manhattan_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/multiple_sequence_alignment.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/needle_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/oncoprint.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/p53_sequence_comparison.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/penguin_brush.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/penguin_brush.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pik3ca_tcga_brca_lollipop.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/pisa_squid.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/point_mark.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/point_styles.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/point_styles.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rainfall_plot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rainfall_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/ranged_rule.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rect_heatmap.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/refseq_scored_genes.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/refseq_scored_genes.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/rnf7_direct_rna.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/sashimi_plot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/sashimi_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/scrollable_viewport.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/sequence_logo.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/six_frame_translation.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/stacked_bar.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/stacked_bar.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/stacked_genome_browser.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tcga_ov_gistic.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tcga_ov_gistic.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tsne.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/tsne.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/vertical_concat.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/volcano_plot.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/examples/volcano_plot.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/getting-started.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/component.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/index.html +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/notebook.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/integration/server.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/annotations.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/charts_and_marks.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/configuration.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/data_inputs.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/display_controls.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/genome_browser_layouts.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/genomic_coordinates.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/genomic_data.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/getting_started.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/importing_specifications.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/notebooks.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/scales_and_guides.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/serialization.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/tutorials/transforms.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/annotations.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/charts.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/configuration.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/connect-python.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/display-controls.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/embed-api.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/genome-browser-layouts.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/genomic-axes.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/genomic-data.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/importing-specifications.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/notebooks.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/scales-axes-legends.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/serialization.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/using-charts.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/annotate-intervals.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/edit-sequence.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/index.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/pick-genes.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/docs/user-guide/workflows/select-genes.md +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/annotate_genomic_intervals.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/brush_linked_genome_tracks.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/edit_sequence.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/embed_api.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/pick_genes.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/notebooks/select_genes.ipynb +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_conditions.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_embed.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_expressions.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_parameters.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_render.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_utils.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/_widget.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/data.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/data_transformers.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_airway.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_annotations.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_direct_rna.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_gistic.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_grammar.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_hapmap.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_mutation.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/_oncoprint.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_metadata.csv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_review.json.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/airway_scaledcounts.csv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/brca.maf.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/hapmap_gwas.csv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/mutation_impact_reference.json +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/oncoprint_dataset3.json +0 -0
- {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
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/pik3ca_mutations.json +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/pik3ca_tcga_brca_lollipop.json +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/refseq_gene_bodies.csv.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/rnf7_direct_rna.json.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tal1_alphagenome_reference.json.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga.tsv +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml.maf.gz +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/datasets/data/tcga_laml_annot.tsv +0 -0
- {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
- {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
- {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
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/embed.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/helpers.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/jupyter.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/py.typed +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/embed-bridge.js +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/src/genome_spy/static/widget.js +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/__init__.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_docs_workflows.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_embed_api.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_offline_rendering.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/browser/test_python_web_example.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/embed-bridge.test.mjs +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_combined_gallery_data.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_conditions.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_data_transformers.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_embed.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_embed_notebook.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_expressions.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_generated_transform_methods.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_javascript_assets.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_python_connection_example.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_render_thumbnails.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_rnf7_direct_rna_example.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_widget.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/test_workflow_notebooks.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tests/widget.test.mjs +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/check_notebook_rendering.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/docs_workflows.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/prepare_airway_review.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/prepare_combined_gallery_data.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/prepare_refseq_gene_annotations.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/render_thumbnails.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/schemapi/__init__.py +0 -0
- {genome_spy_python-0.6.0 → genome_spy_python-0.7.0}/tools/schemapi/expression_codegen.py +0 -0
- {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.
|
|
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": (
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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).
|