gapit 0.5.4__tar.gz → 0.5.6__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.
- {gapit-0.5.4 → gapit-0.5.6}/AGENTS.md +59 -15
- {gapit-0.5.4 → gapit-0.5.6}/CHANGELOG.md +64 -0
- {gapit-0.5.4 → gapit-0.5.6}/PKG-INFO +20 -9
- {gapit-0.5.4 → gapit-0.5.6}/PLAN.md +16 -0
- {gapit-0.5.4 → gapit-0.5.6}/README.md +18 -7
- {gapit-0.5.4 → gapit-0.5.6}/docs/agents.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/agents.zh.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/databases.md +89 -42
- {gapit-0.5.4 → gapit-0.5.6}/docs/databases.zh.md +79 -43
- {gapit-0.5.4 → gapit-0.5.6}/docs/faq.md +3 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/faq.zh.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/installation.md +27 -5
- {gapit-0.5.4 → gapit-0.5.6}/docs/installation.zh.md +26 -4
- {gapit-0.5.4 → gapit-0.5.6}/docs/mcp.md +5 -5
- {gapit-0.5.4 → gapit-0.5.6}/docs/mcp.zh.md +5 -5
- {gapit-0.5.4 → gapit-0.5.6}/docs/outputs.md +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/docs/outputs.zh.md +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/docs/quickstart.md +7 -7
- {gapit-0.5.4 → gapit-0.5.6}/docs/quickstart.zh.md +6 -6
- {gapit-0.5.4 → gapit-0.5.6}/docs/reads.md +6 -6
- {gapit-0.5.4 → gapit-0.5.6}/docs/reads.zh.md +6 -6
- {gapit-0.5.4 → gapit-0.5.6}/docs/screen.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/screen.zh.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/summary.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/summary.zh.md +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/docs/typing.md +42 -15
- {gapit-0.5.4 → gapit-0.5.6}/docs/typing.zh.md +35 -14
- {gapit-0.5.4 → gapit-0.5.6}/pixi.lock +6 -35
- {gapit-0.5.4 → gapit-0.5.6}/pixi.toml +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/pyproject.toml +5 -5
- {gapit-0.5.4 → gapit-0.5.6}/recipe/meta.yaml +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/scripts/cluster_calibration.py +7 -2
- gapit-0.5.6/scripts/generate_vp_typing.py +294 -0
- gapit-0.5.6/scripts/vp_rules_matrix.tsv +8 -0
- gapit-0.5.6/scripts/vp_typing_support.py +148 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/__init__.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/bundled.py +64 -27
- gapit-0.5.6/src/gapit/bundled_cluster.py +116 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cli.py +44 -45
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cluster.py +5 -2
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/clusterbuild.py +57 -8
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_db.py +36 -41
- gapit-0.5.6/src/gapit/cmd_db_build.py +110 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_db_install.py +21 -21
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_db_outdated.py +21 -24
- gapit-0.5.6/src/gapit/cmd_db_search.py +82 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_screen.py +174 -188
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_screen_reads_args.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_summary.py +45 -40
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_typing.py +38 -29
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoh/bundled.json +1 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/bundled.json +1 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/lm_doumith/bundled.json +1 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ncbi/bundled.json +1 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/resfinder/bundled.json +1 -0
- gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/bundled.json +8 -0
- gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/floors.json +5 -0
- gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/records.jsonl +3 -0
- gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/sequences +97 -0
- gapit-0.5.6/src/gapit/data/dbs/vc_serogroup/typing.json +68 -0
- gapit-0.5.6/src/gapit/data/dbs/vp_ok/bundled.json +10 -0
- gapit-0.5.6/src/gapit/data/dbs/vp_ok/features.json +47815 -0
- gapit-0.5.6/src/gapit/data/dbs/vp_ok/sequences +115266 -0
- gapit-0.5.6/src/gapit/data/dbs/vp_ok/typing.json +1830 -0
- gapit-0.5.6/src/gapit/data/typing/vp_ok.json +1830 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_build_ops.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_ops.py +14 -11
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_query_ops.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/dispatch.py +49 -13
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/cluster.py +4 -4
- gapit-0.5.6/src/gapit/formats/cluster2.py +225 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/cluster_md.py +116 -16
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/schemas.py +2 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/gbfeatures.py +9 -1
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/mcp.py +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/mcp_schemas.py +3 -1
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/cluster_common.py +49 -10
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening.py +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening_cluster.py +67 -24
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening_reads.py +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/screening_reads_positional.py +4 -4
- gapit-0.5.6/src/gapit/typing_cluster2.py +62 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_decide.py +55 -8
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_engine.py +26 -8
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_gene.py +2 -40
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_models.py +10 -14
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_ops.py +2 -2
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_results.py +44 -4
- gapit-0.5.6/stderr.txt +7 -0
- gapit-0.5.6/tests/data/cluster/colliding_genes.gbk +55 -0
- gapit-0.5.6/tests/golden/cluster2_vp_none.json +60 -0
- gapit-0.5.6/tests/golden/cluster2_vp_none.md +26 -0
- gapit-0.5.6/tests/golden/cluster2_vp_none.tsv +2 -0
- gapit-0.5.6/tests/golden/cluster2_vp_o3k6.json +187 -0
- gapit-0.5.6/tests/golden/cluster2_vp_o3k6.md +32 -0
- gapit-0.5.6/tests/golden/cluster2_vp_o3k6.tsv +2 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_exact.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_exact.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_fragmented.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_fragmented.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_ambiguous.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_ambiguous.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_cm_exact.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_cm_exact.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_exact.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_exact.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_vc_inaba.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_vc_inaba.md +1 -1
- gapit-0.5.6/tests/golden/features_kaptive_style.json +47 -0
- gapit-0.5.6/tests/golden/features_screening.json +54 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/fragments_merge.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/fragments_merge.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_dec_pic_astA.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_dec_pic_astA.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_doumith_4b.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_doumith_4b.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_l4b.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_l4b.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_mixed.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_mixed.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_vp_typed.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_serotyping_vp_typed.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_shigella_mixed.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_shigella_mixed.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_typing_exact.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/gene_typing_exact.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/reads_tinyamr.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/reads_tinyamr.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/screen_multi.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/screen_multi.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_markers.json +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_markers.md +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_bundled.py +186 -51
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_aligner.py +3 -3
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_bare_help.py +11 -13
- gapit-0.5.6/tests/test_cli_completion.py +87 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_build.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_build_cluster.py +3 -3
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_fetch.py +24 -19
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_db_query.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_fragments.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads.py +3 -3
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads2.py +3 -3
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads_glob.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_reads_glob_jobs.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_schema.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_screen.py +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_screen_jobs.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_setupdb.py +13 -8
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_short_options.py +26 -28
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cli_summary.py +1 -1
- gapit-0.5.6/tests/test_cluster2_build.py +260 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_calibration.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_db.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_screen.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_typing.py +2 -3
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_db_fetch.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_db_list_extras.py +9 -8
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_error_envelope.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gapit_db_e2e.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_floors_e2e.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_typing.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_typing2.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_json_format.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_lm_doumith.py +4 -4
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp_reads.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_md_format.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_oversubscription.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_kaptive.py +5 -4
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads2_homologs.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_streaming_chunks.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_command.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_engine.py +29 -13
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_models.py +37 -19
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_schemes.py +1 -1
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_schemes_cluster.py +120 -19
- gapit-0.5.6/tests/test_vc_serogroup.py +43 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_version.py +1 -1
- gapit-0.5.6/tests/test_vp_ok.py +139 -0
- gapit-0.5.6/tests/test_vp_ok_acceptance.py +143 -0
- gapit-0.5.4/src/gapit/cmd_db_build.py +0 -124
- gapit-0.5.4/src/gapit/cmd_db_search.py +0 -75
- gapit-0.5.4/src/gapit/data/dbs/upec_expec_vf/bundled.json +0 -7
- gapit-0.5.4/src/gapit/data/dbs/upec_expec_vf/sequences +0 -2648
- gapit-0.5.4/tests/test_cli_completion.py +0 -70
- {gapit-0.5.4 → gapit-0.5.6}/.gitattributes +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/.github/workflows/ci.yml +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/.github/workflows/docs.yml +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/.github/workflows/release.yml +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/.gitignore +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/LICENSE +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/SPEC.md +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/docs/custom-db.md +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/docs/custom-db.zh.md +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/docs/index.md +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/docs/index.zh.md +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/mkdocs.yml +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/blast.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cluster_math.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/cmd_screen_positionals.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/config.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoh/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/floors.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/records.jsonl +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ecoli_dec/typing.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/lm_doumith/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/lm_doumith/typing.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/ncbi/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/data/dbs/resfinder/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/db_build_meta.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/dbbuild.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/dbcodec.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/engines.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/errors.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/fasta.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/__init__.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/json.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/md.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/reads_json.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/reads_tsv.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/summary.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/tsv.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/formats/typing_result.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/fragments.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/gene_floors.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/gffparse.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/hits.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/mcp_tools.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/minimap.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/minimap2_run.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/paf.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/proctools.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/progress.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/__init__.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ab_k.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ab_o.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/argannot.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/bacmet2.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/card.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/common.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ecoh.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ecoli_kps.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ecoli_vf.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kosc_k.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kosc_o.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kpsc_k.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/kpsc_o.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/megares.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/ncbi.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/plasmidfinder.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/resfinder.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/upec_expec_vf.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/vfdb.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/providers/victors.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/py.typed +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/readpairs.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/reads.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/records.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/report.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/seqconvert.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/summary.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_input.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/src/gapit/typing_rules.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/bundled_differential/resfinder/HEAD.zip +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/bundled_differential/resfinder/README.md +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/bakta_style.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters.gff3 +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters_gz.gff3.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters_sidecar.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/clusters_sidecar.gff3 +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/compound.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/gz_input.gbk.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/kaptive_style.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/nofasta.gff3 +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/screening.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_invalid.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_screen.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_screen_cm.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_screen_v2.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/typing_valid.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/cluster/unnamed_cds.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/full.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/gap.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/none.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/partial.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/contigs/sort.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.embl +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.embl.bz2 +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.fa.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/convert/sample.gbk.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/db/tinyamr/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/fragdb/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/split3040.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/split4060.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/fragments/split5050.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/argannot/ARG-ANNOT_NT_V6_July2019.txt +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/bacmet2/BacMet2_EXP_database.fasta +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/card/card.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ecoh/EcOH.fasta +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ecoli_vf/repaired_ecoli_vfs_shortnames.ffn +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/megares/megares_drugs_demo.fasta +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ncbi/AMR_CDS.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/ncbi/ReferenceGeneCatalog.txt +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/plasmidfinder/plasmids_a.fsa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/plasmidfinder/plasmids_b.fsa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/resfinder/aminoglycoside.fsa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/resfinder/beta-lactam.fsa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/resfinder/phenotypes.txt +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/upec_expec_vf/UPEC_ExPEC_VF.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/vfdb/VFDB_setA_nt.fas +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/victors/gen_downloads.php +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/providers/victors/gen_downloads_protein.php +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/bla_partial.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/junk.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s1_1.fq.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s1_2.fq.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s2_R1.fq.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/s2_R2.fq.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/suly_partial.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_R1.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_R2.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_full.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_full.fq.gz +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_lane1.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_lane2.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe1_R1.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe1_R2.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe2_R1.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads/tetx_pe2_R2.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads2/ont_homologs.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads2/sr_homologs.fq +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads2_db/homologs/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/reads_db/tinyreads/sequences +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/empty.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/multi_sample.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_a.csv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_a.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_b.csv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/summary/sample_b.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/dec_s1_aggR_pic_uidA.fasta +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/dec_s2_pic_astA_uidA.fasta +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/dec_s3_stx2a_escV_aggR_uidA.fasta +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/exact.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/listeria_1c.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/listeria_4b.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/listeria_nogate.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/markers.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/mutated.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/negative.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/partial.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/cholerae.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/cholerae.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/dec.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/dec.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/doumith.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/doumith.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/lm_doumith.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/lm_doumith.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/meningotype.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/meningotype.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/shigella.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/shigella.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/vp_ok.gbk +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/schemes/vp_ok.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/serotyping.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/typing_markers_v1.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/typing_markers_v2.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/typing_serotyping_v2.json +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/vp_mixed.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/data/typing/vp_typed.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_exact.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_fragmented.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_ambiguous.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_cm_exact.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_typing_exact.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/cluster_vc_inaba.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/ecoli_dec_typed.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/ecoli_dec_typing.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/fragments_merge.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/lm_doumith_typing.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_dutch.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.csv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/summary_multi.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/tinyamr_multi_nopath.csv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/tinyamr_multi_nopath.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_markers.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/golden/typing_serotyping.tsv +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/01_exact_and_junk.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/02_mutated.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/03_truncated.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/04_reverse.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/corpus/05_threshold.fa +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/make_corpus.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/run_parity.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/parity/run_summary_parity.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_blast_parse.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_blast_pipeline.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_cluster_math.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_config.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_db.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_db_headers.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_dbbuild.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_dbcodec.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_fasta.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_fragments.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gbfeatures.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gene_floors.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_gffparse.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_hits.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp_db_tools.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_mcp_protocol.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_minimap.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_mol_type.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_paf.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_paf_identity.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_progress.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_argannot.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_bacmet2.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_card.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_ecoh.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_ecoli_vf.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_megares.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_ncbi.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_plasmidfinder.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_resfinder.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_upec_expec_vf.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_vfdb.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_provider_victors.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_providers_common.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_readpairs.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads2_model.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_aggregate.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_integration.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_interval_union.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_reads_streaming.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_records.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_report.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_screen_integration.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_screening_reads_unit.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_seqconvert.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_seqconvert_differential.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_summary.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_summary_formats.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_tsv.py +0 -0
- {gapit-0.5.4 → gapit-0.5.6}/tests/test_typing_stage2.py +0 -0
|
@@ -31,7 +31,7 @@ are we?** A modern, typed, testable Python tool that:
|
|
|
31
31
|
native (`seqconvert.py`); `any2fasta` is no longer a gapit dependency anywhere — the
|
|
32
32
|
differential-validation oracle binary arrives transitively via abricate in the opt-in
|
|
33
33
|
`parity` pixi env (prepend `.pixi/envs/parity/bin` to PATH for the differential test).
|
|
34
|
-
- **Core libraries**: `
|
|
34
|
+
- **Core libraries**: `click` (CLI), `pydantic` v2 (data models / JSON schema), `rich` (terminal
|
|
35
35
|
output). No biopython — FASTA I/O is a small streaming parser we own.
|
|
36
36
|
- **Quality gates**: `ruff` (lint + format), `basedpyright` (strict mode), `pytest`.
|
|
37
37
|
|
|
@@ -89,7 +89,9 @@ gapit/
|
|
|
89
89
|
│ ├── typing_results.py # typing evaluation-result models (PhenotypeDetail, SchemeCall)
|
|
90
90
|
│ ├── typing_engine.py # typing evaluation, cluster path: rule scoring → phenotype call + breakdown
|
|
91
91
|
│ ├── typing_gene.py # typing evaluation, gene path (DEC markers): hits → per-scheme report phenotypes
|
|
92
|
-
│ ├──
|
|
92
|
+
│ ├── typing_cluster2.py # typing evaluation, multi-scheme cluster path: report → per-scheme phenotypes map
|
|
93
|
+
│ ├── bundled.py # bundled databases: discovery + kind-forked materialize-into-datadir
|
|
94
|
+
│ ├── bundled_cluster.py # cluster-bundle materialization: committed artifacts → cluster build
|
|
93
95
|
│ ├── blast.py # blastn invocation + tabular output parsing
|
|
94
96
|
│ ├── hits.py # Hit model, identity/coverage computation, filtering, dedup
|
|
95
97
|
│ ├── fragments.py # opt-in --merge-fragments cross-contig gene-fragment merging
|
|
@@ -125,14 +127,16 @@ gapit/
|
|
|
125
127
|
│ │ ├── reads_json.py # versioned JSON (gapit.reads/1, gapit.reads/2)
|
|
126
128
|
│ │ ├── md.py # Markdown (human + agent readable, YAML frontmatter)
|
|
127
129
|
│ │ ├── cluster.py # gapit.cluster/1 models + JSON/TSV renderers (typed variant)
|
|
128
|
-
│ │ ├──
|
|
130
|
+
│ │ ├── cluster2.py # gapit.cluster/2 models + JSON/TSV renderers (multi-scheme phenotypes map)
|
|
131
|
+
│ │ ├── cluster_md.py # gapit.cluster/1 + /2 Markdown renderers (Phenotype(s) column when typed)
|
|
129
132
|
│ │ ├── typing_result.py # gapit.typing_result/1 models + TSV/JSON/MD renderers
|
|
130
133
|
│ │ ├── schemas.py # registered output models behind `gapit schema`
|
|
131
134
|
│ │ └── summary.py # summary matrix renderers (TSV/CSV/JSON/MD)
|
|
132
135
|
│ ├── providers/ # 19 database provider modules (12 gene + 7 kaptive cluster) + cluster_common.py + common.py
|
|
133
136
|
│ └── py.typed
|
|
134
137
|
├── scripts/
|
|
135
|
-
│
|
|
138
|
+
│ ├── cluster_calibration.py # developer calibration harness for typed cluster dbs (single-scheme split dbs)
|
|
139
|
+
│ └── generate_vp_typing.py # regenerates the committed vp_ok typing asset from the vpautils OAgc/CPSgc GBKs
|
|
136
140
|
└── tests/
|
|
137
141
|
├── data/ # tiny synthetic db + contigs + reads (fast, offline)
|
|
138
142
|
├── golden/ # expected outputs incl. abricate reference TSVs
|
|
@@ -162,7 +166,7 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
162
166
|
- **Formats**: `--format tsv|csv|json|md` (default `tsv` for abricate compatibility).
|
|
163
167
|
- **JSON**: top-level `"schema": "gapit.report/1"`; schema introspectable via
|
|
164
168
|
`gapit schema report | reads | reads2 | summary | list | error | version` (plus
|
|
165
|
-
`cluster | features | typing | typing_result | floors`). Keys are snake_case,
|
|
169
|
+
`cluster | cluster2 | features | typing | typing_result | floors`). Keys are snake_case,
|
|
166
170
|
units explicit (`identity_pct`, `coverage_pct`). Semver the schema; never rename or
|
|
167
171
|
retype a field in a minor bump.
|
|
168
172
|
- **Markdown**: YAML frontmatter (tool version, db, params, ISO-8601 UTC timestamp) + tables a
|
|
@@ -181,15 +185,24 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
181
185
|
a license-compliance requirement: CARD/VFDB terms are non-commercial and Kaptive is GPL,
|
|
182
186
|
so none of those may ride an MIT distribution; the sanctioned exceptions are the six
|
|
183
187
|
content-provenance-audited bundles under `src/gapit/data/dbs/` — the public-domain
|
|
184
|
-
`ecoli_dec` and `lm_doumith` panels
|
|
185
|
-
(`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause,
|
|
186
|
-
|
|
187
|
-
|
|
188
|
+
`ecoli_dec` and `lm_doumith` panels, three permissively licensed provider snapshots
|
|
189
|
+
(`ncbi` public domain, `resfinder` Apache-2.0, `ecoh` BSD-3-Clause), and the MIT
|
|
190
|
+
`vp_ok` typed cluster snapshot — a pure built-in in the ecoli_dec/lm_doumith pattern: no
|
|
191
|
+
provider module, no `db fetch`; vpautils OAgc+CPSgc merged content, MIT
|
|
192
|
+
(GPL/NC content is never bundled) — materialized into the datadir on first use via
|
|
193
|
+
`bundled.py` (gene bundles replay the gene pipeline, the cluster bundle the cluster
|
|
194
|
+
pipeline), with `db fetch <name>` the fresh-upstream refresh path for the
|
|
195
|
+
provider-backed bundled names (ecoh, ncbi, resfinder); what may
|
|
196
|
+
ride the wheel is governed by the §6 policy),
|
|
188
197
|
database listing,
|
|
189
198
|
records.jsonl gene search, staleness
|
|
190
199
|
report, custom FASTA→native-db build, GBK/GFF→cluster-db build (`--typing` installs a
|
|
191
|
-
validated `gapit.typing/1` or `/2` spec on either kind), the
|
|
192
|
-
(GPL content, never bundled),
|
|
200
|
+
validated `gapit.typing/1` or `/2` spec on either kind), the seven download-on-fetch
|
|
201
|
+
kaptive cluster providers (four upstream repos, GPL content, never bundled), the
|
|
202
|
+
MIT-licensed `vp_ok` typed cluster bundle (OAgc+CPSgc merged: the committed typing asset
|
|
203
|
+
installs a 3-scheme `gapit.typing/2` doc so one screen renders `gapit.cluster/2` with
|
|
204
|
+
the composed `O:K` serotype, zero network from first install), and SHA256-verified
|
|
205
|
+
local-file install.
|
|
193
206
|
- **MCP** `[gapit-extension]`: `gapit mcp` / `gapit-mcp` stdio server exposing nine tools:
|
|
194
207
|
read-only `screen` (incl. `aligner minimap2` assembly survey), `screen_reads` (FASTQ via
|
|
195
208
|
minimap2), `summary`, `schema`, `db_list`, `db_search`, `db_outdated`, plus the datadir-mutating
|
|
@@ -199,7 +212,38 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
199
212
|
- **Self-description**: `gapit --version --json`, `gapit db list --json`, `gapit schema` — an agent
|
|
200
213
|
must be able to discover everything without reading docs.
|
|
201
214
|
|
|
202
|
-
## 6.
|
|
215
|
+
## 6. Bundled-database policy (what may ride the wheel)
|
|
216
|
+
|
|
217
|
+
`src/gapit/data/dbs/` is the sanctioned home for license-clean content shipped inside the
|
|
218
|
+
wheel: a directory qualifies by carrying `sequences` + `bundled.json` (auto-discovered by
|
|
219
|
+
`gapit.bundled`; `kind: cluster` in the metadata additionally requires `features.json`).
|
|
220
|
+
Materialization is kind-aware: gene bundles replay the gene-build pipeline, cluster
|
|
221
|
+
bundles the cluster-build pipeline (`bundled_cluster.py` rebuilds from the committed
|
|
222
|
+
locus FASTA + resolved feature table — gene ids stay snapshot-resolved, the typing spec
|
|
223
|
+
re-validates against them).
|
|
224
|
+
Bundling stays the exception, not the pattern: the other providers fetch from upstream at
|
|
225
|
+
`db fetch` time. Every new bundle passes two gates, in order:
|
|
226
|
+
|
|
227
|
+
1. **License gate** (hard, independent of location): only public-domain or permissive
|
|
228
|
+
content (PD, Apache-2.0, BSD, MIT), provenance-audited. GPL (Kaptive) and
|
|
229
|
+
non-commercial terms (CARD, VFDB) never ride the MIT distribution — moving files
|
|
230
|
+
cannot fix this.
|
|
231
|
+
2. **Size gate** (budget): the bundled-root total stays ≤ 30 MiB, mechanically enforced by
|
|
232
|
+
`tests/test_bundled.py` (every `pip install gapit` re-downloads all bundles; PyPI caps
|
|
233
|
+
one file at 100 MiB).
|
|
234
|
+
|
|
235
|
+
Growth tiers past the budget — split rather than inflate the ceiling:
|
|
236
|
+
|
|
237
|
+
- **≤ 30 MiB**: keep adding to `src/gapit/data/dbs/`. Atomic data-with-code versioning,
|
|
238
|
+
zero packaging machinery; the abricate precedent ships 16 MiB in-package.
|
|
239
|
+
- **30–100 MiB**: split a separate `gapit-data` wheel with its own version (the
|
|
240
|
+
`spacy[lookups]` → `spacy-lookups-data` pattern), pulled via a `gapit[datasets]` extra;
|
|
241
|
+
`bundled_databases()` grows a second discovery root.
|
|
242
|
+
- **> 100 MiB, or fast-moving upstreams**: fetch-on-demand only. `db fetch` is the
|
|
243
|
+
freshness path for every bundled name anyway — snapshots are point-in-time, and each
|
|
244
|
+
bundled upstream refresh would otherwise force a wheel release.
|
|
245
|
+
|
|
246
|
+
## 7. Testing strategy
|
|
203
247
|
|
|
204
248
|
- **Unit**: pure functions (coverage %, merge rules, header parsing) — no I/O beyond `tests/data`.
|
|
205
249
|
- **Golden files**: fixed tiny db + fixed contigs → expected TSV/JSON/MD committed; update the
|
|
@@ -212,7 +256,7 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
212
256
|
- Full suite + CI matrix 3.11/3.13/3.14; parity byte-diff is opt-in via the `parity` pixi env.
|
|
213
257
|
Offline tests stay fast.
|
|
214
258
|
|
|
215
|
-
##
|
|
259
|
+
## 8. Domain knowledge (abridged; full detail in SPEC.md)
|
|
216
260
|
|
|
217
261
|
- A **database** is a directory `<datadir>/<dbname>/sequences`: a nucleotide FASTA whose headers
|
|
218
262
|
encode `>~~~GENE~~~PRODUCT` (and accession / resistance metadata depending on the source db).
|
|
@@ -234,13 +278,13 @@ This is what distinguishes gapit from abricate. Treat it as a public API.
|
|
|
234
278
|
surfaces (reads, cluster, typing) follow their own documented contracts and may diverge from
|
|
235
279
|
abricate by design.
|
|
236
280
|
|
|
237
|
-
##
|
|
281
|
+
## 9. Git & workflow
|
|
238
282
|
|
|
239
283
|
- Conventional Commits (`feat:`, `fix:`, `test:`, `docs:`, `refactor:`).
|
|
240
284
|
- Never commit unless the user explicitly asks. Never force-push.
|
|
241
285
|
- `PLAN.md` tracks phases; update it when scope changes, not retroactively.
|
|
242
286
|
|
|
243
|
-
##
|
|
287
|
+
## 10. For agents working in this repo
|
|
244
288
|
|
|
245
289
|
1. Read `SPEC.md` before touching `blast.py`, `hits.py`, or `minimap.py`.
|
|
246
290
|
2. Public contract changes (JSON schema, exit codes, CLI flags) require a schema version bump and
|
|
@@ -5,6 +5,70 @@ All notable changes to gapit are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this
|
|
6
6
|
project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.5.6] - 2026-10-20
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **`gapit.cluster/2` TSV/CSV reshaped: per-scheme winner evidence replaces the packed
|
|
13
|
+
PHENOTYPES cell and the global-best columns.** The header now derives from the typing
|
|
14
|
+
document: each compose scheme's value column renders first (`SEROTYPE` — the headline
|
|
15
|
+
answer leads), then every non-compose scheme carries its call plus the winning locus's
|
|
16
|
+
own evidence (`O_GROUP, O_LOCUS, O_COVERAGE, O_IDENTITY, O_PRESENT, O_PARTIAL,
|
|
17
|
+
O_MISSING` — the `o_group` evidence prefix shortens to `O`); `-` cells where no winner
|
|
18
|
+
exists. The misleading `BEST_LOCUS`/global-evidence columns are gone (they described
|
|
19
|
+
whichever locus of either family ranked first), and the JSON `phenotypes` map gains
|
|
20
|
+
additive `winner_*` fields (`winner_locus`, `winner_coverage_pct`, `winner_identity_pct`,
|
|
21
|
+
`winner_present`, `winner_partial`, `winner_missing`). Amendment of a contract shipped
|
|
22
|
+
in 0.5.5 days earlier with no downstream adoption; `/1` and `gapit.typing_result/1`
|
|
23
|
+
outputs are byte-frozen.
|
|
24
|
+
|
|
25
|
+
## [0.5.5] - 2026-10-13
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- **`gapit.cluster/2` — multi-scheme cluster output.** A cluster database whose typing
|
|
30
|
+
document holds more than one scheme now renders `gapit.cluster/2`: same body as /1,
|
|
31
|
+
`best` drops its phenotype fields, and each file gains `phenotypes: {scheme: SchemeCall}`
|
|
32
|
+
in document order — compose schemes (e.g. `"{o_group}:{k_group}"`) render from sibling
|
|
33
|
+
calls, and schemes evaluate even without a best call. TSV/CSV swap PHENOTYPE for a packed
|
|
34
|
+
PHENOTYPES column (`o_group=O3;k_group=K6;serotype=O3:K6`); MD mirrors it plus per-scheme
|
|
35
|
+
lines. Untyped and single-scheme databases keep byte-identical `gapit.cluster/1`.
|
|
36
|
+
/2 builds guarantee globally-unique gene ids (collision-aware
|
|
37
|
+
/gene→locus_tag→`locus:id@start` resolution at build time). Registered as
|
|
38
|
+
`gapit schema cluster2`.
|
|
39
|
+
|
|
40
|
+
- **Bundled `vp_ok`: V. parahaemolyticus O:K serotyping, one scan.** The wheel now ships a
|
|
41
|
+
typed cluster bundle (six bundles total; ~7.9 MiB committed artifacts) built from the
|
|
42
|
+
vpasero OAgc/CPSgc reference loci (195 loci, MIT): `pip install gapit` →
|
|
43
|
+
`gapit screen genome.fna --db vp_ok` auto-materializes with zero network and renders
|
|
44
|
+
`gapit.cluster/2` with `o_group`, `k_group`, and the composed `O:K` serotype
|
|
45
|
+
(RIMD 2210633 → O3:K6). Kind-aware cluster-bundle materialization replays the same
|
|
46
|
+
cluster build entry `db build` uses — bundle ≡ build, byte-identical `sequences` +
|
|
47
|
+
`features.json` (regression-locked). Coverage floors calibrated over a 14,801-genome
|
|
48
|
+
corpus against Kaptive-style references: 90% coverage / 95% identity (O agreement
|
|
49
|
+
89.08%, K 82.91%, true cross-calls 29/29,602 calls); the HARD-locus matrix is committed
|
|
50
|
+
(`scripts/vp_rules_matrix.tsv`) and `scripts/generate_vp_typing.py` regenerates the
|
|
51
|
+
typing asset reproducibly.
|
|
52
|
+
|
|
53
|
+
- **Bundled-database policy (AGENTS.md §6) with a mechanical 30 MiB budget guard** —
|
|
54
|
+
license gate (PD/Apache/BSD/MIT only) + size gate enforced by `tests/test_bundled.py`;
|
|
55
|
+
growth tiers documented (split a `gapit-data` wheel past the budget rather than inflate).
|
|
56
|
+
|
|
57
|
+
### Changed
|
|
58
|
+
|
|
59
|
+
- **CLI migrated from typer to click 8.5.** Same flags, exit codes, envelopes, and stdout
|
|
60
|
+
bytes on every gapit-owned surface; a net dependency diet (typer/shellingham/annotated-doc
|
|
61
|
+
out, click in). Framework-rendered help is now plain click, and shell completion moved
|
|
62
|
+
from typer's `--install-completion`/`--show-completion` flags to the
|
|
63
|
+
`_GAPIT_COMPLETE=bash_source` env-var activation model (bash/zsh/fish; docs updated).
|
|
64
|
+
|
|
65
|
+
- **`gapit db list`: DESCRIPTION now precedes PROVIDER** (TSV and the rich table), and the
|
|
66
|
+
rich table renders with uniformly thin rule lines (was a heavy header separator).
|
|
67
|
+
|
|
68
|
+
- **`upec_expec_vf` no longer rides the wheel** — it returns to pure fetch-on-demand in
|
|
69
|
+
the provider catalog; the sanctioned bundled set is `ecoh`, `ecoli_dec`, `lm_doumith`,
|
|
70
|
+
`ncbi`, `resfinder`, `vp_ok`.
|
|
71
|
+
|
|
8
72
|
## [0.5.4] - 2026-10-03
|
|
9
73
|
|
|
10
74
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gapit
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.6
|
|
4
4
|
Summary: Mass screening of contigs and reads for known genes — agent-first Python reimplementation of abricate
|
|
5
5
|
Project-URL: Homepage, https://github.com/indexofire/gapit
|
|
6
6
|
Project-URL: Documentation, https://indexofire.github.io/gapit/
|
|
@@ -23,9 +23,9 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
23
23
|
Classifier: Programming Language :: Python :: 3.14
|
|
24
24
|
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
|
|
25
25
|
Requires-Python: >=3.11
|
|
26
|
+
Requires-Dist: click>=8.2
|
|
26
27
|
Requires-Dist: pydantic>=2.7
|
|
27
28
|
Requires-Dist: rich>=13
|
|
28
|
-
Requires-Dist: typer>=0.12
|
|
29
29
|
Description-Content-Type: text/markdown
|
|
30
30
|
|
|
31
31
|
# gapit
|
|
@@ -111,19 +111,22 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
|
|
|
111
111
|
## Databases
|
|
112
112
|
|
|
113
113
|
A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
|
|
114
|
-
`~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-
|
|
115
|
-
built into the catalog — twelve gene providers, seven kaptive cluster providers, and
|
|
116
|
-
|
|
114
|
+
`~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-two databases are
|
|
115
|
+
built into the catalog — twelve gene providers, seven kaptive cluster providers, and
|
|
116
|
+
three typed bundles (`ecoli_dec`, `lm_doumith`, and the cluster-kind `vp_ok`). Every
|
|
117
|
+
provider builds on `gapit db fetch`,
|
|
117
118
|
which downloads from upstream — and six content-provenance-audited ones also ship inside
|
|
118
119
|
the package (`ecoli_dec` and
|
|
119
|
-
`lm_doumith` plus the `ncbi`, `resfinder`, `ecoh
|
|
120
|
+
`lm_doumith` plus the `ncbi`, `resfinder`, `ecoh` snapshots — public
|
|
120
121
|
domain / Apache-2.0 /
|
|
121
|
-
BSD-3-Clause / MIT
|
|
122
|
+
BSD-3-Clause / MIT — and the MIT typed-cluster snapshot `vp_ok`), materialized into the
|
|
123
|
+
datadir on first use with zero network; the
|
|
122
124
|
bundled `ecoli_dec` additionally carries per-gene identity floors (`floors.json`, `pic`
|
|
123
125
|
at 90%) that reads mode applies before presence calls. Several
|
|
124
126
|
upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
|
|
125
127
|
redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
|
|
126
|
-
— and `db fetch <name>`
|
|
128
|
+
— and `db fetch <name>` refreshes the provider-backed bundled names (`ecoh`, `ncbi`,
|
|
129
|
+
`resfinder`) from the latest upstream.
|
|
127
130
|
|
|
128
131
|
| Name | Content | dbtype |
|
|
129
132
|
|---|---|---|
|
|
@@ -141,6 +144,7 @@ redistribution inside an MIT-licensed distribution, so everything else is fetch-
|
|
|
141
144
|
| `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
|
|
142
145
|
| `victors` | Victors virulence factors | nucl |
|
|
143
146
|
| `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
|
|
147
|
+
| `vp_ok` | V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero; cluster, MIT, one-scan O:K serotype) | nucl |
|
|
144
148
|
|
|
145
149
|
gapit also reads datadirs built by abricate itself (legacy `~~~` headers). The reverse
|
|
146
150
|
does not hold: gapit-native databases use the `gapit/v1` header format (see SPEC.md §11),
|
|
@@ -150,7 +154,14 @@ Gene **cluster** databases are a second kind: `gapit db build NAME loci.gbk|gff3
|
|
|
150
154
|
`kind: cluster` db (locus calls via minimap2, optional `--typing FILE` phenotype scoring),
|
|
151
155
|
and the seven Kaptive cluster databases (kpsc_k, kpsc_o, kosc_k, kosc_o, ab_k, ab_o,
|
|
152
156
|
ecoli_kps) fetch the Kaptive antigen-locus references at install time (GPL-3.0 content, so
|
|
153
|
-
nothing is bundled — cite Kaptive/Wyres et al. 2020 for results).
|
|
157
|
+
nothing is bundled — cite Kaptive/Wyres et al. 2020 for results). The typed cluster
|
|
158
|
+
bundle `vp_ok`
|
|
159
|
+
merges the vpasero OAgc + CPSgc references (MIT) into one bundled db — a pure built-in in
|
|
160
|
+
the ecoli_dec/lm_doumith pattern, no `db fetch` — where a single
|
|
161
|
+
`gapit screen --db vp_ok` renders gapit.cluster/2 with `o_group`, `k_group`, and the
|
|
162
|
+
composed `serotype` O:K call (RIMD 2210633 → O3:K6), working straight after
|
|
163
|
+
`pip install gapit` with zero network.
|
|
164
|
+
`gapit db list --json`
|
|
154
165
|
surfaces each provider's content license where one is pinned.
|
|
155
166
|
|
|
156
167
|
## Output contract
|
|
@@ -226,6 +226,22 @@ consumes abricate-built datadirs.
|
|
|
226
226
|
seven-column TSV/MD table. Cluster typing stays integrated in `gapit screen`
|
|
227
227
|
(`TYPING_CLUSTER_DB` on the command). No typing MCP tool yet (future work). Parity
|
|
228
228
|
15/15 + summary 6/6 unchanged; no version bump.
|
|
229
|
+
> **`gapit.cluster/2` — multi-scheme cluster output (2026-10-12):** a cluster db whose
|
|
230
|
+
> typing doc holds more than one scheme (compose allowed) renders `gapit.cluster/2`:
|
|
231
|
+
> same body as /1, `best` drops its phenotype fields, each file gains
|
|
232
|
+
> `phenotypes: {scheme: SchemeCall}` in doc order (compose schemes render from sibling
|
|
233
|
+
> calls via the shared decision layer; schemes evaluate even without a best call).
|
|
234
|
+
> TSV/CSV swap PHENOTYPE for a packed `PHENOTYPES` column (`o_group=O3;k_group=K6`);
|
|
235
|
+
> MD mirrors it plus per-scheme lines. Untyped and single-scheme dbs keep byte-identical
|
|
236
|
+
> `gapit.cluster/1`. /2 builds guarantee globally-unique gene ids (collision-aware
|
|
237
|
+
> /gene→locus_tag→`locus:id@start` resolution at build time). Registered as
|
|
238
|
+
> `gapit schema cluster2`. The vp_ok cookbook now installs as one merged db.
|
|
239
|
+
> **Amended (2026-10-20, pre-adoption):** the packed `PHENOTYPES` cell and the
|
|
240
|
+
> global-best columns are replaced by document-derived per-scheme columns — compose
|
|
241
|
+
> value columns first (`SEROTYPE`), then each scheme's call + winner-locus evidence
|
|
242
|
+
> (`O_LOCUS/O_COVERAGE/...`); JSON `phenotypes` gains additive `winner_*` fields. /2
|
|
243
|
+
> shipped in 0.5.5 days earlier with no downstream adoption; /1 and typing_result/1
|
|
244
|
+
> stay byte-frozen.
|
|
229
245
|
|
|
230
246
|
## Milestones
|
|
231
247
|
|
|
@@ -81,19 +81,22 @@ presence defaults to 90% alignment breadth (`--min-breadth 90`).
|
|
|
81
81
|
## Databases
|
|
82
82
|
|
|
83
83
|
A database is a directory under the datadir, resolved from `$GAPIT_DATADIR`, then
|
|
84
|
-
`~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-
|
|
85
|
-
built into the catalog — twelve gene providers, seven kaptive cluster providers, and
|
|
86
|
-
|
|
84
|
+
`~/.local/share/gapit/db` (override per call with `--datadir`). Twenty-two databases are
|
|
85
|
+
built into the catalog — twelve gene providers, seven kaptive cluster providers, and
|
|
86
|
+
three typed bundles (`ecoli_dec`, `lm_doumith`, and the cluster-kind `vp_ok`). Every
|
|
87
|
+
provider builds on `gapit db fetch`,
|
|
87
88
|
which downloads from upstream — and six content-provenance-audited ones also ship inside
|
|
88
89
|
the package (`ecoli_dec` and
|
|
89
|
-
`lm_doumith` plus the `ncbi`, `resfinder`, `ecoh
|
|
90
|
+
`lm_doumith` plus the `ncbi`, `resfinder`, `ecoh` snapshots — public
|
|
90
91
|
domain / Apache-2.0 /
|
|
91
|
-
BSD-3-Clause / MIT
|
|
92
|
+
BSD-3-Clause / MIT — and the MIT typed-cluster snapshot `vp_ok`), materialized into the
|
|
93
|
+
datadir on first use with zero network; the
|
|
92
94
|
bundled `ecoli_dec` additionally carries per-gene identity floors (`floors.json`, `pic`
|
|
93
95
|
at 90%) that reads mode applies before presence calls. Several
|
|
94
96
|
upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's GPL-3.0) forbid
|
|
95
97
|
redistribution inside an MIT-licensed distribution, so everything else is fetch-on-demand
|
|
96
|
-
— and `db fetch <name>`
|
|
98
|
+
— and `db fetch <name>` refreshes the provider-backed bundled names (`ecoh`, `ncbi`,
|
|
99
|
+
`resfinder`) from the latest upstream.
|
|
97
100
|
|
|
98
101
|
| Name | Content | dbtype |
|
|
99
102
|
|---|---|---|
|
|
@@ -111,6 +114,7 @@ redistribution inside an MIT-licensed distribution, so everything else is fetch-
|
|
|
111
114
|
| `bacmet2` | BacMet2 biocide/resistance genes (protein) | prot |
|
|
112
115
|
| `victors` | Victors virulence factors | nucl |
|
|
113
116
|
| `upec_expec_vf` | UPEC/ExPEC virulence genes | nucl |
|
|
117
|
+
| `vp_ok` | V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero; cluster, MIT, one-scan O:K serotype) | nucl |
|
|
114
118
|
|
|
115
119
|
gapit also reads datadirs built by abricate itself (legacy `~~~` headers). The reverse
|
|
116
120
|
does not hold: gapit-native databases use the `gapit/v1` header format (see SPEC.md §11),
|
|
@@ -120,7 +124,14 @@ Gene **cluster** databases are a second kind: `gapit db build NAME loci.gbk|gff3
|
|
|
120
124
|
`kind: cluster` db (locus calls via minimap2, optional `--typing FILE` phenotype scoring),
|
|
121
125
|
and the seven Kaptive cluster databases (kpsc_k, kpsc_o, kosc_k, kosc_o, ab_k, ab_o,
|
|
122
126
|
ecoli_kps) fetch the Kaptive antigen-locus references at install time (GPL-3.0 content, so
|
|
123
|
-
nothing is bundled — cite Kaptive/Wyres et al. 2020 for results).
|
|
127
|
+
nothing is bundled — cite Kaptive/Wyres et al. 2020 for results). The typed cluster
|
|
128
|
+
bundle `vp_ok`
|
|
129
|
+
merges the vpasero OAgc + CPSgc references (MIT) into one bundled db — a pure built-in in
|
|
130
|
+
the ecoli_dec/lm_doumith pattern, no `db fetch` — where a single
|
|
131
|
+
`gapit screen --db vp_ok` renders gapit.cluster/2 with `o_group`, `k_group`, and the
|
|
132
|
+
composed `serotype` O:K call (RIMD 2210633 → O3:K6), working straight after
|
|
133
|
+
`pip install gapit` with zero network.
|
|
134
|
+
`gapit db list --json`
|
|
124
135
|
surfaces each provider's content license where one is pinned.
|
|
125
136
|
|
|
126
137
|
## Output contract
|
|
@@ -13,7 +13,7 @@ Version, as one JSON line:
|
|
|
13
13
|
|
|
14
14
|
```console
|
|
15
15
|
$ gapit --version --json
|
|
16
|
-
{"schema":"gapit.version/1","name":"gapit","version":"0.5.
|
|
16
|
+
{"schema":"gapit.version/1","name":"gapit","version":"0.5.6"}
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
Output schemas. Eleven documents are introspectable: `report`, `typing_result`, `reads`,
|
|
@@ -63,7 +63,7 @@ For example, `gapit schema version` (real output):
|
|
|
63
63
|
```
|
|
64
64
|
|
|
65
65
|
Databases: the database catalog and install state (`gapit db list --json`; real output,
|
|
66
|
-
first two of twenty-
|
|
66
|
+
first two of twenty-two shown, trimmed):
|
|
67
67
|
|
|
68
68
|
```console
|
|
69
69
|
$ gapit db list --json
|
|
@@ -12,7 +12,7 @@ gapit 生来就是被程序驱动的。每个输出都以机器可读为设计
|
|
|
12
12
|
|
|
13
13
|
```console
|
|
14
14
|
$ gapit --version --json
|
|
15
|
-
{"schema":"gapit.version/1","name":"gapit","version":"0.5.
|
|
15
|
+
{"schema":"gapit.version/1","name":"gapit","version":"0.5.6"}
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
输出 schema。十一个文档可自省:`report`、`typing_result`、`reads`、`reads2`、`cluster`、
|
|
@@ -61,7 +61,7 @@ $ gapit schema floors # gapit.floors/1 (per-gene identity floors, reads
|
|
|
61
61
|
}
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
数据库:数据库目录与安装状态(`gapit db list --json
|
|
64
|
+
数据库:数据库目录与安装状态(`gapit db list --json`;真实输出,二十二个中的前两
|
|
65
65
|
个,有删节):
|
|
66
66
|
|
|
67
67
|
```console
|
|
@@ -26,38 +26,39 @@ $ gapit db list --datadir /no/such/dir
|
|
|
26
26
|
|
|
27
27
|
```console
|
|
28
28
|
$ gapit db list
|
|
29
|
-
NAME
|
|
30
|
-
ab_k
|
|
31
|
-
ab_o
|
|
32
|
-
argannot
|
|
33
|
-
bacmet2
|
|
34
|
-
card
|
|
35
|
-
ecoli_kps
|
|
36
|
-
ecoli_vf
|
|
37
|
-
kosc_k
|
|
38
|
-
kosc_o
|
|
39
|
-
kpsc_k
|
|
40
|
-
kpsc_o
|
|
41
|
-
megares
|
|
42
|
-
plasmidfinder
|
|
43
|
-
vfdb
|
|
44
|
-
victors
|
|
45
|
-
ecoh
|
|
46
|
-
ecoli_dec
|
|
47
|
-
lm_doumith gapit-curated (public-domain INSDC sources)
|
|
48
|
-
ncbi NCBI
|
|
49
|
-
resfinder
|
|
50
|
-
|
|
29
|
+
NAME DESCRIPTION STATUS DBTYPE PROVIDER
|
|
30
|
+
ab_k A. baumannii K locus (Kaptive) available nucl Kaptive (Kenyon lab)
|
|
31
|
+
ab_o A. baumannii OC locus — official keyword ab_o (Kaptive) available nucl Kaptive (Kenyon lab)
|
|
32
|
+
argannot ARG-ANNOT acquired resistance genes available nucl IHU Méditerranée-Infection
|
|
33
|
+
bacmet2 BacMet2 experimentally confirmed biocide/resistance genes (protein) available prot University of Gothenburg
|
|
34
|
+
card CARD protein homolog resistance models available nucl McMaster University
|
|
35
|
+
ecoli_kps E. coli group 2+3 capsular polysaccharide loci (Kaptive) available nucl Kaptive (Gladstone lab)
|
|
36
|
+
ecoli_vf E. coli virulence factors (phac-nml) available nucl PHAC-NML
|
|
37
|
+
kosc_k K. oxytoca species complex K locus (Kaptive) available nucl Kaptive (klebgenomics)
|
|
38
|
+
kosc_o K. oxytoca species complex O locus (Kaptive) available nucl Kaptive (klebgenomics)
|
|
39
|
+
kpsc_k K. pneumoniae species complex K locus (Kaptive) available nucl Kaptive (klebgenomics)
|
|
40
|
+
kpsc_o K. pneumoniae species complex O locus (Kaptive) available nucl Kaptive (klebgenomics)
|
|
41
|
+
megares MEGARes antimicrobial resistance genes available nucl MEG Lab
|
|
42
|
+
plasmidfinder CGE PlasmidFinder replicons available nucl DTU CGE
|
|
43
|
+
vfdb VFDB virulence factors (set A, nucleotide) available nucl USTC (VFDB)
|
|
44
|
+
victors Victors virulence factors available nucl University of Chicago
|
|
45
|
+
ecoh E. coli O and H antigens (srst2 EcOH) bundled nucl Holt lab (srst2)
|
|
46
|
+
ecoli_dec Diarrheagenic E. coli marker panel (GB 4789.6 + risk-monitoring designation) bundled nucl gapit-curated (public-domain sources)
|
|
47
|
+
lm_doumith Listeria monocytogenes serogrouping (Doumith 2004) bundled nucl gapit-curated (public-domain INSDC sources)
|
|
48
|
+
ncbi NCBI AMRFinderPlus (reference finder) curated AMR bundled nucl NCBI
|
|
49
|
+
resfinder CGE ResFinder acquired resistance genes bundled nucl DTU CGE
|
|
50
|
+
vp_ok V. parahaemolyticus O and K antigen loci (OAgc/CPSgc, vpasero) bundled nucl gapit-curated (vpasero)
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
NAME is the database name you pass to `--db`; PROVIDER names the upstream maintainer
|
|
54
54
|
organisation. STATUS reads `installed (N)` when `<datadir>/<name>/gapit-manifest.json`
|
|
55
55
|
exists, with N the record count, otherwise `available`. The last six rows are the
|
|
56
56
|
wheel-shipped [bundled](#bundled-databases-install-time-ready) databases, alphabetical:
|
|
57
|
-
`bundled` before materialization, `installed (N)` after.
|
|
58
|
-
`resfinder
|
|
59
|
-
once, in the bundled section (never as a duplicate registry `available` row), and
|
|
60
|
-
`gapit db fetch <name>` remains their fresh-upstream update path
|
|
57
|
+
`bundled` before materialization, `installed (N)` after. Three of them (`ecoh`, `ncbi`,
|
|
58
|
+
`resfinder`) are also registry providers — such names render
|
|
59
|
+
exactly once, in the bundled section (never as a duplicate registry `available` row), and
|
|
60
|
+
`gapit db fetch <name>` remains their fresh-upstream update path; `vp_ok` is bundled-only
|
|
61
|
+
(no provider, no fetch). Databases installed
|
|
61
62
|
into the datadir outside the catalog also appear, after the bundled section and sorted by
|
|
62
63
|
name: `db build` products (gene and cluster kinds alike) and manifest-less directories
|
|
63
64
|
(abricate-style or `db install` bytes) render with PROVIDER `local`, the record count
|
|
@@ -138,7 +139,7 @@ accept: a bundled database works out of the box.
|
|
|
138
139
|
| `lm_doumith` | Listeria monocytogenes serogrouping (5 records, Doumith 2004 markers) | 2026-10-03 | `gapit.typing/2` (scheme `doumith_serogroup`) |
|
|
139
140
|
| `ncbi` | NCBI AMRFinderPlus curated AMR (8373 records) | 2026-10-02 | — |
|
|
140
141
|
| `resfinder` | CGE ResFinder acquired resistance genes (3206 records) | 2026-10-02 | — |
|
|
141
|
-
| `
|
|
142
|
+
| `vp_ok` | V. parahaemolyticus O and K antigen loci (195 loci, vpautils OAgc+CPSgc; cluster kind) | 2026-10-12 | `gapit.typing/2` (schemes `o_group`, `k_group`, `serotype`) |
|
|
142
143
|
|
|
143
144
|
**License provenance.** Every `ecoli_dec` record was re-sourced from primary
|
|
144
145
|
public-domain submissions (NCBI RefSeq/GenBank/DDBJ accessions, same alleles as the
|
|
@@ -147,20 +148,29 @@ and replaced during the 2026-10 audit, and the byte-identical `estA4` (J03311.1)
|
|
|
147
148
|
`estA3` (M18346.1) — one `sth` gene, one sequence — was dropped by the build pipeline's
|
|
148
149
|
exact-duplicate dedup in the 2026-10 rebuild, leaving 16 records. The `lm_doumith` panel was extracted the same
|
|
149
150
|
way from public-domain INSDC records (accessions in each header; reverse-complement
|
|
150
|
-
markers strand-corrected, `lmo0737` verified 100% against EGD-e). The
|
|
151
|
-
snapshots (`ecoh`, `ncbi`, `resfinder
|
|
151
|
+
markers strand-corrected, `lmo0737` verified 100% against EGD-e). The three provider
|
|
152
|
+
snapshots (`ecoh`, `ncbi`, `resfinder`) passed the 2026-10
|
|
152
153
|
content-level audit across **all** records: NCBI AMRFinderPlus content is public
|
|
153
|
-
domain (US government work), the CGE ResFinder database is Apache-2.0, srst2's EcOH
|
|
154
|
-
is BSD-3-Clause
|
|
155
|
-
redistribution inside the MIT-licensed wheel.
|
|
156
|
-
|
|
154
|
+
domain (US government work), the CGE ResFinder database is Apache-2.0, and srst2's EcOH
|
|
155
|
+
is BSD-3-Clause — all three permit
|
|
156
|
+
redistribution inside the MIT-licensed wheel. The `vp_ok` cluster snapshot is
|
|
157
|
+
MIT-licensed vpautils content (lab-curated loci, Bakta-annotated, via
|
|
158
|
+
[indexofire/vpautils](https://github.com/indexofire/vpautils)); it ships as the
|
|
159
|
+
resolved `sequences` + `features.json` pair a completed gapit.typing/2 build
|
|
160
|
+
produces. A regression test pins that no `VF*` / `VFDB` / `ARO:` tags appear in any
|
|
161
|
+
of the six bundles' headers.
|
|
157
162
|
|
|
158
163
|
**Snapshots are point-in-time.** Each snapshot's `sequences` file is byte-for-byte what
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
164
|
+
the upstream content produces on the snapshot date (a regression test proves the
|
|
165
|
+
byte-identity for `resfinder` against a pinned copy of the upstream archive, and for
|
|
166
|
+
`vp_ok` against a `gapit db build` over the real vpautils GenBank files when local
|
|
167
|
+
copies exist — `features.json` included, gene-id resolution included).
|
|
168
|
+
The wheel copy therefore drifts as upstream curation moves on: for the provider-backed
|
|
169
|
+
names (`ecoh`, `ncbi`, `resfinder`) `gapit db fetch <name>`
|
|
162
170
|
(alone, or with `--force` to overwrite a materialized copy) re-downloads the **latest**
|
|
163
|
-
upstream content and rebuilds the datadir database — the freshness path. `
|
|
171
|
+
upstream content and rebuilds the datadir database — the freshness path. `vp_ok` has no
|
|
172
|
+
provider: a refresh means a new resolved snapshot riding a wheel release.
|
|
173
|
+
`bundled.json`
|
|
164
174
|
records the snapshot date for reference. (`db outdated` stays manifest-based in v1:
|
|
165
175
|
it reports the materialization/fetch time of what is installed, not bundled-vs-upstream
|
|
166
176
|
drift — comparing the wheel snapshots against latest upstream is future work.)
|
|
@@ -172,7 +182,11 @@ silenced by `--quiet`), then the standard gene-build pipeline: `records.jsonl`,
|
|
|
172
182
|
`sequences` FASTA with gapit/v1 headers, the BLAST index, the `typing.json` copy when the
|
|
173
183
|
bundle ships one, and a manifest stamped `source: "bundled"`. That pipeline — shared with
|
|
174
184
|
`gapit db build` — drops exact `(gene, sequence)` duplicate records at build time (first
|
|
175
|
-
kept; a stderr note and the receipt's `duplicates_dropped` count the drops).
|
|
185
|
+
kept; a stderr note and the receipt's `duplicates_dropped` count the drops). Cluster
|
|
186
|
+
bundles (`vp_ok`) run the cluster pipeline instead: materialization rebuilds the locus
|
|
187
|
+
FASTA and `features.json` from the committed artifacts through the same cluster build
|
|
188
|
+
entry a `db build` uses — gene ids stay snapshot-resolved, the typing spec re-validates
|
|
189
|
+
against them, no re-resolution. Deterministic, zero
|
|
176
190
|
network. A missing datadir is created on this path only; `gapit setupdb` materializes
|
|
177
191
|
every bundled database alongside indexing; re-running either is a no-op once the
|
|
178
192
|
manifest exists. `db list` shows the database as `bundled` before that and
|
|
@@ -209,10 +223,41 @@ Known limitations, carried on the calls as notes where relevant:
|
|
|
209
223
|
The fallback call — `untypeable (4a/4c, atypical profile, or non-Lm Listeria)` — is the
|
|
210
224
|
honest answer for everything the five markers cannot resolve.
|
|
211
225
|
|
|
226
|
+
### vp_ok (V. parahaemolyticus O:K, MIT, typed on install)
|
|
227
|
+
|
|
228
|
+
`vp_ok` wraps the two *Vibrio parahaemolyticus* serotype references of
|
|
229
|
+
[indexofire/vpautils](https://github.com/indexofire/vpautils) — `OAgc.gbk` (32
|
|
230
|
+
O-antigen gene cluster loci) and `CPSgc.gbk` (163 capsular polysaccharide loci) —
|
|
231
|
+
into ONE merged `kind: cluster` database. It is a PURE built-in bundled database in
|
|
232
|
+
the `ecoli_dec`/`lm_doumith` pattern: no provider, no source URLs, no
|
|
233
|
+
`gapit db fetch vp_ok`. The committed three-scheme typing asset
|
|
234
|
+
(`src/gapit/data/typing/vp_ok.json`, generated reproducibly by
|
|
235
|
+
`scripts/generate_vp_typing.py`) installs with it, so screening renders
|
|
236
|
+
`gapit.cluster/2` with per-file phenotypes `o_group`, `k_group`, and the composed
|
|
237
|
+
`serotype` `"{o_group}:{k_group}"` (fallbacks `OUT`/`KUT`) — the O:K serotype from a
|
|
238
|
+
single scan:
|
|
239
|
+
|
|
240
|
+
```console
|
|
241
|
+
$ gapit screen RIMD.fna --db vp_ok --format json
|
|
242
|
+
{"schema": "gapit.cluster/2", ..., "phenotypes": {"o_group": {"phenotype": "O3"},
|
|
243
|
+
"k_group": {"phenotype": "K6"}, "serotype": {"phenotype": "O3:K6"}}}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
The database content is **MIT** (Bakta-annotated, via vpautils), so unlike the
|
|
247
|
+
kaptive providers it is license-clean for redistribution — a resolved snapshot ships
|
|
248
|
+
inside the wheel as the sixth bundled database (8.3 MiB committed artifacts, within
|
|
249
|
+
the 30 MiB budget), and first use materializes it with zero network. The
|
|
250
|
+
typing rules recompute sequence-unique key genes per locus (variants fold: OL4V1 →
|
|
251
|
+
O4, KL20V1 → K20; untyped OLU*/KLU* loci get no rule and fall back to OUT/KUT), and
|
|
252
|
+
the asset validates against the loci at build and materialization time — a drifted
|
|
253
|
+
upstream GBK fails `TYPING_UNKNOWN_GENE` instead of installing silently. Calibrated
|
|
254
|
+
against real genomes with RIMD 2210633 locked to O3:K6 (see the rule notes for the
|
|
255
|
+
documented per-locus tuning).
|
|
256
|
+
|
|
212
257
|
## Checking database freshness
|
|
213
258
|
|
|
214
259
|
`gapit db outdated` reports every installed database's age against the staleness
|
|
215
|
-
threshold. Against a fully installed datadir (output trimmed to three of twenty-
|
|
260
|
+
threshold. Against a fully installed datadir (output trimmed to three of twenty-two rows):
|
|
216
261
|
|
|
217
262
|
```console
|
|
218
263
|
$ gapit db outdated --days 30
|
|
@@ -309,8 +354,10 @@ downloads from its upstream source at fetch time: with the exception of the six
|
|
|
309
354
|
audited, permissively licensed bundles above, nothing is bundled inside the package,
|
|
310
355
|
because several upstream licenses (CARD's McMaster terms, VFDB's CC BY-NC, Kaptive's
|
|
311
356
|
GPL-3.0) forbid redistribution inside an MIT-licensed distribution. The seven kaptive
|
|
312
|
-
providers are **cluster** databases (built through the cluster pipeline at
|
|
313
|
-
see [Kaptive providers](#kaptive-providers-gpl-downloaded-on-fetch))
|
|
357
|
+
providers are **cluster** databases (built through the cluster pipeline at
|
|
358
|
+
fetch time — see [Kaptive providers](#kaptive-providers-gpl-downloaded-on-fetch));
|
|
359
|
+
the eighth cluster database, the typed `vp_ok`, is bundled-only
|
|
360
|
+
([vp_ok](#vp_ok-v-parahaemolyticus-ok-mit-typed-on-install)).
|
|
314
361
|
|
|
315
362
|
| Name | Maintainer | Content | dbtype |
|
|
316
363
|
|---|---|---|---|
|
|
@@ -496,7 +543,7 @@ versions. A real one, from the plasmidfinder database:
|
|
|
496
543
|
"upstream_version": "",
|
|
497
544
|
"tool": {
|
|
498
545
|
"name": "gapit",
|
|
499
|
-
"version": "0.5.
|
|
546
|
+
"version": "0.5.6"
|
|
500
547
|
},
|
|
501
548
|
"makeblastdb_version": "blastn: 2.17.0+",
|
|
502
549
|
"minimap2_version": "2.31-r1302"
|