orfdata 0.32.0__tar.gz → 0.34.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.
- {orfdata-0.32.0/orfdata.egg-info → orfdata-0.34.0}/PKG-INFO +9 -4
- {orfdata-0.32.0 → orfdata-0.34.0}/README.md +8 -3
- orfdata-0.34.0/docs/viral.md +77 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/__init__.py +12 -1
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/viral/NOTICE.md +11 -0
- orfdata-0.34.0/orfdata/data/viral/hpv16-refseq-CDS.json.gz +0 -0
- orfdata-0.34.0/orfdata/version.py +1 -0
- orfdata-0.34.0/orfdata/viral.py +242 -0
- {orfdata-0.32.0 → orfdata-0.34.0/orfdata.egg-info}/PKG-INFO +9 -4
- orfdata-0.34.0/tests/test_viral.py +199 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tools/build_hpv16_cds.py +8 -2
- orfdata-0.32.0/docs/viral.md +0 -45
- orfdata-0.32.0/orfdata/data/viral/hpv16-refseq-CDS.json.gz +0 -0
- orfdata-0.32.0/orfdata/version.py +0 -1
- orfdata-0.32.0/orfdata/viral.py +0 -111
- orfdata-0.32.0/tests/test_viral.py +0 -110
- {orfdata-0.32.0 → orfdata-0.34.0}/LICENSE +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/MANIFEST.in +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/deploy.sh +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/catalogs.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/copy-yeast.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/coverage.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/dog-peptides.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/examples.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/human-tissue.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/index.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/ingolia-yeast.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/measurements.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/pairing.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/pfizer-protein.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/pfizer-rna.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/proteome.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/reference.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/search-references.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/source-references.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/species.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/storage.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs/stylesheets/docs.css +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/docs.sh +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/lint.sh +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/mkdocs.yml +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/_pinned_genome.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/_structure.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/build.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalog.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalog_cli.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalog_manifest.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/catalogs.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/cli.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/catalogs.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/chains.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/datasets.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/genomes.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/ires/rfam-15.1-human-ires.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/AUTHOR-LICENSE.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/NOTICE.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/catalog.json.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/orf-evidence/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/AUTHOR-LICENSE.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/NOTICE.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/catalog.json.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/data/uorf-evidence/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/dataset.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/dataset_cli.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/datasets.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/evidence.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/evidence_summary.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/genomes.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/genomes_cli.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/initiation_context.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/install.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/liftover.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/liftover_cli.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/measurements.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/model.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/pairing.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/proteome.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/proteome_cli.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/reference.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/reference_mapping.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/refseq.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/rna.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/search_reference.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sequence.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/__init__.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/copy.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/ingolia.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/kaabinejadian.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/ncorf_mammals.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/openprot.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/peptideatlas.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/pfizer.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/pfizer_rna.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/riborf.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata/sources/wang.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/SOURCES.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/dependency_links.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/entry_points.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/requires.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/orfdata.egg-info/top_level.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/pyproject.toml +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/setup.cfg +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/test.sh +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/conftest.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/aggregate_evidence.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905474.soft +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905474_KL9_fpkm.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905476.soft +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905476_KL10_fpkm.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905478.soft +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905478_KL11_fpkm.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905479.soft +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/GSM1905479_KL12_fpkm.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/geo-series.soft +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/methods.pdf +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/paper.xml +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/pmc-metadata.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/qconcat.fasta +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/copy/workbook.xlsx +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346111.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346111.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346114.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346114.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346115.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346115.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346116.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346116.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346117.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346117.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346118.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346118.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346120.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346120.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346122.metadata.txt +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/GSM346122.quant.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ingolia/readMe.txt.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/Results.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/kaabinejadian/sdrf.tsv +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/S3.xlsx +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/ensembl107.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/ensembl107.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/human-ensembl107.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/human.bed +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/human.pep.fa +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/mouse.bed +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/ncorf_mammals/mouse.pep.fa +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/ensembl106.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/ensembl106.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.bed.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.fasta.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/openprot/mouse-openprot-2_2-altprots+isoforms-min_2_pep-GRCm39.106.tsv.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/atlas_build.tsv.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/ensembl.pep.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/peptideatlas/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/protein.tsv +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/dog/search.fasta +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/protein.tsv +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/human/search.fasta +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/protein.tsv +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer/mouse/search.fasta +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/GSE325522_family.soft.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/GSE325523_family.soft.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/GSE325525_family.soft.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/counts.csv.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/dog-annotation.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/dog-expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/dog-manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/mouse-annotation.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/mouse-expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/mouse-manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/pfizer_rna/samples.xlsx +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/canis_lupus_familiaris.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/context-keys-v0.4.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/ensembl115.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/homo_sapiens.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/mitochondrial.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/mus_musculus.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/saccharomyces_cerevisiae.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/references/uniprot_literature.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/regions/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/regions/ingolia.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/SD3.xlsx +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/ensembl107.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/ensembl107.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/ensembl107.ncrna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/human-ensembl105.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/human-ensembl105.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/human-ensembl105.ncrna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/worm-ensembl105.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/worm-ensembl105.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/worm-ensembl105.ncrna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/yeast-ensembl115.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/yeast-ensembl115.dna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/yeast-ensembl115.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/zebrafish-ensembl115.cdna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/zebrafish-ensembl115.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/riborf/zebrafish-ensembl115.ncrna.fa.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/dog.fasta +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/ensembl83-expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/ensembl83-human.fasta.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/search_reference/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/README.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/generate.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v1.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v1.sqlite +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v2.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v2.sqlite +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v3.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v3.sqlite +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v4.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/storage/v4.sqlite +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/viral/NC_001526.4.gb.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/NOTICE.md +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/annotation.gtf.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/copies.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/expected.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/manifest.json +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/protein.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/rna.zip +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/data/wang/search.fasta.gz +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_catalog_registry.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_copy.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_cross_reference_pairing.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_dog_peptides.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_ensembl_search_reference.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_evidence_rules.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_evidence_summary.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_genetic_codes.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_genomes.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_ingolia.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_initiation_context.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_liftover.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_local_build_queries.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_measurements.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_merge_catalogs.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_more_species.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_ncorf_mammals.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_openprot.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_orf_cases.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_paired_selectors.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_pairing.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_pfizer.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_pfizer_rna.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_proteome.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_reference_context.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_reference_mapping.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_reference_orf.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_refseq.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_region_targets.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_riborf.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_search_reference.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_selectors.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_storage.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_uorf_catalog.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tests/test_wang.py +0 -0
- {orfdata-0.32.0 → orfdata-0.34.0}/tools/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: orfdata
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.34.0
|
|
4
4
|
Summary: Reference proteomes with evidence-backed noncanonical ORFs on PyEnsembl genomes
|
|
5
5
|
Author: OpenVax
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -113,11 +113,16 @@ Human evidence is never transferred to another species. Viral proteomes can be a
|
|
|
113
113
|
orfdata also provides [RNA, ribosome and protein measurements](https://openvax.github.io/orfdata/measurements/)
|
|
114
114
|
for human, mouse, dog and yeast.
|
|
115
115
|
|
|
116
|
-
`
|
|
117
|
-
|
|
116
|
+
`viral_references(host="human", group="HPV", virus_type="HPV16")` finds
|
|
117
|
+
source-qualified `ViralReference` objects. Choose a stable ID with
|
|
118
|
+
`viral_reference("NC_001526.4")`, then use `.dna` and `.orfs` to load its
|
|
119
|
+
packaged bases and coding paths. The functional loaders remain available.
|
|
120
|
+
When annotating an existing alignment, `viral_orfs(reference_dna,
|
|
121
|
+
contig="HPV16")` checks its actual reference sequence before applying the same
|
|
122
|
+
models.
|
|
118
123
|
The first [coding reference](https://openvax.github.io/orfdata/viral/) contains
|
|
119
124
|
the nine RefSeq NC_001526.4 HPV16 CDSs, with native and GDC placements;
|
|
120
|
-
|
|
125
|
+
the host association is distinct from the virus's own taxon. Broader
|
|
121
126
|
imports remain in [the viral roadmap](https://github.com/openvax/orfdata/issues/91).
|
|
122
127
|
|
|
123
128
|
## Measurement datasets
|
|
@@ -81,11 +81,16 @@ Human evidence is never transferred to another species. Viral proteomes can be a
|
|
|
81
81
|
orfdata also provides [RNA, ribosome and protein measurements](https://openvax.github.io/orfdata/measurements/)
|
|
82
82
|
for human, mouse, dog and yeast.
|
|
83
83
|
|
|
84
|
-
`
|
|
85
|
-
|
|
84
|
+
`viral_references(host="human", group="HPV", virus_type="HPV16")` finds
|
|
85
|
+
source-qualified `ViralReference` objects. Choose a stable ID with
|
|
86
|
+
`viral_reference("NC_001526.4")`, then use `.dna` and `.orfs` to load its
|
|
87
|
+
packaged bases and coding paths. The functional loaders remain available.
|
|
88
|
+
When annotating an existing alignment, `viral_orfs(reference_dna,
|
|
89
|
+
contig="HPV16")` checks its actual reference sequence before applying the same
|
|
90
|
+
models.
|
|
86
91
|
The first [coding reference](https://openvax.github.io/orfdata/viral/) contains
|
|
87
92
|
the nine RefSeq NC_001526.4 HPV16 CDSs, with native and GDC placements;
|
|
88
|
-
|
|
93
|
+
the host association is distinct from the virus's own taxon. Broader
|
|
89
94
|
imports remain in [the viral roadmap](https://github.com/openvax/orfdata/issues/91).
|
|
90
95
|
|
|
91
96
|
## Measurement datasets
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Viral coding references
|
|
2
|
+
|
|
3
|
+
Browse the packaged viral references by host, convenience group and virus type,
|
|
4
|
+
then load their source-annotated coding paths without fetching the genome:
|
|
5
|
+
|
|
6
|
+
```python
|
|
7
|
+
from orfdata import viral_orfs, viral_reference, viral_references
|
|
8
|
+
|
|
9
|
+
references = viral_references(host="human", group="HPV", virus_type="HPV16")
|
|
10
|
+
print([(r.id, r.coding_models) for r in references])
|
|
11
|
+
# [('NC_001526.4', 9), ('GRCh38.d1.vd1:HPV16', 9)]
|
|
12
|
+
|
|
13
|
+
ref = viral_reference("NC_001526.4") # choose the native RefSeq placement
|
|
14
|
+
reference_dna = ref.dna
|
|
15
|
+
for orf in ref.orfs:
|
|
16
|
+
print(orf.orf_id, orf.gene_name, orf.coding_blocks, orf.protein_sequence)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
The small bundled catalogue loads offline without PyEnsembl, Biopython or a
|
|
20
|
+
human genome. It supplies the complete DNA for the native RefSeq NC_001526.4
|
|
21
|
+
and GDC HPV16 placements; both map to the same nine source CDSs. The two DNA
|
|
22
|
+
strings differ by a verified circular rotation. `viral_reference_sequence(id)`
|
|
23
|
+
returns the exact forward FASTA bases, with T rather than U. A missing ID raises
|
|
24
|
+
`ValueError`. `viral_references()` returns immutable `ViralReference` data
|
|
25
|
+
classes; `.dna` and `.orfs` load only on access, so browsing does not copy
|
|
26
|
+
genome bases or construct ORF models for every result. Choose by reference ID,
|
|
27
|
+
not by result position: the native and GDC sequences have different coordinates.
|
|
28
|
+
Use `ref.to_dict()` when serializing reference metadata to JSON; it does not
|
|
29
|
+
load DNA or ORF models.
|
|
30
|
+
|
|
31
|
+
`host` accepts a known species name such as `"human"` or an NCBI taxon ID such
|
|
32
|
+
as `9606`. The released HPV16 reference objects have viral `taxon_id=333760`
|
|
33
|
+
and `host_taxon_ids=(9606,)`; these are different identities. Their documented
|
|
34
|
+
human host association is sourced to PaVE. `ref.group == "HPV"`
|
|
35
|
+
is a convenient selection label, not a formal taxonomic rank. The
|
|
36
|
+
`ref.virus_type == "HPV16"` label is the virus
|
|
37
|
+
type; ICTV places it in the species *Alphapapillomavirus 9*. Each reference also
|
|
38
|
+
retains the association and taxonomy source URLs. Host associations can cover
|
|
39
|
+
several host taxa as new references are curated; an unlisted host is unknown,
|
|
40
|
+
not proof that infection is impossible. NCBI Virus's isolation-host metadata is
|
|
41
|
+
not an exhaustive host-range list. `ref.host_taxon_ids` and `ref.host_source` have the
|
|
42
|
+
same meaning as in [ViralProteome](proteome.md#viral-proteomes).
|
|
43
|
+
|
|
44
|
+
When annotating an existing BAM, continue to bind against its **actual** full
|
|
45
|
+
alignment-reference DNA:
|
|
46
|
+
|
|
47
|
+
```python
|
|
48
|
+
orfs = viral_orfs(alignment_reference_dna, contig="HPV16")
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
This checks the sequence hash and its qualified coordinates. A contig name or
|
|
52
|
+
related strain cannot transfer CDS annotations to mismatching DNA. It raises
|
|
53
|
+
`ValueError` for an unavailable reference rather than returning an empty ORF
|
|
54
|
+
set. `viral_references()` reports coverage and source checksums, and
|
|
55
|
+
`viral_orfs()` returns the existing `SourceRNA`/`TranscriptORF` models.
|
|
56
|
+
|
|
57
|
+
Each model uses a `SourceRNA` containing only the available CDS, including
|
|
58
|
+
ordered splice blocks. Full transcript ends are not asserted. The existing
|
|
59
|
+
`TranscriptORF.at()` validates its source protein and coding boundaries.
|
|
60
|
+
These models have `orf_type="reference_CDS"`. Their internal kind `extra_orf`
|
|
61
|
+
describes a source-defined ORF outside a loaded PyEnsembl annotation, not a
|
|
62
|
+
claim that a RefSeq CDS is biologically noncanonical. No Ribo-seq or MS
|
|
63
|
+
support is inferred from the reference annotation.
|
|
64
|
+
|
|
65
|
+
The nine annotations are not an exhaustive HPV16 ORF catalogue. Other HPV
|
|
66
|
+
types/lineages, EBV/KSHV, CMV, hepatitis viruses including HDV, HTLV-1/HIV,
|
|
67
|
+
and polyomaviruses remain explicit coverage work in
|
|
68
|
+
[issues #91–98](https://github.com/openvax/orfdata/issues/91).
|
|
69
|
+
|
|
70
|
+
Isovar owns reconstructed sample RNA and read evidence. It can use these
|
|
71
|
+
coding paths to anchor a frame on observed sequence, preserving variants
|
|
72
|
+
and incomplete starts/stops. ORFdata does not assemble sample RNA, replace
|
|
73
|
+
missing bases, infer protein abundance or establish viral tumor causality.
|
|
74
|
+
RNA and coding-reference matches are not direct protein evidence.
|
|
75
|
+
|
|
76
|
+
Source attribution and rebuilding instructions are in
|
|
77
|
+
[`orfdata/data/viral/NOTICE.md`](https://github.com/openvax/orfdata/blob/main/orfdata/data/viral/NOTICE.md).
|
|
@@ -70,10 +70,21 @@ from .rna import IRES, ProteinProduct, RNAFeature, SourceRNA, products_from_unip
|
|
|
70
70
|
from .search_reference import SearchMembership, SearchReference, SearchReferenceSpec, SearchSequence
|
|
71
71
|
from .sequence import GeneticCode, genetic_code
|
|
72
72
|
from .version import __version__
|
|
73
|
-
from .viral import
|
|
73
|
+
from .viral import (
|
|
74
|
+
ViralProduct,
|
|
75
|
+
ViralReference,
|
|
76
|
+
viral_orfs,
|
|
77
|
+
viral_reference,
|
|
78
|
+
viral_reference_sequence,
|
|
79
|
+
viral_references,
|
|
80
|
+
)
|
|
74
81
|
|
|
75
82
|
__all__ = [
|
|
83
|
+
"ViralProduct",
|
|
84
|
+
"ViralReference",
|
|
76
85
|
"viral_orfs",
|
|
86
|
+
"viral_reference",
|
|
87
|
+
"viral_reference_sequence",
|
|
77
88
|
"viral_references",
|
|
78
89
|
"__version__",
|
|
79
90
|
"Proteome",
|
|
@@ -13,6 +13,17 @@ The catalogue contains nine source-annotated CDSs, including two joined paths.
|
|
|
13
13
|
It does not claim all reported HPV16 ORFs or complete transcript models.
|
|
14
14
|
RNA support does not establish translation or protein expression.
|
|
15
15
|
|
|
16
|
+
The released catalogue also contains the full forward reference bases for both
|
|
17
|
+
qualified placements. HPV16's documented human host is sourced from PaVE's
|
|
18
|
+
HPV16REF record (`/host="Human (Homo sapiens)"`):
|
|
19
|
+
https://pave.niaid.nih.gov/locus_viewer?feature_id=HPV16_E7&seq_id=HPV16REF .
|
|
20
|
+
This host association applies to HPV16 as a type, not to all papillomaviruses,
|
|
21
|
+
and does not claim an exhaustive host range. ICTV lists HPV16 in the species
|
|
22
|
+
*Alphapapillomavirus 9*:
|
|
23
|
+
https://ictv.global/report/chapter/papillomaviridae/taxonomy/papillomaviridae .
|
|
24
|
+
These are distinct from the RefSeq DNA/CDS source and the GDC coordinate
|
|
25
|
+
placement. Consulted 2026-10-16.
|
|
26
|
+
|
|
16
27
|
Native DNA MD5: `08d2b3849496d12cc45fd4df713d5c2f`.
|
|
17
28
|
GDC GRCh38.d1.vd1 HPV16 DNA MD5: `f2463721818c29998ef5ab917e6df74a`.
|
|
18
29
|
GDC DNA is the source circle rotated by 864 bases. Both placements retain
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.34.0"
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"""Offline, sequence-qualified viral CDSs bound to the existing RNA/ORF models."""
|
|
2
|
+
|
|
3
|
+
import gzip
|
|
4
|
+
import hashlib
|
|
5
|
+
import json
|
|
6
|
+
from dataclasses import asdict, dataclass
|
|
7
|
+
from functools import cached_property, lru_cache
|
|
8
|
+
from importlib.resources import files
|
|
9
|
+
|
|
10
|
+
from .model import TranscriptORF
|
|
11
|
+
from .reference import ReferenceContext, species_taxon
|
|
12
|
+
from .rna import SourceRNA
|
|
13
|
+
|
|
14
|
+
_CATALOG_SHA256 = "aca0c72948d4cda896d14b32203981bce4759e0c70212c05dca6f3d0e16ed4b4"
|
|
15
|
+
_COMPLEMENT = str.maketrans("ACGT", "TGCA")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class ViralProduct:
|
|
20
|
+
"""One source-labelled protein product in a viral coding reference."""
|
|
21
|
+
|
|
22
|
+
protein_id: str
|
|
23
|
+
gene: str
|
|
24
|
+
product: str
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
@dataclass(frozen=True)
|
|
28
|
+
class ViralReference:
|
|
29
|
+
"""One exact, bundled viral reference and its source-defined coding paths.
|
|
30
|
+
|
|
31
|
+
``dna`` and ``orfs`` load only when accessed. Host associations describe
|
|
32
|
+
documented hosts, not an exhaustive host range.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
id: str
|
|
36
|
+
species: str
|
|
37
|
+
taxon_id: int
|
|
38
|
+
host_taxon_ids: tuple[int, ...]
|
|
39
|
+
host_source: str
|
|
40
|
+
group: str
|
|
41
|
+
virus_type: str
|
|
42
|
+
ictv_species: str
|
|
43
|
+
taxonomy_source: str
|
|
44
|
+
length: int
|
|
45
|
+
sequence_md5: str
|
|
46
|
+
sequence_sha256: str
|
|
47
|
+
native_to_reference_rotation: int
|
|
48
|
+
source_accession: str
|
|
49
|
+
source_sha256: str
|
|
50
|
+
source_url: str
|
|
51
|
+
coding_models: int
|
|
52
|
+
products: tuple[ViralProduct, ...]
|
|
53
|
+
scope: str
|
|
54
|
+
catalogue_sha256: str
|
|
55
|
+
|
|
56
|
+
@cached_property
|
|
57
|
+
def dna(self):
|
|
58
|
+
"""Complete, checksum-verified forward FASTA bases for this reference."""
|
|
59
|
+
return viral_reference_sequence(self.id)
|
|
60
|
+
|
|
61
|
+
@cached_property
|
|
62
|
+
def orfs(self):
|
|
63
|
+
"""Source-defined CDS paths placed on this exact reference."""
|
|
64
|
+
return viral_orfs(reference_id=self.id)
|
|
65
|
+
|
|
66
|
+
def to_dict(self):
|
|
67
|
+
"""Return serializable metadata without loading DNA or ORF models."""
|
|
68
|
+
row = asdict(self)
|
|
69
|
+
row["host_taxon_ids"] = list(self.host_taxon_ids)
|
|
70
|
+
row["products"] = list(row["products"])
|
|
71
|
+
row["virus"] = dict(group=row.pop("group"), type=row.pop("virus_type"),
|
|
72
|
+
ictv_species=row.pop("ictv_species"),
|
|
73
|
+
taxonomy_source=row.pop("taxonomy_source"))
|
|
74
|
+
row["source"] = dict(accession=row.pop("source_accession"),
|
|
75
|
+
sha256=row.pop("source_sha256"), url=row.pop("source_url"))
|
|
76
|
+
return row
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@lru_cache(maxsize=1)
|
|
80
|
+
def _catalog():
|
|
81
|
+
raw = files("orfdata").joinpath("data/viral/hpv16-refseq-CDS.json.gz").read_bytes()
|
|
82
|
+
if hashlib.sha256(raw).hexdigest() != _CATALOG_SHA256:
|
|
83
|
+
raise ValueError("Bundled viral CDS catalogue checksum mismatch")
|
|
84
|
+
data = json.loads(gzip.decompress(raw))
|
|
85
|
+
if data["schema"] != "orfdata.viral_cds.v2":
|
|
86
|
+
raise ValueError("Unsupported viral CDS catalogue schema")
|
|
87
|
+
return data
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _reference(row, data):
|
|
91
|
+
virus = row["virus"]
|
|
92
|
+
source = row["source"]
|
|
93
|
+
return ViralReference(
|
|
94
|
+
id=row["id"], species=row["species"], taxon_id=row["taxon_id"],
|
|
95
|
+
host_taxon_ids=tuple(row["host_taxon_ids"]), host_source=row["host_source"],
|
|
96
|
+
group=virus["group"], virus_type=virus["type"],
|
|
97
|
+
ictv_species=virus["ictv_species"], taxonomy_source=virus["taxonomy_source"],
|
|
98
|
+
length=row["length"], sequence_md5=row["sequence_md5"],
|
|
99
|
+
sequence_sha256=row["sequence_sha256"],
|
|
100
|
+
native_to_reference_rotation=row["native_to_reference_rotation"],
|
|
101
|
+
source_accession=source["accession"], source_sha256=source["sha256"],
|
|
102
|
+
source_url=source["url"], coding_models=len(row["coding_blocks"]),
|
|
103
|
+
products=tuple(ViralProduct(cds["protein_id"], cds["gene"], cds["product"])
|
|
104
|
+
for cds in data["cds"]),
|
|
105
|
+
scope=data["scope"], catalogue_sha256=_CATALOG_SHA256)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def viral_references(*, host=None, group=None, virus_type=None):
|
|
109
|
+
"""Find released viral references by documented host, group and type.
|
|
110
|
+
|
|
111
|
+
Parameters
|
|
112
|
+
----------
|
|
113
|
+
host : str or int, optional
|
|
114
|
+
Known host name such as ``"human"``, or an NCBI host taxon ID. A host
|
|
115
|
+
association is source-attributed and is not a complete host range.
|
|
116
|
+
group : str, optional
|
|
117
|
+
Convenience group label, such as ``"HPV"``; not a taxonomy rank.
|
|
118
|
+
virus_type : str, optional
|
|
119
|
+
Named virus type, such as ``"HPV16"``; distinct from ICTV species.
|
|
120
|
+
|
|
121
|
+
Returns
|
|
122
|
+
-------
|
|
123
|
+
tuple of ViralReference
|
|
124
|
+
Exact sequence hashes, source/host pins, virus identity and coverage.
|
|
125
|
+
A listed reference is not a complete transcript or exhaustive ORF
|
|
126
|
+
catalogue. DNA and ORFs load only when their properties are accessed.
|
|
127
|
+
"""
|
|
128
|
+
if host is None:
|
|
129
|
+
host_taxon_id = None
|
|
130
|
+
elif type(host) is int and host > 0:
|
|
131
|
+
host_taxon_id = host
|
|
132
|
+
elif isinstance(host, str) and species_taxon(host) is not None:
|
|
133
|
+
host_taxon_id = species_taxon(host)
|
|
134
|
+
else:
|
|
135
|
+
raise ValueError("host must be a known species name or positive NCBI taxon ID")
|
|
136
|
+
if any(value is not None and (not isinstance(value, str) or not value)
|
|
137
|
+
for value in (group, virus_type)):
|
|
138
|
+
raise ValueError("group and virus_type must be nonempty names")
|
|
139
|
+
data = _catalog()
|
|
140
|
+
return tuple(_reference(row, data)
|
|
141
|
+
for row in data["references"]
|
|
142
|
+
if (host_taxon_id is None or host_taxon_id in row["host_taxon_ids"])
|
|
143
|
+
and (group is None or row["virus"]["group"].casefold() == group.casefold())
|
|
144
|
+
and (virus_type is None or row["virus"]["type"].casefold() == virus_type.casefold()))
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def viral_reference(reference_id):
|
|
148
|
+
"""Return one exact viral reference by stable ID, without positional selection."""
|
|
149
|
+
data = _catalog()
|
|
150
|
+
matches = [row for row in data["references"] if row["id"] == reference_id]
|
|
151
|
+
if len(matches) != 1:
|
|
152
|
+
raise ValueError("No unique released viral reference ID matches this name")
|
|
153
|
+
return _reference(matches[0], data)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def viral_reference_sequence(reference_id):
|
|
157
|
+
"""Return bundled, checksum-verified reference bases for one exact ID.
|
|
158
|
+
|
|
159
|
+
The sequence uses the forward FASTA alphabet (T rather than U) and may
|
|
160
|
+
represent a virus whose biological genome is RNA. No network is accessed.
|
|
161
|
+
"""
|
|
162
|
+
matches = [row for row in _catalog()["references"] if row["id"] == reference_id]
|
|
163
|
+
if len(matches) != 1:
|
|
164
|
+
raise ValueError("No unique released viral reference ID matches this name")
|
|
165
|
+
row = matches[0]
|
|
166
|
+
sequence = row["reference_sequence"]
|
|
167
|
+
if (len(sequence) != row["length"] or
|
|
168
|
+
hashlib.sha256(sequence.encode("ascii")).hexdigest() != row["sequence_sha256"]):
|
|
169
|
+
raise ValueError("Bundled viral reference sequence checksum mismatch")
|
|
170
|
+
return sequence
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def viral_orfs(reference_sequence=None, *, reference_id=None, contig=None):
|
|
174
|
+
"""Load source-defined CDSs for one exactly matching viral DNA reference.
|
|
175
|
+
|
|
176
|
+
Parameters
|
|
177
|
+
----------
|
|
178
|
+
reference_sequence : str, optional
|
|
179
|
+
Complete forward reference DNA from an alignment. This checks actual
|
|
180
|
+
sequence identity rather than transferring annotation by contig name.
|
|
181
|
+
reference_id : str, optional
|
|
182
|
+
Bundled reference ID from ``viral_references()``. Use this to load the
|
|
183
|
+
reference ORFs without obtaining DNA separately. Supply exactly one
|
|
184
|
+
of ``reference_sequence`` or ``reference_id``.
|
|
185
|
+
contig : str, optional
|
|
186
|
+
The caller's name for this exact DNA in an alignment reference. The
|
|
187
|
+
original versioned source identity remains on every ORF's context.
|
|
188
|
+
|
|
189
|
+
Returns
|
|
190
|
+
-------
|
|
191
|
+
tuple of TranscriptORF
|
|
192
|
+
Source CDS fragments represented with SourceRNA and TranscriptORF.at.
|
|
193
|
+
Their genomic blocks are 1-based inclusive and their RNA sequence is
|
|
194
|
+
only the available CDS. Full transcript boundaries are not asserted.
|
|
195
|
+
No ribosome, peptide or sample protein-expression evidence is inferred.
|
|
196
|
+
|
|
197
|
+
Raises
|
|
198
|
+
------
|
|
199
|
+
ValueError
|
|
200
|
+
No released coding reference matches, or a source model fails to bind
|
|
201
|
+
and translate exactly. Discovery is available through viral_references.
|
|
202
|
+
"""
|
|
203
|
+
if (reference_sequence is None) == (reference_id is None):
|
|
204
|
+
raise ValueError("Provide exactly one of reference_sequence or reference_id")
|
|
205
|
+
sequence = (viral_reference_sequence(reference_id) if reference_id is not None
|
|
206
|
+
else str(reference_sequence).upper())
|
|
207
|
+
fingerprint = hashlib.sha256(sequence.encode("ascii")).hexdigest()
|
|
208
|
+
data = _catalog()
|
|
209
|
+
matches = [row for row in data["references"] if row["sequence_sha256"] == fingerprint
|
|
210
|
+
and row["length"] == len(sequence)]
|
|
211
|
+
if len(matches) != 1:
|
|
212
|
+
raise ValueError("No unique released viral coding reference matches this DNA; "
|
|
213
|
+
"inspect viral_references() for available sequence identities")
|
|
214
|
+
reference = matches[0]
|
|
215
|
+
source = reference["source"]
|
|
216
|
+
label = contig if contig is not None else reference["id"]
|
|
217
|
+
if not isinstance(label, str) or not label:
|
|
218
|
+
raise ValueError("contig must be a nonempty name")
|
|
219
|
+
context = ReferenceContext(
|
|
220
|
+
taxon_id=reference["taxon_id"], species=reference["species"],
|
|
221
|
+
genome_build=reference["id"], annotation_name="NCBI RefSeq",
|
|
222
|
+
annotation_version=source["accession"], sequence_sha256=fingerprint,
|
|
223
|
+
source_sha256=source["sha256"])
|
|
224
|
+
result = []
|
|
225
|
+
for cds in data["cds"]:
|
|
226
|
+
protein_id = cds["protein_id"]
|
|
227
|
+
blocks = reference["coding_blocks"][protein_id]
|
|
228
|
+
coding = "".join(sequence[a - 1:b] if cds["strand"] == "+" else
|
|
229
|
+
sequence[a - 1:b].translate(_COMPLEMENT)[::-1] for a, b in blocks)
|
|
230
|
+
if cds["phase"] != 0:
|
|
231
|
+
raise ValueError(f"Unsupported partial source codon: {protein_id}")
|
|
232
|
+
rna = SourceRNA(
|
|
233
|
+
id=f"{source['accession']}:CDS:{protein_id}", sequence=coding, reference=context,
|
|
234
|
+
source=f"NCBI RefSeq {source['accession']}", contig=label, strand=cds["strand"],
|
|
235
|
+
exons=blocks, gene_name=cds["gene"], biotype="source_CDS_fragment")
|
|
236
|
+
orf = TranscriptORF.at(rna, 0, orf_id=protein_id, source=rna.source,
|
|
237
|
+
protein=cds["protein_sequence"], translation_table=cds["translation_table"],
|
|
238
|
+
orf_type="reference_CDS", start_complete=cds["start_complete"])
|
|
239
|
+
if orf.coding_sequence != coding or orf.stop_complete != cds["stop_complete"]:
|
|
240
|
+
raise ValueError(f"Source coding boundaries do not translate exactly: {protein_id}")
|
|
241
|
+
result.append(orf)
|
|
242
|
+
return tuple(result)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: orfdata
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.34.0
|
|
4
4
|
Summary: Reference proteomes with evidence-backed noncanonical ORFs on PyEnsembl genomes
|
|
5
5
|
Author: OpenVax
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -113,11 +113,16 @@ Human evidence is never transferred to another species. Viral proteomes can be a
|
|
|
113
113
|
orfdata also provides [RNA, ribosome and protein measurements](https://openvax.github.io/orfdata/measurements/)
|
|
114
114
|
for human, mouse, dog and yeast.
|
|
115
115
|
|
|
116
|
-
`
|
|
117
|
-
|
|
116
|
+
`viral_references(host="human", group="HPV", virus_type="HPV16")` finds
|
|
117
|
+
source-qualified `ViralReference` objects. Choose a stable ID with
|
|
118
|
+
`viral_reference("NC_001526.4")`, then use `.dna` and `.orfs` to load its
|
|
119
|
+
packaged bases and coding paths. The functional loaders remain available.
|
|
120
|
+
When annotating an existing alignment, `viral_orfs(reference_dna,
|
|
121
|
+
contig="HPV16")` checks its actual reference sequence before applying the same
|
|
122
|
+
models.
|
|
118
123
|
The first [coding reference](https://openvax.github.io/orfdata/viral/) contains
|
|
119
124
|
the nine RefSeq NC_001526.4 HPV16 CDSs, with native and GDC placements;
|
|
120
|
-
|
|
125
|
+
the host association is distinct from the virus's own taxon. Broader
|
|
121
126
|
imports remain in [the viral roadmap](https://github.com/openvax/orfdata/issues/91).
|
|
122
127
|
|
|
123
128
|
## Measurement datasets
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"""Qualify real, versioned viral CDS paths independently of sample assembly."""
|
|
2
|
+
|
|
3
|
+
import gzip
|
|
4
|
+
import hashlib
|
|
5
|
+
import io
|
|
6
|
+
import json
|
|
7
|
+
from copy import deepcopy
|
|
8
|
+
from dataclasses import FrozenInstanceError
|
|
9
|
+
from importlib.resources import files
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
from Bio import SeqIO
|
|
14
|
+
|
|
15
|
+
import orfdata.viral as viral_module
|
|
16
|
+
from orfdata import (
|
|
17
|
+
SourceRNA,
|
|
18
|
+
ViralReference,
|
|
19
|
+
viral_orfs,
|
|
20
|
+
viral_reference,
|
|
21
|
+
viral_reference_sequence,
|
|
22
|
+
viral_references,
|
|
23
|
+
)
|
|
24
|
+
from tools.build_hpv16_cds import build
|
|
25
|
+
|
|
26
|
+
FIXTURE = Path(__file__).parent / "data/viral/NC_001526.4.gb.gz"
|
|
27
|
+
EXPECTED = {
|
|
28
|
+
"YP_009268708.1": 92, "NP_041327.2": 649, "NP_041328.1": 365,
|
|
29
|
+
"NP_041330.2": 83, "NP_041331.2": 473, "NP_041332.2": 505,
|
|
30
|
+
"NP_041325.1": 158, "YP_009268707.1": 50, "NP_041326.1": 98,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
@pytest.fixture
|
|
35
|
+
def source():
|
|
36
|
+
raw = gzip.decompress(FIXTURE.read_bytes())
|
|
37
|
+
assert hashlib.sha256(raw).hexdigest() == "282be442f226cc809fefbda616ac136b8d20dfde23fad09558f3f653a3de96a4"
|
|
38
|
+
return raw, SeqIO.read(io.StringIO(raw.decode()), "genbank")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_catalogue_rebuilds_from_the_pinned_public_annotation(source):
|
|
42
|
+
raw, _ = source
|
|
43
|
+
packaged = json.loads(gzip.decompress(files("orfdata").joinpath(
|
|
44
|
+
"data/viral/hpv16-refseq-CDS.json.gz").read_bytes()))
|
|
45
|
+
assert build(raw) == packaged
|
|
46
|
+
assert len(packaged["cds"]) == 9
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_native_source_paths_match_all_nine_source_proteins(source):
|
|
50
|
+
_, record = source
|
|
51
|
+
orfs = viral_orfs(str(record.seq))
|
|
52
|
+
definitions = {f.qualifiers["protein_id"][0]: f for f in record.features if f.type == "CDS"}
|
|
53
|
+
assert {orf.orf_id: len(orf.protein_sequence) for orf in orfs} == EXPECTED
|
|
54
|
+
for orf in orfs:
|
|
55
|
+
feature = definitions[orf.orf_id]
|
|
56
|
+
assert isinstance(orf.transcript, SourceRNA)
|
|
57
|
+
assert orf.transcript.biotype == "source_CDS_fragment"
|
|
58
|
+
assert orf.transcript.genome is None
|
|
59
|
+
assert orf.protein_sequence == feature.qualifiers["translation"][0]
|
|
60
|
+
assert orf.coding_sequence == str(feature.extract(record.seq))
|
|
61
|
+
assert orf.start_complete and orf.stop_complete
|
|
62
|
+
assert orf.context.annotation_version == "NC_001526.4"
|
|
63
|
+
assert orf.context.taxon_id == 333760
|
|
64
|
+
assert not orf.evidence.has_evidence("ms")
|
|
65
|
+
assert not orf.evidence.has_evidence("ribosome")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_gdc_rotation_is_exact_and_retains_spliced_coding_positions(source):
|
|
69
|
+
_, record = source
|
|
70
|
+
native = str(record.seq)
|
|
71
|
+
gdc = native[-864:] + native[:-864]
|
|
72
|
+
assert hashlib.md5(gdc.encode()).hexdigest() == "f2463721818c29998ef5ab917e6df74a"
|
|
73
|
+
orfs = {orf.orf_id: orf for orf in viral_orfs(gdc, contig="HPV16")}
|
|
74
|
+
assert orfs["YP_009268708.1"].coding_blocks == ((865, 880), (3358, 3620))
|
|
75
|
+
assert orfs["YP_009268707.1"].coding_blocks == ((83, 226), (409, 417))
|
|
76
|
+
assert orfs["NP_041326.1"].coding_blocks == ((562, 858),)
|
|
77
|
+
for orf in orfs.values():
|
|
78
|
+
assert orf.transcript.contig == "HPV16"
|
|
79
|
+
assert orf.context.genome_build == "GRCh38.d1.vd1:HPV16"
|
|
80
|
+
assert orf.protein_sequence == next(o.protein_sequence for o in viral_orfs(native)
|
|
81
|
+
if o.orf_id == orf.orf_id)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def test_mutated_same_name_reference_and_partial_dna_are_not_qualified(source):
|
|
85
|
+
_, record = source
|
|
86
|
+
native = str(record.seq)
|
|
87
|
+
changed = ("A" if native[0] != "A" else "C") + native[1:]
|
|
88
|
+
for sequence in (changed, native[1:], native[::-1]):
|
|
89
|
+
with pytest.raises(ValueError, match="No unique released"):
|
|
90
|
+
viral_orfs(sequence, contig="HPV16")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def test_discovery_is_offline_and_reference_objects_are_immutable(source, monkeypatch):
|
|
94
|
+
_, record = source
|
|
95
|
+
references = viral_references()
|
|
96
|
+
assert all(isinstance(ref, ViralReference) for ref in references)
|
|
97
|
+
assert {ref.id for ref in references} == {"NC_001526.4", "GRCh38.d1.vd1:HPV16"}
|
|
98
|
+
assert all(ref.coding_models == 9 for ref in references)
|
|
99
|
+
assert all(ref.catalogue_sha256 and ref.source_sha256 for ref in references)
|
|
100
|
+
native = viral_reference("NC_001526.4")
|
|
101
|
+
assert native == next(ref for ref in references if ref.id == native.id)
|
|
102
|
+
with pytest.raises(FrozenInstanceError):
|
|
103
|
+
native.source_accession = "changed"
|
|
104
|
+
with pytest.raises(AttributeError):
|
|
105
|
+
native.host_taxon_ids.clear()
|
|
106
|
+
assert viral_reference("NC_001526.4").source_accession == "NC_001526.4"
|
|
107
|
+
assert native.host_taxon_ids == (9606,)
|
|
108
|
+
payload = native.to_dict()
|
|
109
|
+
assert payload["virus"]["type"] == "HPV16"
|
|
110
|
+
assert payload["source"]["accession"] == "NC_001526.4"
|
|
111
|
+
assert payload["host_taxon_ids"] == [9606]
|
|
112
|
+
assert len(payload["products"]) == 9
|
|
113
|
+
assert "dna" not in payload and "orfs" not in payload
|
|
114
|
+
json.dumps(payload)
|
|
115
|
+
payload["host_taxon_ids"].clear()
|
|
116
|
+
assert native.host_taxon_ids == (9606,)
|
|
117
|
+
with monkeypatch.context() as patch:
|
|
118
|
+
patch.setattr(viral_module, "viral_orfs", lambda **kwargs: 1 / 0)
|
|
119
|
+
patch.setattr(viral_module, "viral_reference_sequence", lambda reference_id: 1 / 0)
|
|
120
|
+
assert viral_references(host="human") == references
|
|
121
|
+
assert viral_orfs(str(record.seq))[0].context.annotation_version == "NC_001526.4"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def test_host_group_and_type_select_exact_references_with_distinct_taxa():
|
|
125
|
+
references = viral_references(host="human", group="HPV", virus_type="HPV16")
|
|
126
|
+
assert {ref.id for ref in references} == {"NC_001526.4", "GRCh38.d1.vd1:HPV16"}
|
|
127
|
+
assert viral_references(host=9606, group="hpv", virus_type="hpv16") == references
|
|
128
|
+
assert viral_references(host="mouse") == viral_references(host=10090) == ()
|
|
129
|
+
assert viral_references(host="human", virus_type="HPV18") == ()
|
|
130
|
+
for ref in references:
|
|
131
|
+
assert ref.taxon_id == 333760 and ref.host_taxon_ids == (9606,)
|
|
132
|
+
assert "PaVE HPV16REF" in ref.host_source
|
|
133
|
+
assert ref.ictv_species == "Alphapapillomavirus 9"
|
|
134
|
+
assert ref.group == "HPV" and ref.virus_type == "HPV16"
|
|
135
|
+
assert ref.taxonomy_source.startswith("https://ictv.global/")
|
|
136
|
+
for invalid in ("not_a_host", 0, True):
|
|
137
|
+
with pytest.raises(ValueError, match="host"):
|
|
138
|
+
viral_references(host=invalid)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def test_explicit_multiple_host_associations_can_select_one_reference_from_each_host(monkeypatch):
|
|
142
|
+
# Synthetic metadata checks selection only; it makes no HPV16 mouse-host claim.
|
|
143
|
+
catalog = deepcopy(viral_module._catalog())
|
|
144
|
+
catalog["references"][0]["host_taxon_ids"].append(10090)
|
|
145
|
+
catalog["references"][0]["host_source"] = "synthetic multiple-host fixture"
|
|
146
|
+
monkeypatch.setattr(viral_module, "_catalog", lambda: catalog)
|
|
147
|
+
assert {ref.id for ref in viral_references(host="human")} == {
|
|
148
|
+
"NC_001526.4", "GRCh38.d1.vd1:HPV16"}
|
|
149
|
+
mouse, = viral_references(host="mouse", virus_type="HPV16")
|
|
150
|
+
assert mouse.id == "NC_001526.4" and mouse.taxon_id == 333760
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
def test_bundled_reference_sequences_and_named_orfs_match_both_source_placements(source):
|
|
154
|
+
_, record = source
|
|
155
|
+
native = str(record.seq)
|
|
156
|
+
gdc = native[-864:] + native[:-864]
|
|
157
|
+
for reference_id, expected in (("NC_001526.4", native),
|
|
158
|
+
("GRCh38.d1.vd1:HPV16", gdc)):
|
|
159
|
+
ref = viral_reference(reference_id)
|
|
160
|
+
sequence = ref.dna
|
|
161
|
+
assert sequence == expected
|
|
162
|
+
assert ref.dna is sequence
|
|
163
|
+
assert sequence == viral_reference_sequence(reference_id)
|
|
164
|
+
assert hashlib.sha256(sequence.encode()).hexdigest() == ref.sequence_sha256
|
|
165
|
+
assert {orf.orf_id for orf in ref.orfs} == {product.protein_id for product in ref.products}
|
|
166
|
+
assert ref.orfs is ref.orfs
|
|
167
|
+
assert {orf.transcript.contig for orf in ref.orfs} == {reference_id}
|
|
168
|
+
by_name = viral_orfs(reference_id=reference_id, contig="selected")
|
|
169
|
+
by_dna = viral_orfs(sequence, contig="selected")
|
|
170
|
+
assert [(o.orf_id, o.coding_blocks, o.protein_sequence) for o in by_name] == [
|
|
171
|
+
(o.orf_id, o.coding_blocks, o.protein_sequence) for o in by_dna]
|
|
172
|
+
assert {o.transcript.contig for o in by_name} == {"selected"}
|
|
173
|
+
with pytest.raises(ValueError, match="reference ID"):
|
|
174
|
+
viral_reference_sequence("unknown")
|
|
175
|
+
with pytest.raises(ValueError, match="reference ID"):
|
|
176
|
+
viral_reference("unknown")
|
|
177
|
+
with pytest.raises(ValueError, match="exactly one"):
|
|
178
|
+
viral_orfs()
|
|
179
|
+
with pytest.raises(ValueError, match="exactly one"):
|
|
180
|
+
viral_orfs(native, reference_id="NC_001526.4")
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def test_corrupt_packaged_catalogue_fails_before_returning_models(monkeypatch):
|
|
184
|
+
import orfdata.viral as module
|
|
185
|
+
|
|
186
|
+
class CorruptResource:
|
|
187
|
+
def joinpath(self, path):
|
|
188
|
+
return self
|
|
189
|
+
|
|
190
|
+
def read_bytes(self):
|
|
191
|
+
return b"corrupt catalogue"
|
|
192
|
+
|
|
193
|
+
module._catalog.cache_clear()
|
|
194
|
+
try:
|
|
195
|
+
monkeypatch.setattr(module, "files", lambda name: CorruptResource())
|
|
196
|
+
with pytest.raises(ValueError, match="checksum mismatch"):
|
|
197
|
+
viral_references()
|
|
198
|
+
finally:
|
|
199
|
+
module._catalog.cache_clear()
|