OperonDBS 0.8.0__tar.gz → 0.8.3__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.8.0 → operondbs-0.8.3}/.github/workflows/publish.yml +4 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/.github/workflows/test.yml +12 -9
- {operondbs-0.8.0 → operondbs-0.8.3}/.gitignore +2 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/AGENTS.md +110 -22
- {operondbs-0.8.0 → operondbs-0.8.3}/MANIFEST.in +3 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/PKG-INFO +12 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/SOURCES.txt +29 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/PKG-INFO +12 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/README.md +11 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/README_ZH.md +11 -5
- operondbs-0.8.3/docs/conf_common.py +218 -0
- operondbs-0.8.3/docs/en/.readthedocs.yaml +29 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/external-analysis.md +13 -3
- operondbs-0.8.3/docs/en/conf.py +24 -0
- operondbs-0.8.3/docs/en/contributor/defect-tracking.md +71 -0
- operondbs-0.8.3/docs/en/contributor/development-testing.md +178 -0
- operondbs-0.8.3/docs/en/contributor/documentation-deployment.md +57 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/contributor/index.md +2 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/phylogenetics-workflow.md +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/qc-profiles.md +8 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/remote-execution.md +3 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/behaviors-and-limitations.md +29 -41
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-analysis.md +7 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-decisions-reports.md +4 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-tui.md +111 -21
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/index.md +2 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/recipe-fields.md +21 -2
- operondbs-0.8.3/docs/en/reference/resolved-issues.md +64 -0
- operondbs-0.8.3/docs/locales/README.md +34 -0
- operondbs-0.8.3/docs/zh/.readthedocs.yaml +28 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/external-analysis.md +44 -5
- operondbs-0.8.3/docs/zh/conf.py +23 -0
- operondbs-0.8.3/docs/zh/contributor/defect-tracking.md +55 -0
- operondbs-0.8.3/docs/zh/contributor/development-testing.md +163 -0
- operondbs-0.8.3/docs/zh/contributor/documentation-deployment.md +57 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/contributor/index.md +2 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/phylogenetics-workflow.md +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/qc-profiles.md +15 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/remote-execution.md +11 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/behaviors-and-limitations.md +27 -39
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-analysis.md +20 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-decisions-reports.md +13 -8
- operondbs-0.8.3/docs/zh/reference/cli-tui.md +275 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/index.md +2 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/recipe-fields.md +30 -3
- operondbs-0.8.3/docs/zh/reference/resolved-issues.md +56 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/adapters/ncbi_datasets.py +16 -12
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/adapters/timetree.py +4 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/classify.py +36 -14
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/cli.py +35 -28
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/config.py +2 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/coverage.py +6 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/database.py +53 -38
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/demo.py +4 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/entity_view.py +9 -9
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/environment_capture.py +45 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/execution.py +653 -74
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/export.py +44 -33
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/fanout.py +30 -23
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/files.py +89 -15
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/import_wizard.py +12 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/lifecycle.py +7 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/lineage.py +7 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/__init__.py +21 -18
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/alignment.py +3 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/measure.py +7 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/parsers.py +2 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/release.py +33 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/remotes.py +40 -17
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/reports.py +47 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/rules.py +7 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/schema.py +3 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/sequence_tools.py +3 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/shutdown.py +18 -2
- operondbs-0.8.3/operon/sql.py +18 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/table_import.py +8 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/taxonomy.py +6 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/timetree.py +36 -14
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tools.py +644 -117
- operondbs-0.8.3/operon/tui/actions.py +1225 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/app.py +9 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/app.tcss +179 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/data.py +334 -32
- operondbs-0.8.3/operon/tui/parity.py +716 -0
- operondbs-0.8.3/operon/tui/screens/analyze.py +435 -0
- operondbs-0.8.3/operon/tui/screens/classify.py +102 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/common.py +265 -19
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/config.py +526 -57
- operondbs-0.8.3/operon/tui/screens/config_classification.py +666 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/coverage.py +3 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/decisions.py +2 -3
- operondbs-0.8.3/operon/tui/screens/derived_ops.py +593 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/entities.py +4 -11
- operondbs-0.8.3/operon/tui/screens/environments.py +117 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/files.py +90 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/files_ops.py +55 -14
- operondbs-0.8.3/operon/tui/screens/hits.py +180 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/home.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/import_wizard.py +84 -37
- operondbs-0.8.3/operon/tui/screens/labels.py +103 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/publish.py +13 -12
- operondbs-0.8.3/operon/tui/screens/run_external.py +236 -0
- operondbs-0.8.3/operon/tui/screens/runs.py +633 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/splash.py +7 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/utils.py +3 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/workflow.py +121 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/pyproject.toml +7 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/compatibility/test_python_support.py +0 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/helpers.py +30 -3
- operondbs-0.8.3/tests/integration/test_analysis_array.py +989 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_analysis_resume.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_analysis_shutdown.py +63 -9
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_analysis_tools.py +6 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_classify_sequences.py +46 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_execution_backends.py +1 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_fanout_analyze.py +32 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_lineage_cascade.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_ncbi_datasets_adapter.py +30 -36
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_pipeline_and_release.py +1 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_python_packaging.py +17 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_qc_remote_measure.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_correctness.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_cython_alignment_parity.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_cython_parser_parity.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/test_parser_semantics.py +1 -2
- operondbs-0.8.3/tests/regression/test_sql_identifier_security.py +124 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_alignment_qc.py +4 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_classify.py +35 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_core_coverage_more.py +10 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_database_edges_more.py +24 -0
- operondbs-0.8.3/tests/unit/test_defect_registry.py +121 -0
- operondbs-0.8.3/tests/unit/test_defects_cli.py +149 -0
- operondbs-0.8.3/tests/unit/test_docs_projects.py +188 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_docs_versions.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_environment.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_environment_capture.py +81 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_execution.py +512 -15
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_execution_edges.py +303 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_export.py +62 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_fanout.py +114 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_files_edges.py +187 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_import_backup_show.py +0 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_lifecycle.py +4 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_misc_coverage_more.py +24 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_ncbi_coverage_gaps.py +6 -5
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_parser_edge_paths.py +0 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_and_rules.py +39 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_edges_more.py +2 -3
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_measure.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_qc_remote_only.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remote_taxonomy_more.py +12 -8
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remote_transport_edges.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remotes.py +6 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_remotes_edges.py +10 -11
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_2_10.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_2_11.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_2_9.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_schema_and_metadata.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_sequence_tools.py +1 -4
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_sequences.py +1 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_shutdown.py +42 -7
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_support_edges.py +0 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_timetree_snapshots.py +70 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tools_edges.py +28 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tools_execution_more.py +4 -1
- operondbs-0.8.3/tests/unit/test_tui.py +2250 -0
- operondbs-0.8.3/tests/unit/test_tui_analyze.py +952 -0
- operondbs-0.8.3/tests/unit/test_tui_cli_parity.py +1233 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_config.py +857 -29
- operondbs-0.8.3/tests/unit/test_tui_derived_ops.py +703 -0
- operondbs-0.8.3/tests/unit/test_tui_m3_loop.py +273 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_publish.py +206 -2
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_screens_more.py +7 -6
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_splash_terminal.py +8 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_writes.py +320 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_views_release_reports_edges.py +60 -0
- operondbs-0.8.0/.readthedocs.yaml +0 -15
- operondbs-0.8.0/docs/_static/language-switcher.js +0 -20
- operondbs-0.8.0/docs/_static/operon.css +0 -32
- operondbs-0.8.0/docs/_templates/layout.html +0 -10
- operondbs-0.8.0/docs/conf.py +0 -129
- operondbs-0.8.0/docs/en/contributor/development-testing.md +0 -100
- operondbs-0.8.0/docs/en/contributor/documentation-deployment.md +0 -36
- operondbs-0.8.0/docs/index.md +0 -18
- operondbs-0.8.0/docs/zh/contributor/development-testing.md +0 -107
- operondbs-0.8.0/docs/zh/contributor/documentation-deployment.md +0 -36
- operondbs-0.8.0/docs/zh/reference/cli-tui.md +0 -200
- operondbs-0.8.0/operon/tui/actions.py +0 -620
- operondbs-0.8.0/operon/tui/screens/runs.py +0 -217
- operondbs-0.8.0/tests/unit/test_tui.py +0 -1068
- {operondbs-0.8.0 → operondbs-0.8.3}/LICENSE +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/dependency_links.txt +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/entry_points.txt +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/requires.txt +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/OperonDBS.egg-info/top_level.txt +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/benchmarks/qc_representative_entities.tsv +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/extensibility.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/files-and-storage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/metadata-and-data-model.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/overview.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/qc-and-rules.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/release-lifecycle.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/contributor/pypi-release.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/contributor/repository-guide.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/daily-workflow.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/first-project.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/installation.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/getting-started/quickstart.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/backup-migration.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/curation-lifecycle.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/external-analysis.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/file-archiving.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/metadata-import.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/ncbi-datasets.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/remote-first.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/remote-storage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/guides/troubleshooting.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/database-compatibility.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/ncbi-recovery-migration.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/operations/qc-performance.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/overview.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-files-qc.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-project-metadata.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-remote.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-taxonomy-lifecycle-admin.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/cli-workflow.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/data-model.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/recipe-overview.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/en/reference/recipe-parsers-examples.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/requirements.txt +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/extensibility.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/files-and-storage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/metadata-and-data-model.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/overview.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/qc-and-rules.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/release-lifecycle.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/contributor/pypi-release.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/contributor/repository-guide.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/daily-workflow.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/first-project.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/installation.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/getting-started/quickstart.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/backup-migration.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/curation-lifecycle.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/external-analysis.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/file-archiving.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/metadata-import.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/ncbi-datasets.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/remote-first.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/remote-storage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/guides/troubleshooting.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/database-compatibility.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/index.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/ncbi-recovery-migration.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/operations/qc-performance.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/overview.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-files-qc.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-project-metadata.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-remote.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-taxonomy-lifecycle-admin.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/cli-workflow.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/data-model.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/recipe-overview.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/docs/zh/reference/recipe-parsers-examples.md +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/__main__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/adapters/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/backup.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/environment.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/errors.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/metadata_files.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/ncbi_reconcile.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/profiles.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/_alignment.pyx +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/qc/_parsers.pyx +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/assets/splash.png +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/assets/splash.rgb.z +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/screens/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/operon/tui/splash_terminal.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/setup.cfg +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/setup.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/compatibility/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/integration/test_taxonomy_coverage.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/regression/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/__init__.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_cli_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_config_workflow_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_coverage_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_follow.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_import_wizard_edges.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_lineage.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_ncbi_edge_cases.py +1 -1
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_ncbi_reconcile_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_recipe_history.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_rules_schema_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_table_import_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_taxonomy_edges.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_timetree.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_tui_flows_more.py +0 -0
- {operondbs-0.8.0 → operondbs-0.8.3}/tests/unit/test_workflow_cli.py +0 -0
|
@@ -43,7 +43,9 @@ jobs:
|
|
|
43
43
|
python-version: "3.12"
|
|
44
44
|
- run: python -m pip install --upgrade pip
|
|
45
45
|
- run: python -m pip install -e '.[docs]'
|
|
46
|
-
- run:
|
|
46
|
+
- run: |
|
|
47
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
48
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
47
49
|
|
|
48
50
|
wheels:
|
|
49
51
|
strategy:
|
|
@@ -71,7 +73,7 @@ jobs:
|
|
|
71
73
|
- run: python -m cibuildwheel --output-dir wheelhouse
|
|
72
74
|
env:
|
|
73
75
|
CIBW_ARCHS: ${{ matrix.architecture }}
|
|
74
|
-
CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-*"
|
|
76
|
+
CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-* cp315-*"
|
|
75
77
|
CIBW_SKIP: "*-musllinux_*"
|
|
76
78
|
CIBW_TEST_COMMAND: >-
|
|
77
79
|
python -c "import operon; import operon.qc._parsers;
|
|
@@ -25,27 +25,30 @@ jobs:
|
|
|
25
25
|
cache-dependency-path: pyproject.toml
|
|
26
26
|
- run: python -m pip install --upgrade pip
|
|
27
27
|
- run: python -m pip install -e '.[docs]'
|
|
28
|
-
- run:
|
|
28
|
+
- run: |
|
|
29
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
30
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
29
31
|
|
|
30
32
|
pytest:
|
|
31
33
|
strategy:
|
|
32
34
|
fail-fast: false
|
|
33
35
|
matrix:
|
|
34
36
|
os: [ ubuntu-latest, macos-latest ]
|
|
35
|
-
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
|
|
37
|
+
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]
|
|
36
38
|
runs-on: ${{ matrix.os }}
|
|
37
39
|
steps:
|
|
38
40
|
- uses: actions/checkout@v6
|
|
39
41
|
- uses: actions/setup-python@v7
|
|
40
42
|
with:
|
|
43
|
+
allow-prereleases: true
|
|
44
|
+
check-latest: true
|
|
41
45
|
python-version: ${{ matrix.python-version }}
|
|
42
46
|
cache: pip
|
|
43
47
|
cache-dependency-path: pyproject.toml
|
|
44
|
-
- run:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
- run: |
|
|
49
|
+
python -m pip install --upgrade pip
|
|
50
|
+
python -m pip install -e '.[test]'
|
|
51
|
+
python -m pytest
|
|
52
|
+
- uses: codacy/codacy-coverage-reporter-action@v1.3.0
|
|
49
53
|
with:
|
|
50
|
-
token: ${{ secrets.
|
|
51
|
-
report_type: test_results
|
|
54
|
+
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
|
|
@@ -26,7 +26,7 @@ principle-to-implementation mapping.
|
|
|
26
26
|
|
|
27
27
|
Current version markers (must stay consistent across code and docs):
|
|
28
28
|
|
|
29
|
-
- `operon` 0.8.
|
|
29
|
+
- `operon` 0.8.3 (`pyproject.toml`)
|
|
30
30
|
- database schema 2.11 (`operon/database.py`, `SCHEMA_VERSION`)
|
|
31
31
|
- metadata schema 1.4 (`operon/schema.py`, `METADATA_SCHEMA_VERSION`)
|
|
32
32
|
|
|
@@ -83,17 +83,48 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
83
83
|
Confirm → background worker → notify + reload or inline error. Phase 3
|
|
84
84
|
actions in the same module: `import_dataset` (commits wizard drafts
|
|
85
85
|
through the shared single-transaction `import_wizard._commit`),
|
|
86
|
-
`reserve_entity_ids`, `create_release`, `export`,
|
|
86
|
+
`reserve_entity_ids`, `create_release`, `export`, `run_coverage`
|
|
87
87
|
(a below-threshold coverage report returns `exit_code=1` in the result
|
|
88
|
-
dict — a warning, not an exception)
|
|
88
|
+
dict — a warning, not an exception), `preflight_backend`, `run_analysis`
|
|
89
|
+
(backing the AnalyzeModal launched from the Config screen's Run analysis
|
|
90
|
+
button or the Tasks screen's New analysis button; the modal mirrors
|
|
91
|
+
`--backend` — project default / local / slurm / ssh — and preflights the
|
|
92
|
+
selection inline, and cancellation sets the core's cooperative
|
|
93
|
+
`cancel_event`, so a queued Slurm job or array is cancelled with one
|
|
94
|
+
`scancel`), `run_external` (backing the Tasks screen's Run external
|
|
95
|
+
dialog, which mirrors `run-external` field by field and opens the run
|
|
96
|
+
record when it finishes) and `write_analysis_report` (backing the
|
|
97
|
+
Analysis hits browser's Export button: it runs the same read-only query
|
|
98
|
+
and the same renderer as `report analysis --hits --format … --out …`, so
|
|
99
|
+
the file is byte-identical and, like that command, writes no provenance
|
|
100
|
+
rows). Phase 3 also covers the
|
|
101
|
+
derived-artifact loop: `run_classify` (the Config screen's Run classify
|
|
102
|
+
dialog, mirroring `classify-sequences` with the CLI's summary and a re-run
|
|
103
|
+
button), and — on the Files screen — `extract_domains`, `select_sequences`,
|
|
104
|
+
`adopt` and `fanout` (modals in `operon/tui/screens/derived_ops.py`:
|
|
105
|
+
extract/select chain into the adopt dialog with `derived_from` prefilled and
|
|
106
|
+
leave their output unregistered, adopt's manifest mode previews before
|
|
107
|
+
Confirm, and fanout's dry run is a mandatory preflight). Read-only TUI views added for `report analysis --hits` (alignment
|
|
108
|
+
hits with the CLI's filters and columns) and for `sequence_labels` (the
|
|
109
|
+
classify-sequences output: a per-file section in the Files detail plus
|
|
110
|
+
the project-wide label summary behind the Files screen's `l` binding), which
|
|
111
|
+
has no CLI reader at all. The
|
|
89
112
|
Config screen (`operon/tui/screens/config.py`, nav key `6`) edits
|
|
90
|
-
`config/profiles/*.yaml` (kind `qc`
|
|
113
|
+
`config/profiles/*.yaml` (kind `qc` and kind `sequence_classification` —
|
|
114
|
+
each kind has its own form, dispatched by the document's own kind, with the
|
|
115
|
+
classification widgets in `operon/tui/screens/config_classification.py`
|
|
116
|
+
and `actions.save_classification_profile` sharing `save_profile`'s version,
|
|
117
|
+
snapshot and rollback machinery; a profile whose conditions nest deeper
|
|
118
|
+
than one `any:`/`not:` level opens read-only) and single recipes inside
|
|
91
119
|
`config/tools.yaml` through structured control-based forms (no free-text
|
|
92
120
|
YAML): every save bumps the `version`, records the same content-addressed
|
|
93
121
|
snapshot the CLI records (`qc_profiles` / `recipe_snapshots`), and
|
|
94
122
|
restores the previous file bytes on failure; keys the forms do not model
|
|
95
123
|
are preserved verbatim; history modals restore snapshots into the editor
|
|
96
124
|
as the next version; tools-check runs in a worker with per-row updates.
|
|
125
|
+
`operon/tui/parity.py` is the CLI/TUI parity registry: every CLI leaf
|
|
126
|
+
command is registered `implemented`/`cli-only`/`planned`, enforced by
|
|
127
|
+
`tests/unit/test_tui_cli_parity.py` (see Conventions).
|
|
97
128
|
Textual is imported only inside this package, which the `tui` command
|
|
98
129
|
handler imports lazily.
|
|
99
130
|
- Other top-level modules by responsibility: `database.py` (SQLite schema
|
|
@@ -127,13 +158,23 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
127
158
|
- `docs/` — Sphinx documentation in two mirrored language trees, `docs/en/`
|
|
128
159
|
and `docs/zh/`, each split into `overview.md`, `getting-started/`,
|
|
129
160
|
`guides/`, `architecture/`, `reference/`, `operations/`, and
|
|
130
|
-
`contributor/`.
|
|
131
|
-
(
|
|
161
|
+
`contributor/`. Each tree is a Sphinx project of its own
|
|
162
|
+
(`docs/<language>/conf.py`, sharing settings from `docs/conf_common.py`) and
|
|
163
|
+
a Read the Docs project of its own, linked there as parent and translation:
|
|
164
|
+
`operonproject` (English) and `operonproject-zh` (Chinese). Read the Docs
|
|
165
|
+
accepts no build-configuration file name other than `.readthedocs.yaml`, so
|
|
166
|
+
each tree carries one next to its `conf.py`
|
|
167
|
+
(`docs/<language>/.readthedocs.yaml`) and the dashboard points the project at
|
|
168
|
+
that path. `docs/locales/` is the catalog directory
|
|
169
|
+
for a future gettext-maintained language; `tests/unit/test_docs_projects.py`
|
|
170
|
+
guards the layout.
|
|
132
171
|
- `benchmarks/` — representative entity sets for QC performance diagnostics
|
|
133
172
|
(see `docs/*/operations/qc-performance.md`).
|
|
134
173
|
- `scripts/` — local developer tooling; `setup-test-matrix.sh` and
|
|
135
174
|
`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`)
|
|
175
|
+
matrix under .matrix/ (see `docs/*/contributor/development-testing.md`);
|
|
176
|
+
`defects.sh` appends to and queries the defect registry (`defects.yml`,
|
|
177
|
+
see "Defect reports" below).
|
|
137
178
|
|
|
138
179
|
## Setup, test, and build
|
|
139
180
|
|
|
@@ -152,20 +193,42 @@ python -m pytest tests/unit # by category: unit / integration /
|
|
|
152
193
|
|
|
153
194
|
python -m pytest --lf -q --no-cov # iterate: last failures, no coverage
|
|
154
195
|
python -m pytest -n 4 --dist loadfile # parallel full suite (xdist, in the dev/test extras)
|
|
155
|
-
scripts/run-test-matrix.sh # whole suite on 3.10-3.
|
|
196
|
+
scripts/run-test-matrix.sh # whole suite on 3.10-3.15 concurrently
|
|
156
197
|
|
|
157
198
|
python setup.py build_ext --inplace # rebuild only the Cython extension
|
|
158
199
|
|
|
159
|
-
sphinx-build -W --keep-going -b html docs docs/_build/html # strict
|
|
200
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html # strict build,
|
|
201
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html # one per language
|
|
160
202
|
```
|
|
161
203
|
|
|
162
204
|
Run the relevant test category after any change; run the full suite before
|
|
163
|
-
considering work done.
|
|
164
|
-
Python 3.10–3.14 and the strict Sphinx build. Releases are published
|
|
165
|
-
exclusively to PyPI; see `docs/*/contributor/pypi-release.md`.
|
|
205
|
+
considering work done.
|
|
166
206
|
|
|
167
|
-
|
|
168
|
-
|
|
207
|
+
CI (`.github/workflows/test.yml`) runs pytest on Python 3.10–3.15 and the strict
|
|
208
|
+
Sphinx build. Releases are published exclusively to PyPI; see `docs/*/contributor/pypi-release.md`.
|
|
209
|
+
|
|
210
|
+
The project uses `pytest-xdist` to parallel testing. Avoid sharing state between tests
|
|
211
|
+
to prevent unexpected or random test results.
|
|
212
|
+
|
|
213
|
+
> Running `python -m pytest` directly takes approx 35 seconds
|
|
214
|
+
> (auto: 24 workers). Running the local test matrix takes 3 minutes
|
|
215
|
+
> (6 jobs × 4 workers), or 4~5min (6 jobs × 2 workers in default).
|
|
216
|
+
>
|
|
217
|
+
> Measured on Intel Core i7-13700HX (16c24t).
|
|
218
|
+
|
|
219
|
+
## Git
|
|
220
|
+
|
|
221
|
+
If the user requests or grants permission, do `git commit` after modify.
|
|
222
|
+
Avoid including overly large changes in a single commit. For commit messages,
|
|
223
|
+
follow the pattern used in the last five commits; otherwise, the Conventional
|
|
224
|
+
Commits guidelines.
|
|
225
|
+
|
|
226
|
+
**DO NOT** push any commit or tag unless the user **explicitly** requests that.
|
|
227
|
+
|
|
228
|
+
If times out, assume the user is not present and that a GPG signature
|
|
229
|
+
is required. Add `-c commit.gpgsign=false` behind `git` may help (However,
|
|
230
|
+
re-signing will reset the commit hash, and corrupt the defects.yml. Please
|
|
231
|
+
proceed with caution).
|
|
169
232
|
|
|
170
233
|
## Conventions
|
|
171
234
|
|
|
@@ -193,15 +256,34 @@ asks.
|
|
|
193
256
|
bytes must raise `ConflictError`; identical bytes must be idempotent.
|
|
194
257
|
- Manual overrides (e.g. `curate`, forced `set-state`) must always be
|
|
195
258
|
recorded in the `changes` audit table.
|
|
259
|
+
- CLI-first: new capabilities land in the CLI/core first, and the TUI never
|
|
260
|
+
runs ahead of the CLI. Any change to CLI commands, flags, or the TUI
|
|
261
|
+
surface must update the parity registry `operon/tui/parity.py` in the same
|
|
262
|
+
commit — the parity tests in `tests/unit/test_tui_cli_parity.py` fail
|
|
263
|
+
otherwise. Commands intentionally not offered in the TUI are registered
|
|
264
|
+
`cli-only` with a reason; known gaps are registered `planned` with a
|
|
265
|
+
milestone.
|
|
196
266
|
- `docs/*/operations/database-compatibility.md` lists migration code that
|
|
197
267
|
exists only for pre-1.0 databases and is scheduled for removal at the 1.0
|
|
198
268
|
release; check it before touching `operon/database.py` migrations or the
|
|
199
269
|
NCBI adapter's schema-upgrade path.
|
|
200
|
-
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
270
|
+
- Using `ruff` to re-format the code.
|
|
271
|
+
|
|
272
|
+
## Defect reports
|
|
273
|
+
|
|
274
|
+
Confirmed defects are tracked in the machine-readable registry
|
|
275
|
+
`defects.yml` at the repository root (plus any `defects/*.yml` shards;
|
|
276
|
+
`scripts/defects.sh` appends and queries records). The full process is in
|
|
277
|
+
`docs/*/contributor/defect-tracking.md`; the binding rules are:
|
|
278
|
+
|
|
279
|
+
1. **Register first.** When an audit or investigation confirms a defect,
|
|
280
|
+
append its `ODR-XXXX` record to `defects.yml` before the fix lands.
|
|
281
|
+
2. **One commit per defect.** The fix and its regression tests ride in the
|
|
282
|
+
same commit; fill in `fix_commit` when committing.
|
|
283
|
+
3. **Close the test loop.** Regression tests for a defect carry
|
|
284
|
+
`@pytest.mark.bug("ODR-XXXX")`, and every `fixed`/`verified` record
|
|
285
|
+
lists at least one such test; `tests/unit/test_defect_registry.py`
|
|
286
|
+
validates the registry schema and both directions of this closure.
|
|
205
287
|
|
|
206
288
|
## Documentation sync
|
|
207
289
|
|
|
@@ -217,12 +299,15 @@ change:
|
|
|
217
299
|
`docs/*/operations/`
|
|
218
300
|
- Contributor-facing processes → `docs/*/contributor/`; navigation →
|
|
219
301
|
`docs/*/index.md`
|
|
302
|
+
- The set of language projects → `docs/<language>/conf.py`, its
|
|
303
|
+
`docs/<language>/.readthedocs.yaml`, and the registry in
|
|
304
|
+
`tests/unit/test_docs_projects.py`
|
|
220
305
|
|
|
221
|
-
Version markers in docs (`operon` 0.8.
|
|
306
|
+
Version markers in docs (`operon` 0.8.3, database schema 2.11, metadata
|
|
222
307
|
schema 1.4) must match `pyproject.toml` and the code. Do not write the
|
|
223
308
|
current values literally in Markdown sources: use the `myst_substitutions`
|
|
224
309
|
references `{{ operon_version }}`, `{{ db_schema }}`, and
|
|
225
|
-
`{{ metadata_schema }}`, which `docs/
|
|
310
|
+
`{{ metadata_schema }}`, which `docs/conf_common.py` resolves from the single
|
|
226
311
|
sources above at build time. Substitutions expand in paragraph text only,
|
|
227
312
|
never inside code spans or fenced code blocks — examples there use
|
|
228
313
|
`<version>` placeholders instead. Intentional historical pins stay literal — either on the
|
|
@@ -235,6 +320,9 @@ Sphinx-rendered); update the list above when bumping.
|
|
|
235
320
|
|
|
236
321
|
## Special Note For Codex/ChatGPT
|
|
237
322
|
|
|
238
|
-
Due to specific limitations of the sandbox environment, executing certain TUI
|
|
323
|
+
Due to specific limitations of the sandbox environment, executing certain TUI
|
|
324
|
+
test code may cause the system to freeze; this often occurs on Codex/ChatGPT.
|
|
325
|
+
The specific reason is that when this test code runs in the sandbox, it may
|
|
326
|
+
result a Textual/asyncio cleanup block, and reports "FAIL" due to timeout.
|
|
239
327
|
|
|
240
328
|
If you are Codex/ChatGPT, please execute TUI-related test code OUTSIDE the sandbox.
|
|
@@ -4,12 +4,13 @@ include LICENSE
|
|
|
4
4
|
include MANIFEST.in
|
|
5
5
|
include README.md
|
|
6
6
|
include README_ZH.md
|
|
7
|
-
include
|
|
7
|
+
include docs/en/.readthedocs.yaml
|
|
8
|
+
include docs/zh/.readthedocs.yaml
|
|
8
9
|
include pyproject.toml
|
|
9
10
|
include setup.py
|
|
10
11
|
recursive-include .github *.yml
|
|
11
12
|
recursive-include benchmarks *.tsv
|
|
12
|
-
recursive-include docs *.css *.html *.js *.md *.py *.txt
|
|
13
|
+
recursive-include docs *.css *.html *.js *.md *.po *.py *.txt
|
|
13
14
|
prune docs/_build
|
|
14
15
|
recursive-include operon *.py *.pyx *.tcss
|
|
15
16
|
recursive-include operon/tui/assets *.png *.z *.md
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OperonDBS
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.3
|
|
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
|
|
@@ -46,9 +46,14 @@ Requires-Dist: myst-parser<5,>=4.0; extra == "dev"
|
|
|
46
46
|
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "dev"
|
|
47
47
|
Dynamic: license-file
|
|
48
48
|
|
|
49
|
-
# Operon
|
|
49
|
+
# Operon the Database System
|
|
50
50
|
|
|
51
|
-
[](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)
|
|
52
57
|
|
|
53
58
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
54
59
|
|
|
@@ -88,11 +93,12 @@ python -m pip install -e '.[dev]'
|
|
|
88
93
|
|
|
89
94
|
## Documentation
|
|
90
95
|
|
|
91
|
-
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md).
|
|
96
|
+
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). Each language is its own Sphinx project; build both without warnings:
|
|
92
97
|
|
|
93
98
|
```bash
|
|
94
99
|
python -m pip install -e '.[docs]'
|
|
95
|
-
sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
100
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
101
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
96
102
|
```
|
|
97
103
|
|
|
98
|
-
Read the Docs
|
|
104
|
+
Read the Docs publishes two projects linked as parent and translation: `operonproject` (English, `https://operonproject.readthedocs.io/en/latest/`) and `operonproject-zh` (Chinese, `https://operonproject.readthedocs.io/zh-cn/latest/`), each built from its own `docs/<language>/.readthedocs.yaml`.
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
.gitignore
|
|
2
|
-
.readthedocs.yaml
|
|
3
2
|
AGENTS.md
|
|
4
3
|
LICENSE
|
|
5
4
|
MANIFEST.in
|
|
@@ -16,12 +15,10 @@ OperonDBS.egg-info/entry_points.txt
|
|
|
16
15
|
OperonDBS.egg-info/requires.txt
|
|
17
16
|
OperonDBS.egg-info/top_level.txt
|
|
18
17
|
benchmarks/qc_representative_entities.tsv
|
|
19
|
-
docs/
|
|
20
|
-
docs/index.md
|
|
18
|
+
docs/conf_common.py
|
|
21
19
|
docs/requirements.txt
|
|
22
|
-
docs/
|
|
23
|
-
docs/
|
|
24
|
-
docs/_templates/layout.html
|
|
20
|
+
docs/en/.readthedocs.yaml
|
|
21
|
+
docs/en/conf.py
|
|
25
22
|
docs/en/index.md
|
|
26
23
|
docs/en/overview.md
|
|
27
24
|
docs/en/architecture/extensibility.md
|
|
@@ -33,6 +30,7 @@ docs/en/architecture/overview.md
|
|
|
33
30
|
docs/en/architecture/qc-and-rules.md
|
|
34
31
|
docs/en/architecture/release-lifecycle.md
|
|
35
32
|
docs/en/architecture/taxonomy-coverage.md
|
|
33
|
+
docs/en/contributor/defect-tracking.md
|
|
36
34
|
docs/en/contributor/development-testing.md
|
|
37
35
|
docs/en/contributor/documentation-deployment.md
|
|
38
36
|
docs/en/contributor/index.md
|
|
@@ -75,6 +73,10 @@ docs/en/reference/index.md
|
|
|
75
73
|
docs/en/reference/recipe-fields.md
|
|
76
74
|
docs/en/reference/recipe-overview.md
|
|
77
75
|
docs/en/reference/recipe-parsers-examples.md
|
|
76
|
+
docs/en/reference/resolved-issues.md
|
|
77
|
+
docs/locales/README.md
|
|
78
|
+
docs/zh/.readthedocs.yaml
|
|
79
|
+
docs/zh/conf.py
|
|
78
80
|
docs/zh/index.md
|
|
79
81
|
docs/zh/overview.md
|
|
80
82
|
docs/zh/architecture/extensibility.md
|
|
@@ -86,6 +88,7 @@ docs/zh/architecture/overview.md
|
|
|
86
88
|
docs/zh/architecture/qc-and-rules.md
|
|
87
89
|
docs/zh/architecture/release-lifecycle.md
|
|
88
90
|
docs/zh/architecture/taxonomy-coverage.md
|
|
91
|
+
docs/zh/contributor/defect-tracking.md
|
|
89
92
|
docs/zh/contributor/development-testing.md
|
|
90
93
|
docs/zh/contributor/documentation-deployment.md
|
|
91
94
|
docs/zh/contributor/index.md
|
|
@@ -128,6 +131,7 @@ docs/zh/reference/index.md
|
|
|
128
131
|
docs/zh/reference/recipe-fields.md
|
|
129
132
|
docs/zh/reference/recipe-overview.md
|
|
130
133
|
docs/zh/reference/recipe-parsers-examples.md
|
|
134
|
+
docs/zh/reference/resolved-issues.md
|
|
131
135
|
operon/__init__.py
|
|
132
136
|
operon/__main__.py
|
|
133
137
|
operon/backup.py
|
|
@@ -158,6 +162,7 @@ operon/rules.py
|
|
|
158
162
|
operon/schema.py
|
|
159
163
|
operon/sequence_tools.py
|
|
160
164
|
operon/shutdown.py
|
|
165
|
+
operon/sql.py
|
|
161
166
|
operon/table_import.py
|
|
162
167
|
operon/taxonomy.py
|
|
163
168
|
operon/timetree.py
|
|
@@ -178,27 +183,37 @@ operon/tui/actions.py
|
|
|
178
183
|
operon/tui/app.py
|
|
179
184
|
operon/tui/app.tcss
|
|
180
185
|
operon/tui/data.py
|
|
186
|
+
operon/tui/parity.py
|
|
181
187
|
operon/tui/splash.py
|
|
182
188
|
operon/tui/splash_terminal.py
|
|
183
189
|
operon/tui/assets/splash.png
|
|
184
190
|
operon/tui/assets/splash.rgb.z
|
|
185
191
|
operon/tui/screens/__init__.py
|
|
192
|
+
operon/tui/screens/analyze.py
|
|
193
|
+
operon/tui/screens/classify.py
|
|
186
194
|
operon/tui/screens/common.py
|
|
187
195
|
operon/tui/screens/config.py
|
|
196
|
+
operon/tui/screens/config_classification.py
|
|
188
197
|
operon/tui/screens/coverage.py
|
|
189
198
|
operon/tui/screens/decisions.py
|
|
199
|
+
operon/tui/screens/derived_ops.py
|
|
190
200
|
operon/tui/screens/entities.py
|
|
201
|
+
operon/tui/screens/environments.py
|
|
191
202
|
operon/tui/screens/files.py
|
|
192
203
|
operon/tui/screens/files_ops.py
|
|
204
|
+
operon/tui/screens/hits.py
|
|
193
205
|
operon/tui/screens/home.py
|
|
194
206
|
operon/tui/screens/import_wizard.py
|
|
207
|
+
operon/tui/screens/labels.py
|
|
195
208
|
operon/tui/screens/publish.py
|
|
209
|
+
operon/tui/screens/run_external.py
|
|
196
210
|
operon/tui/screens/runs.py
|
|
197
211
|
tests/__init__.py
|
|
198
212
|
tests/helpers.py
|
|
199
213
|
tests/compatibility/__init__.py
|
|
200
214
|
tests/compatibility/test_python_support.py
|
|
201
215
|
tests/integration/__init__.py
|
|
216
|
+
tests/integration/test_analysis_array.py
|
|
202
217
|
tests/integration/test_analysis_resume.py
|
|
203
218
|
tests/integration/test_analysis_shutdown.py
|
|
204
219
|
tests/integration/test_analysis_tools.py
|
|
@@ -216,6 +231,7 @@ tests/regression/test_correctness.py
|
|
|
216
231
|
tests/regression/test_cython_alignment_parity.py
|
|
217
232
|
tests/regression/test_cython_parser_parity.py
|
|
218
233
|
tests/regression/test_parser_semantics.py
|
|
234
|
+
tests/regression/test_sql_identifier_security.py
|
|
219
235
|
tests/unit/__init__.py
|
|
220
236
|
tests/unit/test_alignment_qc.py
|
|
221
237
|
tests/unit/test_classify.py
|
|
@@ -224,6 +240,9 @@ tests/unit/test_config_workflow_edges.py
|
|
|
224
240
|
tests/unit/test_core_coverage_more.py
|
|
225
241
|
tests/unit/test_coverage_edges.py
|
|
226
242
|
tests/unit/test_database_edges_more.py
|
|
243
|
+
tests/unit/test_defect_registry.py
|
|
244
|
+
tests/unit/test_defects_cli.py
|
|
245
|
+
tests/unit/test_docs_projects.py
|
|
227
246
|
tests/unit/test_docs_versions.py
|
|
228
247
|
tests/unit/test_environment.py
|
|
229
248
|
tests/unit/test_environment_capture.py
|
|
@@ -267,8 +286,12 @@ tests/unit/test_timetree_snapshots.py
|
|
|
267
286
|
tests/unit/test_tools_edges.py
|
|
268
287
|
tests/unit/test_tools_execution_more.py
|
|
269
288
|
tests/unit/test_tui.py
|
|
289
|
+
tests/unit/test_tui_analyze.py
|
|
290
|
+
tests/unit/test_tui_cli_parity.py
|
|
270
291
|
tests/unit/test_tui_config.py
|
|
292
|
+
tests/unit/test_tui_derived_ops.py
|
|
271
293
|
tests/unit/test_tui_flows_more.py
|
|
294
|
+
tests/unit/test_tui_m3_loop.py
|
|
272
295
|
tests/unit/test_tui_publish.py
|
|
273
296
|
tests/unit/test_tui_screens_more.py
|
|
274
297
|
tests/unit/test_tui_splash_terminal.py
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OperonDBS
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.3
|
|
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
|
|
@@ -46,9 +46,14 @@ Requires-Dist: myst-parser<5,>=4.0; extra == "dev"
|
|
|
46
46
|
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "dev"
|
|
47
47
|
Dynamic: license-file
|
|
48
48
|
|
|
49
|
-
# Operon
|
|
49
|
+
# Operon the Database System
|
|
50
50
|
|
|
51
|
-
[](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)
|
|
52
57
|
|
|
53
58
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
54
59
|
|
|
@@ -88,11 +93,12 @@ python -m pip install -e '.[dev]'
|
|
|
88
93
|
|
|
89
94
|
## Documentation
|
|
90
95
|
|
|
91
|
-
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md).
|
|
96
|
+
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). Each language is its own Sphinx project; build both without warnings:
|
|
92
97
|
|
|
93
98
|
```bash
|
|
94
99
|
python -m pip install -e '.[docs]'
|
|
95
|
-
sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
100
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
101
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
96
102
|
```
|
|
97
103
|
|
|
98
|
-
Read the Docs
|
|
104
|
+
Read the Docs publishes two projects linked as parent and translation: `operonproject` (English, `https://operonproject.readthedocs.io/en/latest/`) and `operonproject-zh` (Chinese, `https://operonproject.readthedocs.io/zh-cn/latest/`), each built from its own `docs/<language>/.readthedocs.yaml`.
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
# Operon
|
|
1
|
+
# Operon the Database System
|
|
2
2
|
|
|
3
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
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
|
|
|
@@ -40,11 +45,12 @@ python -m pip install -e '.[dev]'
|
|
|
40
45
|
|
|
41
46
|
## Documentation
|
|
42
47
|
|
|
43
|
-
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md).
|
|
48
|
+
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). Each language is its own Sphinx project; build both without warnings:
|
|
44
49
|
|
|
45
50
|
```bash
|
|
46
51
|
python -m pip install -e '.[docs]'
|
|
47
|
-
sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
52
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
53
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
48
54
|
```
|
|
49
55
|
|
|
50
|
-
Read the Docs
|
|
56
|
+
Read the Docs publishes two projects linked as parent and translation: `operonproject` (English, `https://operonproject.readthedocs.io/en/latest/`) and `operonproject-zh` (Chinese, `https://operonproject.readthedocs.io/zh-cn/latest/`), each built from its own `docs/<language>/.readthedocs.yaml`.
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
# Operon
|
|
1
|
+
# Operon the Database System
|
|
2
2
|
|
|
3
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml)
|
|
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
|
一个基于 Python 的、面向大规模基因组数据的**基于文件的数据库**,用于归档、质控、分析与确定性自动化处理。
|
|
6
11
|
|
|
@@ -38,11 +43,12 @@ python -m pip install -e '.[dev]'
|
|
|
38
43
|
|
|
39
44
|
## 文档
|
|
40
45
|
|
|
41
|
-
完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)
|
|
46
|
+
完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)版本。每种语言是独立的 Sphinx 工程,两条构建都必须无警告通过:
|
|
42
47
|
|
|
43
48
|
```bash
|
|
44
49
|
python -m pip install -e '.[docs]'
|
|
45
|
-
sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
50
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
51
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
46
52
|
```
|
|
47
53
|
|
|
48
|
-
Read the Docs
|
|
54
|
+
Read the Docs 发布两个互为父项目与翻译的项目:`operonproject`(英文,`https://operonproject.readthedocs.io/en/latest/`)与 `operonproject-zh`(中文,`https://operonproject.readthedocs.io/zh-cn/latest/`),各自从 `docs/<语言>/.readthedocs.yaml` 构建。
|