OperonDBS 0.7.2__tar.gz → 0.8.2__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.
- {operondbs-0.7.2 → operondbs-0.8.2}/.github/workflows/publish.yml +3 -2
- operondbs-0.8.2/.github/workflows/test.yml +52 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/.gitignore +7 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/AGENTS.md +93 -19
- {operondbs-0.7.2 → operondbs-0.8.2}/MANIFEST.in +2 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/OperonDBS.egg-info/PKG-INFO +16 -13
- {operondbs-0.7.2 → operondbs-0.8.2}/OperonDBS.egg-info/SOURCES.txt +50 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/OperonDBS.egg-info/requires.txt +7 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/PKG-INFO +16 -13
- {operondbs-0.7.2 → operondbs-0.8.2}/README.md +8 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/README_ZH.md +8 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/conf.py +1 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/extensibility.md +2 -2
- operondbs-0.8.2/docs/en/architecture/external-analysis.md +63 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/files-and-storage.md +4 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/metadata-and-data-model.md +1 -12
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/overview.md +23 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/qc-and-rules.md +2 -0
- operondbs-0.8.2/docs/en/contributor/defect-tracking.md +71 -0
- operondbs-0.8.2/docs/en/contributor/development-testing.md +110 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/contributor/index.md +2 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/contributor/repository-guide.md +2 -6
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/getting-started/first-project.md +29 -27
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/getting-started/quickstart.md +1 -9
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/backup-migration.md +4 -16
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/curation-lifecycle.md +1 -1
- operondbs-0.8.2/docs/en/guides/external-analysis.md +328 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/file-archiving.md +2 -13
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/index.md +4 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/metadata-import.md +3 -1
- operondbs-0.8.2/docs/en/guides/phylogenetics-workflow.md +202 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/qc-profiles.md +72 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/remote-execution.md +4 -3
- operondbs-0.8.2/docs/en/guides/remote-first.md +138 -0
- operondbs-0.8.2/docs/en/guides/remote-storage.md +70 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/index.md +2 -7
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/operations/database-compatibility.md +5 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/operations/qc-performance.md +6 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/overview.md +1 -11
- operondbs-0.8.2/docs/en/reference/behaviors-and-limitations.md +279 -0
- operondbs-0.8.2/docs/en/reference/cli-analysis.md +215 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-decisions-reports.md +33 -7
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-files-qc.md +37 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-project-metadata.md +45 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-remote.md +3 -2
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-taxonomy-lifecycle-admin.md +2 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-tui.md +47 -7
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/cli-workflow.md +24 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/data-model.md +30 -17
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/index.md +2 -0
- operondbs-0.8.2/docs/en/reference/recipe-fields.md +468 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/recipe-overview.md +6 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/reference/recipe-parsers-examples.md +164 -8
- operondbs-0.8.2/docs/en/reference/resolved-issues.md +58 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/extensibility.md +7 -2
- operondbs-0.8.2/docs/zh/architecture/external-analysis.md +176 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/files-and-storage.md +9 -11
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/index.md +1 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/metadata-and-data-model.md +4 -31
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/overview.md +23 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/qc-and-rules.md +5 -0
- operondbs-0.8.2/docs/zh/contributor/defect-tracking.md +55 -0
- operondbs-0.8.2/docs/zh/contributor/development-testing.md +110 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/contributor/index.md +2 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/contributor/repository-guide.md +2 -6
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/getting-started/first-project.md +38 -58
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/getting-started/quickstart.md +5 -11
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/backup-migration.md +7 -14
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/curation-lifecycle.md +4 -2
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/external-analysis.md +127 -94
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/file-archiving.md +7 -16
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/index.md +4 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/metadata-import.md +7 -6
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/ncbi-datasets.md +6 -6
- operondbs-0.8.2/docs/zh/guides/phylogenetics-workflow.md +244 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/qc-profiles.md +99 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/remote-execution.md +21 -6
- operondbs-0.8.2/docs/zh/guides/remote-first.md +169 -0
- operondbs-0.8.2/docs/zh/guides/remote-storage.md +82 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/taxonomy-coverage.md +5 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/index.md +2 -7
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/operations/database-compatibility.md +19 -2
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/operations/qc-performance.md +10 -5
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/overview.md +2 -12
- operondbs-0.8.2/docs/zh/reference/behaviors-and-limitations.md +276 -0
- operondbs-0.8.2/docs/zh/reference/cli-analysis.md +341 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-decisions-reports.md +68 -9
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-files-qc.md +50 -8
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-project-metadata.md +45 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-remote.md +8 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-taxonomy-lifecycle-admin.md +4 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-tui.md +38 -7
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/cli-workflow.md +16 -2
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/data-model.md +60 -40
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/index.md +2 -0
- operondbs-0.8.2/docs/zh/reference/recipe-fields.md +558 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/recipe-overview.md +9 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/reference/recipe-parsers-examples.md +209 -7
- operondbs-0.8.2/docs/zh/reference/resolved-issues.md +50 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/adapters/ncbi_datasets.py +31 -28
- operondbs-0.8.2/operon/adapters/timetree.py +377 -0
- operondbs-0.8.2/operon/classify.py +541 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/cli.py +653 -32
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/coverage.py +3 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/database.py +221 -63
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/demo.py +1 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/entity_view.py +24 -9
- operondbs-0.8.2/operon/environment.py +222 -0
- operondbs-0.8.2/operon/environment_capture.py +304 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/errors.py +9 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/execution.py +626 -61
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/export.py +66 -31
- operondbs-0.8.2/operon/fanout.py +385 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/files.py +40 -12
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/import_wizard.py +3 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/lifecycle.py +5 -5
- {operondbs-0.7.2/operon/qc_module → operondbs-0.8.2/operon/qc}/__init__.py +98 -89
- operondbs-0.8.2/operon/qc/_alignment.pyx +185 -0
- operondbs-0.8.2/operon/qc/alignment.py +176 -0
- operondbs-0.8.2/operon/qc/measure.py +239 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/release.py +33 -6
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/remotes.py +114 -43
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/rules.py +7 -6
- operondbs-0.8.2/operon/sequence_tools.py +477 -0
- operondbs-0.8.2/operon/sql.py +18 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/table_import.py +8 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/taxonomy.py +6 -6
- operondbs-0.8.2/operon/timetree.py +489 -0
- operondbs-0.8.2/operon/tools.py +2788 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/actions.py +30 -8
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/data.py +59 -18
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/common.py +14 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/config.py +36 -15
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/files_ops.py +51 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/import_wizard.py +78 -22
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/publish.py +11 -3
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/runs.py +1 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/workflow.py +271 -11
- {operondbs-0.7.2 → operondbs-0.8.2}/pyproject.toml +24 -17
- {operondbs-0.7.2 → operondbs-0.8.2}/setup.py +4 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/compatibility/test_python_support.py +24 -3
- operondbs-0.8.2/tests/integration/test_analysis_array.py +774 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_analysis_shutdown.py +25 -0
- operondbs-0.8.2/tests/integration/test_analysis_tools.py +1064 -0
- operondbs-0.8.2/tests/integration/test_classify_sequences.py +251 -0
- operondbs-0.8.2/tests/integration/test_fanout_analyze.py +175 -0
- operondbs-0.8.2/tests/integration/test_python_packaging.py +169 -0
- operondbs-0.8.2/tests/integration/test_qc_remote_measure.py +69 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_taxonomy_coverage.py +1 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/regression/test_correctness.py +1 -1
- operondbs-0.8.2/tests/regression/test_cython_alignment_parity.py +151 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/regression/test_cython_parser_parity.py +4 -4
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/regression/test_parser_semantics.py +2 -2
- operondbs-0.8.2/tests/regression/test_sql_identifier_security.py +124 -0
- operondbs-0.8.2/tests/unit/test_alignment_qc.py +285 -0
- operondbs-0.8.2/tests/unit/test_classify.py +616 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_cli_edges.py +14 -10
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_config_workflow_edges.py +50 -9
- operondbs-0.8.2/tests/unit/test_core_coverage_more.py +2037 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_coverage_edges.py +0 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_database_edges_more.py +24 -8
- operondbs-0.8.2/tests/unit/test_defect_registry.py +121 -0
- operondbs-0.8.2/tests/unit/test_defects_cli.py +150 -0
- operondbs-0.8.2/tests/unit/test_environment.py +296 -0
- operondbs-0.8.2/tests/unit/test_environment_capture.py +398 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_execution.py +394 -41
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_execution_edges.py +321 -16
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_export.py +62 -0
- operondbs-0.8.2/tests/unit/test_fanout.py +400 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_files_edges.py +115 -6
- operondbs-0.8.2/tests/unit/test_follow.py +265 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_import_backup_show.py +0 -22
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_lifecycle.py +3 -17
- operondbs-0.8.2/tests/unit/test_misc_coverage_more.py +1552 -0
- operondbs-0.8.2/tests/unit/test_ncbi_coverage_gaps.py +1517 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_parser_edge_paths.py +1 -1
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_qc_and_rules.py +45 -18
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_qc_edges_more.py +15 -6
- operondbs-0.8.2/tests/unit/test_qc_measure.py +434 -0
- operondbs-0.8.2/tests/unit/test_qc_remote_only.py +141 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_recipe_history.py +0 -12
- operondbs-0.8.2/tests/unit/test_remote_taxonomy_more.py +1507 -0
- operondbs-0.8.2/tests/unit/test_remote_transport_edges.py +254 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_remotes.py +14 -22
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_remotes_edges.py +2 -1
- operondbs-0.8.2/tests/unit/test_schema_2_10.py +79 -0
- operondbs-0.8.2/tests/unit/test_schema_2_11.py +62 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_schema_2_9.py +1 -2
- operondbs-0.8.2/tests/unit/test_sequence_tools.py +350 -0
- operondbs-0.8.2/tests/unit/test_sequences.py +168 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_support_edges.py +13 -2
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_taxonomy_edges.py +18 -30
- operondbs-0.8.2/tests/unit/test_timetree.py +518 -0
- operondbs-0.8.2/tests/unit/test_timetree_snapshots.py +938 -0
- operondbs-0.8.2/tests/unit/test_tools_edges.py +1077 -0
- operondbs-0.8.2/tests/unit/test_tools_execution_more.py +1254 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_tui.py +94 -19
- operondbs-0.8.2/tests/unit/test_tui_config.py +1700 -0
- operondbs-0.8.2/tests/unit/test_tui_flows_more.py +1126 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_tui_publish.py +216 -9
- operondbs-0.8.2/tests/unit/test_tui_screens_more.py +1663 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_tui_writes.py +120 -8
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_views_release_reports_edges.py +64 -27
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_workflow_cli.py +41 -0
- operondbs-0.7.2/.github/workflows/test.yml +0 -27
- operondbs-0.7.2/docs/en/architecture/external-analysis.md +0 -47
- operondbs-0.7.2/docs/en/contributor/development-testing.md +0 -48
- operondbs-0.7.2/docs/en/guides/external-analysis.md +0 -262
- operondbs-0.7.2/docs/en/guides/remote-storage.md +0 -113
- operondbs-0.7.2/docs/en/reference/behaviors-and-limitations.md +0 -192
- operondbs-0.7.2/docs/en/reference/cli-analysis.md +0 -111
- operondbs-0.7.2/docs/en/reference/recipe-fields.md +0 -328
- operondbs-0.7.2/docs/zh/architecture/external-analysis.md +0 -114
- operondbs-0.7.2/docs/zh/contributor/development-testing.md +0 -57
- operondbs-0.7.2/docs/zh/guides/remote-storage.md +0 -130
- operondbs-0.7.2/docs/zh/reference/behaviors-and-limitations.md +0 -190
- operondbs-0.7.2/docs/zh/reference/cli-analysis.md +0 -152
- operondbs-0.7.2/docs/zh/reference/recipe-fields.md +0 -364
- operondbs-0.7.2/operon/environment.py +0 -92
- operondbs-0.7.2/operon/tools.py +0 -1537
- operondbs-0.7.2/tests/integration/test_analysis_tools.py +0 -492
- operondbs-0.7.2/tests/integration/test_python_packaging.py +0 -131
- operondbs-0.7.2/tests/unit/test_environment.py +0 -121
- operondbs-0.7.2/tests/unit/test_tools_edges.py +0 -361
- operondbs-0.7.2/tests/unit/test_tui_config.py +0 -683
- {operondbs-0.7.2 → operondbs-0.8.2}/.readthedocs.yaml +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/LICENSE +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/OperonDBS.egg-info/dependency_links.txt +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/OperonDBS.egg-info/entry_points.txt +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/OperonDBS.egg-info/top_level.txt +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/benchmarks/qc_representative_entities.tsv +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/_static/language-switcher.js +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/_static/operon.css +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/_templates/layout.html +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/index.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/release-lifecycle.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/contributor/documentation-deployment.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/contributor/pypi-release.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/getting-started/daily-workflow.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/getting-started/index.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/getting-started/installation.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/ncbi-datasets.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/guides/troubleshooting.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/operations/index.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/en/operations/ncbi-recovery-migration.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/index.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/requirements.txt +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/release-lifecycle.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/contributor/documentation-deployment.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/contributor/pypi-release.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/getting-started/daily-workflow.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/getting-started/index.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/getting-started/installation.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/guides/troubleshooting.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/operations/index.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/docs/zh/operations/ncbi-recovery-migration.md +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/__main__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/adapters/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/backup.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/config.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/lineage.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/metadata_files.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/ncbi_reconcile.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/profiles.py +0 -0
- {operondbs-0.7.2/operon/qc_module → operondbs-0.8.2/operon/qc}/_parsers.pyx +0 -0
- {operondbs-0.7.2/operon/qc_module → operondbs-0.8.2/operon/qc}/parsers.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/reports.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/schema.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/shutdown.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/app.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/app.tcss +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/assets/splash.png +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/assets/splash.rgb.z +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/coverage.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/decisions.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/entities.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/files.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/screens/home.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/splash.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/tui/splash_terminal.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/operon/utils.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/setup.cfg +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/compatibility/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/helpers.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_analysis_resume.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_execution_backends.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_lineage_cascade.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_ncbi_datasets_adapter.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/integration/test_pipeline_and_release.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/regression/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/__init__.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_docs_versions.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_import_wizard_edges.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_lineage.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_ncbi_edge_cases.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_ncbi_reconcile_edges.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_rules_schema_edges.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_schema_and_metadata.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_shutdown.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_table_import_edges.py +0 -0
- {operondbs-0.7.2 → operondbs-0.8.2}/tests/unit/test_tui_splash_terminal.py +0 -0
|
@@ -71,10 +71,11 @@ jobs:
|
|
|
71
71
|
- run: python -m cibuildwheel --output-dir wheelhouse
|
|
72
72
|
env:
|
|
73
73
|
CIBW_ARCHS: ${{ matrix.architecture }}
|
|
74
|
-
CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-*"
|
|
74
|
+
CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-* cp315-*"
|
|
75
75
|
CIBW_SKIP: "*-musllinux_*"
|
|
76
76
|
CIBW_TEST_COMMAND: >-
|
|
77
|
-
python -c "import operon; import operon.
|
|
77
|
+
python -c "import operon; import operon.qc._parsers;
|
|
78
|
+
import operon.qc._alignment;
|
|
78
79
|
print(operon.__version__)" && operon --help
|
|
79
80
|
- uses: actions/upload-artifact@v7
|
|
80
81
|
with:
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- master
|
|
7
|
+
pull_request:
|
|
8
|
+
|
|
9
|
+
# A newer push supersedes an in-flight run of the same ref.
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: true
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
# Documentation is cheap to build and independent of the test matrix, so it
|
|
16
|
+
# runs as its own job in parallel instead of gating the ten test jobs.
|
|
17
|
+
docs:
|
|
18
|
+
runs-on: ubuntu-latest
|
|
19
|
+
steps:
|
|
20
|
+
- uses: actions/checkout@v6
|
|
21
|
+
- uses: actions/setup-python@v7
|
|
22
|
+
with:
|
|
23
|
+
python-version: "3.12"
|
|
24
|
+
cache: pip
|
|
25
|
+
cache-dependency-path: pyproject.toml
|
|
26
|
+
- run: python -m pip install --upgrade pip
|
|
27
|
+
- run: python -m pip install -e '.[docs]'
|
|
28
|
+
- run: sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
29
|
+
|
|
30
|
+
pytest:
|
|
31
|
+
strategy:
|
|
32
|
+
fail-fast: false
|
|
33
|
+
matrix:
|
|
34
|
+
os: [ ubuntu-latest, macos-latest ]
|
|
35
|
+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
|
|
36
|
+
runs-on: ${{ matrix.os }}
|
|
37
|
+
steps:
|
|
38
|
+
- uses: actions/checkout@v6
|
|
39
|
+
- uses: actions/setup-python@v7
|
|
40
|
+
with:
|
|
41
|
+
allow-prereleases: true
|
|
42
|
+
check-latest: true
|
|
43
|
+
python-version: ${{ matrix.python-version }}
|
|
44
|
+
cache: pip
|
|
45
|
+
cache-dependency-path: pyproject.toml
|
|
46
|
+
- run: |
|
|
47
|
+
python -m pip install --upgrade pip
|
|
48
|
+
python -m pip install -e '.[test]'
|
|
49
|
+
python -m pytest
|
|
50
|
+
- uses: codacy/codacy-coverage-reporter-action@v1.3.0
|
|
51
|
+
with:
|
|
52
|
+
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
|
@@ -5,7 +5,8 @@ dist/
|
|
|
5
5
|
__pycache__/
|
|
6
6
|
*.py[cod]
|
|
7
7
|
*.so
|
|
8
|
-
operon/
|
|
8
|
+
operon/qc/_parsers.c
|
|
9
|
+
operon/qc/_alignment.c
|
|
9
10
|
*.egg-info/
|
|
10
11
|
*.sqlite
|
|
11
12
|
*.sqlite-wal
|
|
@@ -14,6 +15,7 @@ logs/
|
|
|
14
15
|
raw/
|
|
15
16
|
standardized/
|
|
16
17
|
qc/
|
|
18
|
+
!operon/qc/
|
|
17
19
|
analysis/
|
|
18
20
|
reports/
|
|
19
21
|
releases/
|
|
@@ -26,3 +28,7 @@ junit.xml
|
|
|
26
28
|
htmlcov/
|
|
27
29
|
/site/
|
|
28
30
|
/docs/_build/
|
|
31
|
+
/workflows/
|
|
32
|
+
/HPC/
|
|
33
|
+
.matrix/
|
|
34
|
+
cobertura.xml
|
|
@@ -26,8 +26,8 @@ principle-to-implementation mapping.
|
|
|
26
26
|
|
|
27
27
|
Current version markers (must stay consistent across code and docs):
|
|
28
28
|
|
|
29
|
-
- `operon` 0.
|
|
30
|
-
- database schema 2.
|
|
29
|
+
- `operon` 0.8.2 (`pyproject.toml`)
|
|
30
|
+
- database schema 2.11 (`operon/database.py`, `SCHEMA_VERSION`)
|
|
31
31
|
- metadata schema 1.4 (`operon/schema.py`, `METADATA_SCHEMA_VERSION`)
|
|
32
32
|
|
|
33
33
|
The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
@@ -36,17 +36,27 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
36
36
|
|
|
37
37
|
- `operon/` — the Python package (CLI entry points: `operon/cli.py`,
|
|
38
38
|
`operon/__main__.py`; console script `operon = operon.cli:main`).
|
|
39
|
-
- `operon/adapters/` — external source adapters
|
|
40
|
-
offline-first: JSON/JSONL, ZIP, or unpacked directories, plus optional
|
|
41
|
-
online download)
|
|
42
|
-
|
|
43
|
-
|
|
39
|
+
- `operon/adapters/` — external source adapters: NCBI Datasets
|
|
40
|
+
(offline-first: JSON/JSONL, ZIP, or unpacked directories, plus optional
|
|
41
|
+
online download) and TimeTree (query-cache-only REST client caching the
|
|
42
|
+
verbatim responses of exact queries under `adapters_cache/timetree/`;
|
|
43
|
+
mirroring or redistribution is forbidden by TimeTree's terms).
|
|
44
|
+
- `operon/qc/` — home for all QC functionality: streaming
|
|
45
|
+
FASTA/FASTQ/GFF3/protein parsers and built-in QC stages, plus alignment
|
|
46
|
+
QC (`alignment.py`, the pure-Python multiple-alignment QC reference
|
|
47
|
+
implementation behind `operon alignment-qc`, and `_alignment.pyx`, its
|
|
48
|
+
Cython production backend; parity enforced by
|
|
49
|
+
`tests/regression/test_cython_alignment_parity.py`). `parsers.py` is the
|
|
50
|
+
pure-Python reference
|
|
44
51
|
implementation; `_parsers.pyx` is the Cython-accelerated build of the
|
|
45
|
-
same API (compiled in place as `operon.
|
|
52
|
+
same API (compiled in place as `operon.qc._parsers`). The Cython
|
|
46
53
|
module is the required production backend; the pure-Python module is the
|
|
47
54
|
behavioral reference used by regression tests. Both must produce
|
|
48
55
|
identical metrics and error messages (enforced by
|
|
49
|
-
`tests/regression/test_cython_parser_parity.py`).
|
|
56
|
+
`tests/regression/test_cython_parser_parity.py`). `measure.py` backs
|
|
57
|
+
`operon qc-measure`, a project-independent measurement-only path whose
|
|
58
|
+
JSON payload can be imported back through `operon import-qc` (the remote
|
|
59
|
+
built-in QC workflow).
|
|
50
60
|
- `operon/execution.py` — execution backends for external commands:
|
|
51
61
|
`local` subprocess, `slurm` (sbatch submit + squeue poll), and `ssh`
|
|
52
62
|
(Paramiko; HPC head nodes and cloud VMs, optionally through remote
|
|
@@ -96,9 +106,18 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
96
106
|
NCBI Taxonomy snapshots and coverage denominators), `release.py` +
|
|
97
107
|
`export.py` (immutable releases and selective exports), `lifecycle.py`
|
|
98
108
|
(audited reversible entity retirement), `lineage.py` (adopting external
|
|
99
|
-
workflow outputs), `
|
|
109
|
+
workflow outputs), `sequence_tools.py` (alignment-driven domain
|
|
110
|
+
extraction and sequence selection), `classify.py` (versioned
|
|
111
|
+
sequence_classification profiles labelling `sequence_labels`),
|
|
112
|
+
`fanout.py` (data-derived fan-out of registered sequence files into
|
|
113
|
+
per-unit FASTAs under `analysis/derived/`, selected downstream by recipe
|
|
114
|
+
`file_role_prefix`), `timetree.py` (TimeTree query/calibration CLI
|
|
115
|
+
group backed by the query-cache adapter), `backup.py`, `reports.py`,
|
|
116
|
+
`table_import.py`,
|
|
100
117
|
`import_wizard.py`, `entity_view.py`, `environment.py`
|
|
101
|
-
(execution-environment capture
|
|
118
|
+
(execution-environment capture with at-capture redaction; recipe
|
|
119
|
+
`environment_policy` governs environment-aware cache reuse),
|
|
120
|
+
`shutdown.py` (graceful SIGINT/SIGTERM
|
|
102
121
|
handling), `ncbi_reconcile.py` (development-era adapter anomaly repair),
|
|
103
122
|
`demo.py` (deterministic synthetic demo project), `errors.py`,
|
|
104
123
|
`utils.py`.
|
|
@@ -112,6 +131,11 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
112
131
|
(`.readthedocs.yaml`).
|
|
113
132
|
- `benchmarks/` — representative entity sets for QC performance diagnostics
|
|
114
133
|
(see `docs/*/operations/qc-performance.md`).
|
|
134
|
+
- `scripts/` — local developer tooling; `setup-test-matrix.sh` and
|
|
135
|
+
`run-test-matrix.sh` build and drive the uv-managed Python 3.10–3.14
|
|
136
|
+
matrix under .matrix/ (see `docs/*/contributor/development-testing.md`);
|
|
137
|
+
`defects.sh` appends to and queries the defect registry (`defects.yml`,
|
|
138
|
+
see "Defect reports" below).
|
|
115
139
|
|
|
116
140
|
## Setup, test, and build
|
|
117
141
|
|
|
@@ -123,22 +147,48 @@ python3 -m venv .venv && source .venv/bin/activate
|
|
|
123
147
|
python -m pip install -e '.[dev]' # runtime + pytest + Cython + Sphinx;
|
|
124
148
|
# also compiles the qc parsers extension
|
|
125
149
|
|
|
126
|
-
python -m pytest # full suite (coverage gate:
|
|
150
|
+
python -m pytest # full suite (coverage gate: >=95% combined
|
|
151
|
+
# line+branch, and >=95% branch coverage)
|
|
127
152
|
python -m pytest tests/unit # by category: unit / integration /
|
|
128
153
|
# regression / compatibility
|
|
129
154
|
|
|
155
|
+
python -m pytest --lf -q --no-cov # iterate: last failures, no coverage
|
|
156
|
+
python -m pytest -n 4 --dist loadfile # parallel full suite (xdist, in the dev/test extras)
|
|
157
|
+
scripts/run-test-matrix.sh # whole suite on 3.10-3.15 concurrently
|
|
158
|
+
|
|
130
159
|
python setup.py build_ext --inplace # rebuild only the Cython extension
|
|
131
160
|
|
|
132
161
|
sphinx-build -W --keep-going -b html docs docs/_build/html # strict docs build
|
|
133
162
|
```
|
|
134
163
|
|
|
135
164
|
Run the relevant test category after any change; run the full suite before
|
|
136
|
-
considering work done.
|
|
137
|
-
|
|
138
|
-
|
|
165
|
+
considering work done.
|
|
166
|
+
|
|
167
|
+
CI (`.github/workflows/test.yml`) runs pytest on Python 3.10–3.15 and the strict
|
|
168
|
+
Sphinx build. Releases are published exclusively to PyPI; see `docs/*/contributor/pypi-release.md`.
|
|
169
|
+
|
|
170
|
+
The project uses `pytest-xdist` to parallel testing. Avoid sharing state between tests
|
|
171
|
+
to prevent unexpected or random test results.
|
|
172
|
+
|
|
173
|
+
> Running `python -m pytest` directly takes approx 35 seconds
|
|
174
|
+
> (auto: 24 workers). Running the local test matrix takes 3 minutes
|
|
175
|
+
> (6 jobs × 4 workers), or 4~5min (6 jobs × 2 workers in default).
|
|
176
|
+
>
|
|
177
|
+
> Measured on Intel Core i7-13700HX (16c24t).
|
|
178
|
+
|
|
179
|
+
## Git
|
|
139
180
|
|
|
140
|
-
|
|
141
|
-
|
|
181
|
+
If the user requests or grants permission, do `git commit` after modify.
|
|
182
|
+
Avoid including overly large changes in a single commit. For commit messages,
|
|
183
|
+
follow the pattern used in the last five commits; otherwise, the Conventional
|
|
184
|
+
Commits guidelines.
|
|
185
|
+
|
|
186
|
+
**DO NOT** push any commit or tag unless the user **explicitly** requests that.
|
|
187
|
+
|
|
188
|
+
If times out, assume the user is not present and that a GPG signature
|
|
189
|
+
is required. Add `-c commit.gpgsign=false` behind `git` may help (However,
|
|
190
|
+
re-signing will reset the commit hash, and corrupt the defects.yml. Please
|
|
191
|
+
proceed with caution).
|
|
142
192
|
|
|
143
193
|
## Conventions
|
|
144
194
|
|
|
@@ -170,6 +220,27 @@ asks.
|
|
|
170
220
|
exists only for pre-1.0 databases and is scheduled for removal at the 1.0
|
|
171
221
|
release; check it before touching `operon/database.py` migrations or the
|
|
172
222
|
NCBI adapter's schema-upgrade path.
|
|
223
|
+
- The `operon.qc` module uses CFFI (specifically, Cython), so static analysis
|
|
224
|
+
tools, such as `flake8`, will report "undefined reference" errors (F821).
|
|
225
|
+
Using `# noqa: F821` behind the line **ONLY** when importing `operon.qc`
|
|
226
|
+
and an F821 error is likely to occur. Globally ignoring F821 is **STRICKLY
|
|
227
|
+
PROHIBITED**.
|
|
228
|
+
|
|
229
|
+
## Defect reports
|
|
230
|
+
|
|
231
|
+
Confirmed defects are tracked in the machine-readable registry
|
|
232
|
+
`defects.yml` at the repository root (plus any `defects/*.yml` shards;
|
|
233
|
+
`scripts/defects.sh` appends and queries records). The full process is in
|
|
234
|
+
`docs/*/contributor/defect-tracking.md`; the binding rules are:
|
|
235
|
+
|
|
236
|
+
1. **Register first.** When an audit or investigation confirms a defect,
|
|
237
|
+
append its `ODR-XXXX` record to `defects.yml` before the fix lands.
|
|
238
|
+
2. **One commit per defect.** The fix and its regression tests ride in the
|
|
239
|
+
same commit; fill in `fix_commit` when committing.
|
|
240
|
+
3. **Close the test loop.** Regression tests for a defect carry
|
|
241
|
+
`@pytest.mark.bug("ODR-XXXX")`, and every `fixed`/`verified` record
|
|
242
|
+
lists at least one such test; `tests/unit/test_defect_registry.py`
|
|
243
|
+
validates the registry schema and both directions of this closure.
|
|
173
244
|
|
|
174
245
|
## Documentation sync
|
|
175
246
|
|
|
@@ -186,7 +257,7 @@ change:
|
|
|
186
257
|
- Contributor-facing processes → `docs/*/contributor/`; navigation →
|
|
187
258
|
`docs/*/index.md`
|
|
188
259
|
|
|
189
|
-
Version markers in docs (`operon` 0.
|
|
260
|
+
Version markers in docs (`operon` 0.8.2, database schema 2.11, metadata
|
|
190
261
|
schema 1.4) must match `pyproject.toml` and the code. Do not write the
|
|
191
262
|
current values literally in Markdown sources: use the `myst_substitutions`
|
|
192
263
|
references `{{ operon_version }}`, `{{ db_schema }}`, and
|
|
@@ -203,6 +274,9 @@ Sphinx-rendered); update the list above when bumping.
|
|
|
203
274
|
|
|
204
275
|
## Special Note For Codex/ChatGPT
|
|
205
276
|
|
|
206
|
-
Due to specific limitations of the sandbox environment, executing certain TUI
|
|
277
|
+
Due to specific limitations of the sandbox environment, executing certain TUI
|
|
278
|
+
test code may cause the system to freeze; this often occurs on Codex/ChatGPT.
|
|
279
|
+
The specific reason is that when this test code runs in the sandbox, it may
|
|
280
|
+
result a Textual/asyncio cleanup block, and reports "FAIL" due to timeout.
|
|
207
281
|
|
|
208
282
|
If you are Codex/ChatGPT, please execute TUI-related test code OUTSIDE the sandbox.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OperonDBS
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.2
|
|
4
4
|
Summary: Operon the Database System: Archive, Quality-Control, Organize, Analyze and Release Your Bio-Data
|
|
5
5
|
Author-email: hyli360 <lihuanyu2003@gmail.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -8,30 +8,26 @@ Project-URL: Repository, https://github.com/HYLi360/Operon
|
|
|
8
8
|
Project-URL: Issues, https://github.com/HYLi360/Operon/issues
|
|
9
9
|
Classifier: Operating System :: MacOS
|
|
10
10
|
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
12
|
Requires-Python: >=3.10
|
|
18
13
|
Description-Content-Type: text/markdown
|
|
19
14
|
License-File: LICENSE
|
|
20
15
|
Requires-Dist: aiohttp>=3.9
|
|
21
16
|
Requires-Dist: biopython>=1.85
|
|
22
|
-
Requires-Dist: PyYAML>=6.0
|
|
23
17
|
Requires-Dist: paramiko>=3.4
|
|
18
|
+
Requires-Dist: PyYAML>=6.0
|
|
24
19
|
Requires-Dist: questionary>=2.1
|
|
25
20
|
Requires-Dist: requests>=2.32
|
|
26
21
|
Requires-Dist: textual>=8.0
|
|
27
22
|
Provides-Extra: test
|
|
28
23
|
Requires-Dist: coverage>=7.0; extra == "test"
|
|
24
|
+
Requires-Dist: cython>=3.0; extra == "test"
|
|
29
25
|
Requires-Dist: paramiko>=3.4; extra == "test"
|
|
30
|
-
Requires-Dist: pytest-cov>=7.0; extra == "test"
|
|
31
26
|
Requires-Dist: pytest>=8.0; extra == "test"
|
|
27
|
+
Requires-Dist: pytest-cov>=7.0; extra == "test"
|
|
28
|
+
Requires-Dist: pytest-xdist>=3.8; extra == "test"
|
|
32
29
|
Requires-Dist: setuptools>=77; extra == "test"
|
|
33
30
|
Requires-Dist: textual>=8.0; extra == "test"
|
|
34
|
-
Requires-Dist: cython>=3.0; extra == "test"
|
|
35
31
|
Provides-Extra: docs
|
|
36
32
|
Requires-Dist: Sphinx<9,>=7.4; extra == "docs"
|
|
37
33
|
Requires-Dist: myst-parser<5,>=4.0; extra == "docs"
|
|
@@ -40,17 +36,24 @@ Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "docs"
|
|
|
40
36
|
Provides-Extra: dev
|
|
41
37
|
Requires-Dist: coverage>=7.0; extra == "dev"
|
|
42
38
|
Requires-Dist: cython>=3.0; extra == "dev"
|
|
43
|
-
Requires-Dist: pytest-cov>=7.0; extra == "dev"
|
|
44
39
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
40
|
+
Requires-Dist: pytest-cov>=7.0; extra == "dev"
|
|
41
|
+
Requires-Dist: pytest-xdist>=3.8; extra == "dev"
|
|
42
|
+
Requires-Dist: setuptools>=77; extra == "dev"
|
|
45
43
|
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
|
|
46
44
|
Requires-Dist: Sphinx<9,>=7.4; extra == "dev"
|
|
47
45
|
Requires-Dist: myst-parser<5,>=4.0; extra == "dev"
|
|
48
46
|
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "dev"
|
|
49
47
|
Dynamic: license-file
|
|
50
48
|
|
|
51
|
-
# Operon
|
|
49
|
+
# Operon the Database System
|
|
52
50
|
|
|
53
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
51
|
+
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
52
|
+
[](https://operonproject.readthedocs.io/)
|
|
53
|
+

|
|
54
|
+

|
|
55
|
+
[](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
|
56
|
+
[](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
|
|
54
57
|
|
|
55
58
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
56
59
|
|
|
@@ -33,6 +33,7 @@ docs/en/architecture/overview.md
|
|
|
33
33
|
docs/en/architecture/qc-and-rules.md
|
|
34
34
|
docs/en/architecture/release-lifecycle.md
|
|
35
35
|
docs/en/architecture/taxonomy-coverage.md
|
|
36
|
+
docs/en/contributor/defect-tracking.md
|
|
36
37
|
docs/en/contributor/development-testing.md
|
|
37
38
|
docs/en/contributor/documentation-deployment.md
|
|
38
39
|
docs/en/contributor/index.md
|
|
@@ -50,8 +51,10 @@ docs/en/guides/file-archiving.md
|
|
|
50
51
|
docs/en/guides/index.md
|
|
51
52
|
docs/en/guides/metadata-import.md
|
|
52
53
|
docs/en/guides/ncbi-datasets.md
|
|
54
|
+
docs/en/guides/phylogenetics-workflow.md
|
|
53
55
|
docs/en/guides/qc-profiles.md
|
|
54
56
|
docs/en/guides/remote-execution.md
|
|
57
|
+
docs/en/guides/remote-first.md
|
|
55
58
|
docs/en/guides/remote-storage.md
|
|
56
59
|
docs/en/guides/taxonomy-coverage.md
|
|
57
60
|
docs/en/guides/troubleshooting.md
|
|
@@ -73,6 +76,7 @@ docs/en/reference/index.md
|
|
|
73
76
|
docs/en/reference/recipe-fields.md
|
|
74
77
|
docs/en/reference/recipe-overview.md
|
|
75
78
|
docs/en/reference/recipe-parsers-examples.md
|
|
79
|
+
docs/en/reference/resolved-issues.md
|
|
76
80
|
docs/zh/index.md
|
|
77
81
|
docs/zh/overview.md
|
|
78
82
|
docs/zh/architecture/extensibility.md
|
|
@@ -84,6 +88,7 @@ docs/zh/architecture/overview.md
|
|
|
84
88
|
docs/zh/architecture/qc-and-rules.md
|
|
85
89
|
docs/zh/architecture/release-lifecycle.md
|
|
86
90
|
docs/zh/architecture/taxonomy-coverage.md
|
|
91
|
+
docs/zh/contributor/defect-tracking.md
|
|
87
92
|
docs/zh/contributor/development-testing.md
|
|
88
93
|
docs/zh/contributor/documentation-deployment.md
|
|
89
94
|
docs/zh/contributor/index.md
|
|
@@ -101,8 +106,10 @@ docs/zh/guides/file-archiving.md
|
|
|
101
106
|
docs/zh/guides/index.md
|
|
102
107
|
docs/zh/guides/metadata-import.md
|
|
103
108
|
docs/zh/guides/ncbi-datasets.md
|
|
109
|
+
docs/zh/guides/phylogenetics-workflow.md
|
|
104
110
|
docs/zh/guides/qc-profiles.md
|
|
105
111
|
docs/zh/guides/remote-execution.md
|
|
112
|
+
docs/zh/guides/remote-first.md
|
|
106
113
|
docs/zh/guides/remote-storage.md
|
|
107
114
|
docs/zh/guides/taxonomy-coverage.md
|
|
108
115
|
docs/zh/guides/troubleshooting.md
|
|
@@ -124,9 +131,11 @@ docs/zh/reference/index.md
|
|
|
124
131
|
docs/zh/reference/recipe-fields.md
|
|
125
132
|
docs/zh/reference/recipe-overview.md
|
|
126
133
|
docs/zh/reference/recipe-parsers-examples.md
|
|
134
|
+
docs/zh/reference/resolved-issues.md
|
|
127
135
|
operon/__init__.py
|
|
128
136
|
operon/__main__.py
|
|
129
137
|
operon/backup.py
|
|
138
|
+
operon/classify.py
|
|
130
139
|
operon/cli.py
|
|
131
140
|
operon/config.py
|
|
132
141
|
operon/coverage.py
|
|
@@ -134,9 +143,11 @@ operon/database.py
|
|
|
134
143
|
operon/demo.py
|
|
135
144
|
operon/entity_view.py
|
|
136
145
|
operon/environment.py
|
|
146
|
+
operon/environment_capture.py
|
|
137
147
|
operon/errors.py
|
|
138
148
|
operon/execution.py
|
|
139
149
|
operon/export.py
|
|
150
|
+
operon/fanout.py
|
|
140
151
|
operon/files.py
|
|
141
152
|
operon/import_wizard.py
|
|
142
153
|
operon/lifecycle.py
|
|
@@ -149,17 +160,24 @@ operon/remotes.py
|
|
|
149
160
|
operon/reports.py
|
|
150
161
|
operon/rules.py
|
|
151
162
|
operon/schema.py
|
|
163
|
+
operon/sequence_tools.py
|
|
152
164
|
operon/shutdown.py
|
|
165
|
+
operon/sql.py
|
|
153
166
|
operon/table_import.py
|
|
154
167
|
operon/taxonomy.py
|
|
168
|
+
operon/timetree.py
|
|
155
169
|
operon/tools.py
|
|
156
170
|
operon/utils.py
|
|
157
171
|
operon/workflow.py
|
|
158
172
|
operon/adapters/__init__.py
|
|
159
173
|
operon/adapters/ncbi_datasets.py
|
|
160
|
-
operon/
|
|
161
|
-
operon/
|
|
162
|
-
operon/
|
|
174
|
+
operon/adapters/timetree.py
|
|
175
|
+
operon/qc/__init__.py
|
|
176
|
+
operon/qc/_alignment.pyx
|
|
177
|
+
operon/qc/_parsers.pyx
|
|
178
|
+
operon/qc/alignment.py
|
|
179
|
+
operon/qc/measure.py
|
|
180
|
+
operon/qc/parsers.py
|
|
163
181
|
operon/tui/__init__.py
|
|
164
182
|
operon/tui/actions.py
|
|
165
183
|
operon/tui/app.py
|
|
@@ -186,53 +204,82 @@ tests/helpers.py
|
|
|
186
204
|
tests/compatibility/__init__.py
|
|
187
205
|
tests/compatibility/test_python_support.py
|
|
188
206
|
tests/integration/__init__.py
|
|
207
|
+
tests/integration/test_analysis_array.py
|
|
189
208
|
tests/integration/test_analysis_resume.py
|
|
190
209
|
tests/integration/test_analysis_shutdown.py
|
|
191
210
|
tests/integration/test_analysis_tools.py
|
|
211
|
+
tests/integration/test_classify_sequences.py
|
|
192
212
|
tests/integration/test_execution_backends.py
|
|
213
|
+
tests/integration/test_fanout_analyze.py
|
|
193
214
|
tests/integration/test_lineage_cascade.py
|
|
194
215
|
tests/integration/test_ncbi_datasets_adapter.py
|
|
195
216
|
tests/integration/test_pipeline_and_release.py
|
|
196
217
|
tests/integration/test_python_packaging.py
|
|
218
|
+
tests/integration/test_qc_remote_measure.py
|
|
197
219
|
tests/integration/test_taxonomy_coverage.py
|
|
198
220
|
tests/regression/__init__.py
|
|
199
221
|
tests/regression/test_correctness.py
|
|
222
|
+
tests/regression/test_cython_alignment_parity.py
|
|
200
223
|
tests/regression/test_cython_parser_parity.py
|
|
201
224
|
tests/regression/test_parser_semantics.py
|
|
225
|
+
tests/regression/test_sql_identifier_security.py
|
|
202
226
|
tests/unit/__init__.py
|
|
227
|
+
tests/unit/test_alignment_qc.py
|
|
228
|
+
tests/unit/test_classify.py
|
|
203
229
|
tests/unit/test_cli_edges.py
|
|
204
230
|
tests/unit/test_config_workflow_edges.py
|
|
231
|
+
tests/unit/test_core_coverage_more.py
|
|
205
232
|
tests/unit/test_coverage_edges.py
|
|
206
233
|
tests/unit/test_database_edges_more.py
|
|
234
|
+
tests/unit/test_defect_registry.py
|
|
235
|
+
tests/unit/test_defects_cli.py
|
|
207
236
|
tests/unit/test_docs_versions.py
|
|
208
237
|
tests/unit/test_environment.py
|
|
238
|
+
tests/unit/test_environment_capture.py
|
|
209
239
|
tests/unit/test_execution.py
|
|
210
240
|
tests/unit/test_execution_edges.py
|
|
211
241
|
tests/unit/test_export.py
|
|
242
|
+
tests/unit/test_fanout.py
|
|
212
243
|
tests/unit/test_files_edges.py
|
|
244
|
+
tests/unit/test_follow.py
|
|
213
245
|
tests/unit/test_import_backup_show.py
|
|
214
246
|
tests/unit/test_import_wizard_edges.py
|
|
215
247
|
tests/unit/test_lifecycle.py
|
|
216
248
|
tests/unit/test_lineage.py
|
|
249
|
+
tests/unit/test_misc_coverage_more.py
|
|
250
|
+
tests/unit/test_ncbi_coverage_gaps.py
|
|
217
251
|
tests/unit/test_ncbi_edge_cases.py
|
|
218
252
|
tests/unit/test_ncbi_reconcile_edges.py
|
|
219
253
|
tests/unit/test_parser_edge_paths.py
|
|
220
254
|
tests/unit/test_qc_and_rules.py
|
|
221
255
|
tests/unit/test_qc_edges_more.py
|
|
256
|
+
tests/unit/test_qc_measure.py
|
|
257
|
+
tests/unit/test_qc_remote_only.py
|
|
222
258
|
tests/unit/test_recipe_history.py
|
|
259
|
+
tests/unit/test_remote_taxonomy_more.py
|
|
260
|
+
tests/unit/test_remote_transport_edges.py
|
|
223
261
|
tests/unit/test_remotes.py
|
|
224
262
|
tests/unit/test_remotes_edges.py
|
|
225
263
|
tests/unit/test_rules_schema_edges.py
|
|
264
|
+
tests/unit/test_schema_2_10.py
|
|
265
|
+
tests/unit/test_schema_2_11.py
|
|
226
266
|
tests/unit/test_schema_2_9.py
|
|
227
267
|
tests/unit/test_schema_and_metadata.py
|
|
268
|
+
tests/unit/test_sequence_tools.py
|
|
269
|
+
tests/unit/test_sequences.py
|
|
228
270
|
tests/unit/test_shutdown.py
|
|
229
271
|
tests/unit/test_support_edges.py
|
|
230
272
|
tests/unit/test_table_import_edges.py
|
|
231
273
|
tests/unit/test_taxonomy_edges.py
|
|
274
|
+
tests/unit/test_timetree.py
|
|
275
|
+
tests/unit/test_timetree_snapshots.py
|
|
232
276
|
tests/unit/test_tools_edges.py
|
|
277
|
+
tests/unit/test_tools_execution_more.py
|
|
233
278
|
tests/unit/test_tui.py
|
|
234
279
|
tests/unit/test_tui_config.py
|
|
280
|
+
tests/unit/test_tui_flows_more.py
|
|
235
281
|
tests/unit/test_tui_publish.py
|
|
282
|
+
tests/unit/test_tui_screens_more.py
|
|
236
283
|
tests/unit/test_tui_splash_terminal.py
|
|
237
284
|
tests/unit/test_tui_writes.py
|
|
238
285
|
tests/unit/test_views_release_reports_edges.py
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
aiohttp>=3.9
|
|
2
2
|
biopython>=1.85
|
|
3
|
-
PyYAML>=6.0
|
|
4
3
|
paramiko>=3.4
|
|
4
|
+
PyYAML>=6.0
|
|
5
5
|
questionary>=2.1
|
|
6
6
|
requests>=2.32
|
|
7
7
|
textual>=8.0
|
|
@@ -9,8 +9,10 @@ textual>=8.0
|
|
|
9
9
|
[dev]
|
|
10
10
|
coverage>=7.0
|
|
11
11
|
cython>=3.0
|
|
12
|
-
pytest-cov>=7.0
|
|
13
12
|
pytest>=8.0
|
|
13
|
+
pytest-cov>=7.0
|
|
14
|
+
pytest-xdist>=3.8
|
|
15
|
+
setuptools>=77
|
|
14
16
|
Sphinx<9,>=7.4
|
|
15
17
|
myst-parser<5,>=4.0
|
|
16
18
|
sphinx-rtd-theme<4,>=3.0
|
|
@@ -28,9 +30,10 @@ tomli>=2.0
|
|
|
28
30
|
|
|
29
31
|
[test]
|
|
30
32
|
coverage>=7.0
|
|
33
|
+
cython>=3.0
|
|
31
34
|
paramiko>=3.4
|
|
32
|
-
pytest-cov>=7.0
|
|
33
35
|
pytest>=8.0
|
|
36
|
+
pytest-cov>=7.0
|
|
37
|
+
pytest-xdist>=3.8
|
|
34
38
|
setuptools>=77
|
|
35
39
|
textual>=8.0
|
|
36
|
-
cython>=3.0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OperonDBS
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.8.2
|
|
4
4
|
Summary: Operon the Database System: Archive, Quality-Control, Organize, Analyze and Release Your Bio-Data
|
|
5
5
|
Author-email: hyli360 <lihuanyu2003@gmail.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -8,30 +8,26 @@ Project-URL: Repository, https://github.com/HYLi360/Operon
|
|
|
8
8
|
Project-URL: Issues, https://github.com/HYLi360/Operon/issues
|
|
9
9
|
Classifier: Operating System :: MacOS
|
|
10
10
|
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
-
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.14
|
|
11
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
17
12
|
Requires-Python: >=3.10
|
|
18
13
|
Description-Content-Type: text/markdown
|
|
19
14
|
License-File: LICENSE
|
|
20
15
|
Requires-Dist: aiohttp>=3.9
|
|
21
16
|
Requires-Dist: biopython>=1.85
|
|
22
|
-
Requires-Dist: PyYAML>=6.0
|
|
23
17
|
Requires-Dist: paramiko>=3.4
|
|
18
|
+
Requires-Dist: PyYAML>=6.0
|
|
24
19
|
Requires-Dist: questionary>=2.1
|
|
25
20
|
Requires-Dist: requests>=2.32
|
|
26
21
|
Requires-Dist: textual>=8.0
|
|
27
22
|
Provides-Extra: test
|
|
28
23
|
Requires-Dist: coverage>=7.0; extra == "test"
|
|
24
|
+
Requires-Dist: cython>=3.0; extra == "test"
|
|
29
25
|
Requires-Dist: paramiko>=3.4; extra == "test"
|
|
30
|
-
Requires-Dist: pytest-cov>=7.0; extra == "test"
|
|
31
26
|
Requires-Dist: pytest>=8.0; extra == "test"
|
|
27
|
+
Requires-Dist: pytest-cov>=7.0; extra == "test"
|
|
28
|
+
Requires-Dist: pytest-xdist>=3.8; extra == "test"
|
|
32
29
|
Requires-Dist: setuptools>=77; extra == "test"
|
|
33
30
|
Requires-Dist: textual>=8.0; extra == "test"
|
|
34
|
-
Requires-Dist: cython>=3.0; extra == "test"
|
|
35
31
|
Provides-Extra: docs
|
|
36
32
|
Requires-Dist: Sphinx<9,>=7.4; extra == "docs"
|
|
37
33
|
Requires-Dist: myst-parser<5,>=4.0; extra == "docs"
|
|
@@ -40,17 +36,24 @@ Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "docs"
|
|
|
40
36
|
Provides-Extra: dev
|
|
41
37
|
Requires-Dist: coverage>=7.0; extra == "dev"
|
|
42
38
|
Requires-Dist: cython>=3.0; extra == "dev"
|
|
43
|
-
Requires-Dist: pytest-cov>=7.0; extra == "dev"
|
|
44
39
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
40
|
+
Requires-Dist: pytest-cov>=7.0; extra == "dev"
|
|
41
|
+
Requires-Dist: pytest-xdist>=3.8; extra == "dev"
|
|
42
|
+
Requires-Dist: setuptools>=77; extra == "dev"
|
|
45
43
|
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
|
|
46
44
|
Requires-Dist: Sphinx<9,>=7.4; extra == "dev"
|
|
47
45
|
Requires-Dist: myst-parser<5,>=4.0; extra == "dev"
|
|
48
46
|
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "dev"
|
|
49
47
|
Dynamic: license-file
|
|
50
48
|
|
|
51
|
-
# Operon
|
|
49
|
+
# Operon the Database System
|
|
52
50
|
|
|
53
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
51
|
+
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
52
|
+
[](https://operonproject.readthedocs.io/)
|
|
53
|
+

|
|
54
|
+

|
|
55
|
+
[](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
|
56
|
+
[](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
|
|
54
57
|
|
|
55
58
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
56
59
|
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
# Operon
|
|
2
|
-
|
|
3
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
1
|
+
# Operon the Database System
|
|
2
|
+
|
|
3
|
+
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
4
|
+
[](https://operonproject.readthedocs.io/)
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
[](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade)
|
|
8
|
+
[](https://app.codacy.com/gh/HYLi360/Operon/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage)
|
|
4
9
|
|
|
5
10
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
6
11
|
|