OperonDBS 0.8.2__tar.gz → 0.8.4__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.2 → operondbs-0.8.4}/.github/workflows/publish.yml +45 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/.github/workflows/test.yml +3 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/.gitignore +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/AGENTS.md +79 -21
- {operondbs-0.8.2 → operondbs-0.8.4}/MANIFEST.in +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/OperonDBS.egg-info/PKG-INFO +5 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/OperonDBS.egg-info/SOURCES.txt +20 -6
- {operondbs-0.8.2 → operondbs-0.8.4}/PKG-INFO +5 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/README.md +4 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/README_ZH.md +4 -3
- operondbs-0.8.4/docs/conf_common.py +218 -0
- operondbs-0.8.4/docs/en/.readthedocs.yaml +29 -0
- operondbs-0.8.4/docs/en/conf.py +24 -0
- operondbs-0.8.4/docs/en/contributor/development-testing.md +191 -0
- operondbs-0.8.4/docs/en/contributor/documentation-deployment.md +57 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/contributor/pypi-release.md +21 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/qc-profiles.md +2 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/behaviors-and-limitations.md +9 -5
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-tui.md +66 -16
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/resolved-issues.md +6 -0
- operondbs-0.8.4/docs/locales/README.md +34 -0
- operondbs-0.8.4/docs/zh/.readthedocs.yaml +28 -0
- operondbs-0.8.4/docs/zh/conf.py +23 -0
- operondbs-0.8.4/docs/zh/contributor/development-testing.md +173 -0
- operondbs-0.8.4/docs/zh/contributor/documentation-deployment.md +57 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/contributor/pypi-release.md +17 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/qc-profiles.md +5 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/behaviors-and-limitations.md +9 -5
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-tui.md +59 -15
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/resolved-issues.md +6 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/adapters/ncbi_datasets.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/adapters/timetree.py +4 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/cli.py +20 -24
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/config.py +2 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/coverage.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/database.py +2 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/demo.py +4 -7
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/environment_capture.py +1 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/execution.py +53 -19
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/export.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/fanout.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/files.py +50 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/import_wizard.py +9 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/lifecycle.py +2 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/lineage.py +7 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/qc/__init__.py +15 -15
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/qc/alignment.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/qc/measure.py +7 -7
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/qc/parsers.py +2 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/remotes.py +16 -10
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/reports.py +47 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/schema.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/sequence_tools.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/shutdown.py +18 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/taxonomy.py +2 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/timetree.py +36 -14
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tools.py +133 -30
- operondbs-0.8.4/operon/tui/actions.py +1225 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/app.py +9 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/app.tcss +179 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/data.py +298 -19
- operondbs-0.8.4/operon/tui/parity.py +716 -0
- operondbs-0.8.4/operon/tui/screens/analyze.py +435 -0
- operondbs-0.8.4/operon/tui/screens/classify.py +102 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/common.py +265 -19
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/config.py +503 -49
- operondbs-0.8.4/operon/tui/screens/config_classification.py +666 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/coverage.py +3 -6
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/decisions.py +2 -3
- operondbs-0.8.4/operon/tui/screens/derived_ops.py +593 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/entities.py +4 -11
- operondbs-0.8.4/operon/tui/screens/environments.py +117 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/files.py +90 -5
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/files_ops.py +4 -11
- operondbs-0.8.4/operon/tui/screens/hits.py +180 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/home.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/import_wizard.py +9 -18
- operondbs-0.8.4/operon/tui/screens/labels.py +103 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/publish.py +4 -11
- operondbs-0.8.4/operon/tui/screens/run_external.py +236 -0
- operondbs-0.8.4/operon/tui/screens/runs.py +633 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/splash.py +7 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/utils.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/workflow.py +3 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/pyproject.toml +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/compatibility/test_python_support.py +0 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/helpers.py +30 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_analysis_array.py +217 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_analysis_resume.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_analysis_shutdown.py +38 -9
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_analysis_tools.py +6 -7
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_classify_sequences.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_execution_backends.py +1 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_fanout_analyze.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_lineage_cascade.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_ncbi_datasets_adapter.py +30 -36
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_pipeline_and_release.py +1 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_python_packaging.py +17 -6
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_qc_remote_measure.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/regression/test_correctness.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/regression/test_cython_alignment_parity.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/regression/test_cython_parser_parity.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/regression/test_parser_semantics.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_alignment_qc.py +4 -5
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_classify.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_core_coverage_more.py +3 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_defects_cli.py +0 -1
- operondbs-0.8.4/tests/unit/test_docs_projects.py +226 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_docs_versions.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_environment.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_environment_capture.py +10 -7
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_execution.py +152 -14
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_execution_edges.py +2 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_fanout.py +6 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_files_edges.py +95 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_import_backup_show.py +0 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_lifecycle.py +4 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_misc_coverage_more.py +19 -6
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_ncbi_coverage_gaps.py +6 -5
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_parser_edge_paths.py +0 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_qc_and_rules.py +3 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_qc_edges_more.py +2 -3
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_qc_measure.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_qc_remote_only.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_remote_taxonomy_more.py +7 -6
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_remote_transport_edges.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_remotes.py +4 -5
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_remotes_edges.py +10 -11
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_schema_2_10.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_schema_2_11.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_schema_2_9.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_schema_and_metadata.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_sequence_tools.py +1 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_sequences.py +1 -2
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_shutdown.py +42 -7
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_support_edges.py +0 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_timetree_snapshots.py +70 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tools_edges.py +28 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tools_execution_more.py +0 -1
- operondbs-0.8.4/tests/unit/test_tui.py +2250 -0
- operondbs-0.8.4/tests/unit/test_tui_analyze.py +952 -0
- operondbs-0.8.4/tests/unit/test_tui_cli_parity.py +1233 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tui_config.py +807 -30
- operondbs-0.8.4/tests/unit/test_tui_derived_ops.py +703 -0
- operondbs-0.8.4/tests/unit/test_tui_m3_loop.py +273 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tui_publish.py +10 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tui_screens_more.py +5 -4
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tui_splash_terminal.py +8 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tui_writes.py +244 -0
- operondbs-0.8.2/.readthedocs.yaml +0 -15
- operondbs-0.8.2/docs/_static/language-switcher.js +0 -20
- operondbs-0.8.2/docs/_static/operon.css +0 -32
- operondbs-0.8.2/docs/_templates/layout.html +0 -10
- operondbs-0.8.2/docs/conf.py +0 -129
- operondbs-0.8.2/docs/en/contributor/development-testing.md +0 -110
- operondbs-0.8.2/docs/en/contributor/documentation-deployment.md +0 -36
- operondbs-0.8.2/docs/index.md +0 -18
- operondbs-0.8.2/docs/zh/contributor/development-testing.md +0 -110
- operondbs-0.8.2/docs/zh/contributor/documentation-deployment.md +0 -36
- operondbs-0.8.2/operon/tui/actions.py +0 -642
- operondbs-0.8.2/operon/tui/screens/runs.py +0 -217
- operondbs-0.8.2/tests/unit/test_tui.py +0 -1068
- {operondbs-0.8.2 → operondbs-0.8.4}/LICENSE +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/OperonDBS.egg-info/dependency_links.txt +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/OperonDBS.egg-info/entry_points.txt +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/OperonDBS.egg-info/requires.txt +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/OperonDBS.egg-info/top_level.txt +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/benchmarks/qc_representative_entities.tsv +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/extensibility.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/external-analysis.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/files-and-storage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/metadata-and-data-model.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/overview.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/qc-and-rules.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/release-lifecycle.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/contributor/defect-tracking.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/contributor/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/contributor/repository-guide.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/getting-started/daily-workflow.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/getting-started/first-project.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/getting-started/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/getting-started/installation.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/getting-started/quickstart.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/backup-migration.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/curation-lifecycle.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/external-analysis.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/file-archiving.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/metadata-import.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/ncbi-datasets.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/phylogenetics-workflow.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/remote-execution.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/remote-first.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/remote-storage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/guides/troubleshooting.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/operations/database-compatibility.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/operations/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/operations/ncbi-recovery-migration.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/operations/qc-performance.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/overview.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-analysis.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-decisions-reports.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-files-qc.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-project-metadata.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-remote.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-taxonomy-lifecycle-admin.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/cli-workflow.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/data-model.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/recipe-fields.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/recipe-overview.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/en/reference/recipe-parsers-examples.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/requirements.txt +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/extensibility.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/external-analysis.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/files-and-storage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/metadata-and-data-model.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/overview.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/qc-and-rules.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/release-lifecycle.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/contributor/defect-tracking.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/contributor/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/contributor/repository-guide.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/getting-started/daily-workflow.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/getting-started/first-project.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/getting-started/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/getting-started/installation.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/getting-started/quickstart.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/backup-migration.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/curation-lifecycle.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/external-analysis.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/file-archiving.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/metadata-import.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/ncbi-datasets.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/phylogenetics-workflow.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/remote-execution.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/remote-first.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/remote-storage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/guides/troubleshooting.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/operations/database-compatibility.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/operations/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/operations/ncbi-recovery-migration.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/operations/qc-performance.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/overview.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-analysis.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-decisions-reports.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-files-qc.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-project-metadata.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-remote.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-taxonomy-lifecycle-admin.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/cli-workflow.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/data-model.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/index.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/recipe-fields.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/recipe-overview.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/docs/zh/reference/recipe-parsers-examples.md +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/__main__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/adapters/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/backup.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/classify.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/entity_view.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/environment.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/errors.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/metadata_files.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/ncbi_reconcile.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/profiles.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/qc/_alignment.pyx +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/qc/_parsers.pyx +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/release.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/rules.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/sql.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/table_import.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/assets/splash.png +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/assets/splash.rgb.z +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/screens/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/operon/tui/splash_terminal.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/setup.cfg +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/setup.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/compatibility/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/integration/test_taxonomy_coverage.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/regression/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/regression/test_sql_identifier_security.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/__init__.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_cli_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_config_workflow_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_coverage_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_database_edges_more.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_defect_registry.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_export.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_follow.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_import_wizard_edges.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_lineage.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_ncbi_edge_cases.py +1 -1
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_ncbi_reconcile_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_recipe_history.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_rules_schema_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_table_import_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_taxonomy_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_timetree.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_tui_flows_more.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_views_release_reports_edges.py +0 -0
- {operondbs-0.8.2 → operondbs-0.8.4}/tests/unit/test_workflow_cli.py +0 -0
|
@@ -8,7 +8,46 @@ permissions:
|
|
|
8
8
|
contents: read
|
|
9
9
|
|
|
10
10
|
jobs:
|
|
11
|
+
verify-release:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
permissions:
|
|
14
|
+
contents: read
|
|
15
|
+
actions: read
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v6
|
|
18
|
+
with:
|
|
19
|
+
ref: ${{ github.event.release.tag_name }}
|
|
20
|
+
fetch-depth: 0
|
|
21
|
+
persist-credentials: false
|
|
22
|
+
- uses: actions/setup-python@v7
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.12"
|
|
25
|
+
- run: python -m pip install --upgrade pip pyyaml
|
|
26
|
+
- name: The tagged commit passed its own CI run
|
|
27
|
+
env:
|
|
28
|
+
GH_TOKEN: ${{ github.token }}
|
|
29
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
30
|
+
run: |
|
|
31
|
+
sha=$(git rev-parse HEAD)
|
|
32
|
+
conclusion=$(gh api \
|
|
33
|
+
"repos/${{ github.repository }}/actions/workflows/test.yml/runs?head_sha=$sha&per_page=1" \
|
|
34
|
+
--jq '.workflow_runs[0].conclusion // "no run"')
|
|
35
|
+
echo "$RELEASE_TAG -> $sha: test.yml concluded '$conclusion'"
|
|
36
|
+
if [ "$conclusion" != "success" ]; then
|
|
37
|
+
echo "::error::test.yml on $sha concluded '$conclusion'; rerun it (gh run rerun) before releasing"
|
|
38
|
+
exit 1
|
|
39
|
+
fi
|
|
40
|
+
- name: Import the maintainer's published GPG key
|
|
41
|
+
run: |
|
|
42
|
+
curl -sSL "https://github.com/${{ github.repository_owner }}.gpg" | gpg --import
|
|
43
|
+
gpg --list-keys --with-colons | grep '^pub' | wc -l
|
|
44
|
+
- name: Release preflight
|
|
45
|
+
env:
|
|
46
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
47
|
+
run: scripts/release-preflight.sh --ci --tag "$RELEASE_TAG"
|
|
48
|
+
|
|
11
49
|
source-distribution:
|
|
50
|
+
needs: verify-release
|
|
12
51
|
runs-on: ubuntu-latest
|
|
13
52
|
steps:
|
|
14
53
|
- uses: actions/checkout@v6
|
|
@@ -35,6 +74,7 @@ jobs:
|
|
|
35
74
|
if-no-files-found: error
|
|
36
75
|
|
|
37
76
|
documentation:
|
|
77
|
+
needs: verify-release
|
|
38
78
|
runs-on: ubuntu-latest
|
|
39
79
|
steps:
|
|
40
80
|
- uses: actions/checkout@v6
|
|
@@ -43,9 +83,12 @@ jobs:
|
|
|
43
83
|
python-version: "3.12"
|
|
44
84
|
- run: python -m pip install --upgrade pip
|
|
45
85
|
- run: python -m pip install -e '.[docs]'
|
|
46
|
-
- run:
|
|
86
|
+
- run: |
|
|
87
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html
|
|
88
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html
|
|
47
89
|
|
|
48
90
|
wheels:
|
|
91
|
+
needs: verify-release
|
|
49
92
|
strategy:
|
|
50
93
|
fail-fast: false
|
|
51
94
|
matrix:
|
|
@@ -84,7 +127,7 @@ jobs:
|
|
|
84
127
|
if-no-files-found: error
|
|
85
128
|
|
|
86
129
|
pypi-publish:
|
|
87
|
-
needs: [source-distribution, wheels]
|
|
130
|
+
needs: [verify-release, source-distribution, wheels]
|
|
88
131
|
runs-on: ubuntu-latest
|
|
89
132
|
environment:
|
|
90
133
|
name: pypi
|
|
@@ -25,7 +25,9 @@ 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:
|
|
@@ -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.4 (`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,15 +158,24 @@ 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
|
-
`run-test-matrix.sh` build and drive the uv-managed Python 3.10–3.
|
|
174
|
+
`run-test-matrix.sh` build and drive the uv-managed Python 3.10–3.15
|
|
136
175
|
matrix under .matrix/ (see `docs/*/contributor/development-testing.md`);
|
|
137
|
-
`
|
|
138
|
-
|
|
176
|
+
`release-preflight.sh` is the release gate and the script the publish
|
|
177
|
+
workflow runs on the tag; `defects.sh` appends to and queries the defect
|
|
178
|
+
registry (`defects.yml`, see "Defect reports" below).
|
|
139
179
|
|
|
140
180
|
## Setup, test, and build
|
|
141
181
|
|
|
@@ -154,25 +194,37 @@ python -m pytest tests/unit # by category: unit / integration /
|
|
|
154
194
|
|
|
155
195
|
python -m pytest --lf -q --no-cov # iterate: last failures, no coverage
|
|
156
196
|
python -m pytest -n 4 --dist loadfile # parallel full suite (xdist, in the dev/test extras)
|
|
157
|
-
scripts/
|
|
197
|
+
scripts/setup-test-matrix.sh # once per machine: uv-managed 3.10-3.15 venvs
|
|
198
|
+
scripts/run-test-matrix.sh # whole suite on 3.10-3.15, in waves
|
|
199
|
+
# (MATRIX_CONCURRENCY / MATRIX_JOBS override the split)
|
|
200
|
+
scripts/release-preflight.sh # the release gate: version, full suite, both doc
|
|
201
|
+
# trees, defect registry, matrix evidence for HEAD;
|
|
202
|
+
# --run-matrix runs the matrix inside the gate, and
|
|
203
|
+
# --tag vX.Y.Z asserts the tag's name/signature/target
|
|
158
204
|
|
|
159
205
|
python setup.py build_ext --inplace # rebuild only the Cython extension
|
|
160
206
|
|
|
161
|
-
sphinx-build -W --keep-going -b html docs docs/_build/html # strict
|
|
207
|
+
sphinx-build -W --keep-going -b html docs/en docs/_build/en/html # strict build,
|
|
208
|
+
sphinx-build -W --keep-going -b html docs/zh docs/_build/zh/html # one per language
|
|
162
209
|
```
|
|
163
210
|
|
|
164
211
|
Run the relevant test category after any change; run the full suite before
|
|
165
212
|
considering work done.
|
|
166
213
|
|
|
167
214
|
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
|
|
215
|
+
Sphinx build. Releases are published exclusively to PyPI, and
|
|
216
|
+
`.github/workflows/publish.yml` builds nothing and uploads nothing until its
|
|
217
|
+
`verify-release` job has seen a `success` conclusion for the tagged commit's `test`
|
|
218
|
+
run *and* a passing `scripts/release-preflight.sh --ci --tag <tag>`; see
|
|
219
|
+
`docs/*/contributor/pypi-release.md`.
|
|
169
220
|
|
|
170
221
|
The project uses `pytest-xdist` to parallel testing. Avoid sharing state between tests
|
|
171
222
|
to prevent unexpected or random test results.
|
|
172
223
|
|
|
173
224
|
> Running `python -m pytest` directly takes approx 35 seconds
|
|
174
|
-
> (auto: 24 workers). Running the local test matrix takes
|
|
175
|
-
> (6
|
|
225
|
+
> (auto: 24 workers). Running the local test matrix takes about 5 minutes
|
|
226
|
+
> (6 versions, 3 at a time × 7 workers by default; `MATRIX_CONCURRENCY` /
|
|
227
|
+
> `MATRIX_JOBS` override the split).
|
|
176
228
|
>
|
|
177
229
|
> Measured on Intel Core i7-13700HX (16c24t).
|
|
178
230
|
|
|
@@ -216,15 +268,18 @@ proceed with caution).
|
|
|
216
268
|
bytes must raise `ConflictError`; identical bytes must be idempotent.
|
|
217
269
|
- Manual overrides (e.g. `curate`, forced `set-state`) must always be
|
|
218
270
|
recorded in the `changes` audit table.
|
|
271
|
+
- CLI-first: new capabilities land in the CLI/core first, and the TUI never
|
|
272
|
+
runs ahead of the CLI. Any change to CLI commands, flags, or the TUI
|
|
273
|
+
surface must update the parity registry `operon/tui/parity.py` in the same
|
|
274
|
+
commit — the parity tests in `tests/unit/test_tui_cli_parity.py` fail
|
|
275
|
+
otherwise. Commands intentionally not offered in the TUI are registered
|
|
276
|
+
`cli-only` with a reason; known gaps are registered `planned` with a
|
|
277
|
+
milestone.
|
|
219
278
|
- `docs/*/operations/database-compatibility.md` lists migration code that
|
|
220
279
|
exists only for pre-1.0 databases and is scheduled for removal at the 1.0
|
|
221
280
|
release; check it before touching `operon/database.py` migrations or the
|
|
222
281
|
NCBI adapter's schema-upgrade path.
|
|
223
|
-
-
|
|
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**.
|
|
282
|
+
- Using `ruff` to re-format the code.
|
|
228
283
|
|
|
229
284
|
## Defect reports
|
|
230
285
|
|
|
@@ -256,12 +311,15 @@ change:
|
|
|
256
311
|
`docs/*/operations/`
|
|
257
312
|
- Contributor-facing processes → `docs/*/contributor/`; navigation →
|
|
258
313
|
`docs/*/index.md`
|
|
314
|
+
- The set of language projects → `docs/<language>/conf.py`, its
|
|
315
|
+
`docs/<language>/.readthedocs.yaml`, and the registry in
|
|
316
|
+
`tests/unit/test_docs_projects.py`
|
|
259
317
|
|
|
260
|
-
Version markers in docs (`operon` 0.8.
|
|
318
|
+
Version markers in docs (`operon` 0.8.4, database schema 2.11, metadata
|
|
261
319
|
schema 1.4) must match `pyproject.toml` and the code. Do not write the
|
|
262
320
|
current values literally in Markdown sources: use the `myst_substitutions`
|
|
263
321
|
references `{{ operon_version }}`, `{{ db_schema }}`, and
|
|
264
|
-
`{{ metadata_schema }}`, which `docs/
|
|
322
|
+
`{{ metadata_schema }}`, which `docs/conf_common.py` resolves from the single
|
|
265
323
|
sources above at build time. Substitutions expand in paragraph text only,
|
|
266
324
|
never inside code spans or fenced code blocks — examples there use
|
|
267
325
|
`<version>` placeholders instead. Intentional historical pins stay literal — either on the
|
|
@@ -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.4
|
|
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
|
|
@@ -93,11 +93,12 @@ python -m pip install -e '.[dev]'
|
|
|
93
93
|
|
|
94
94
|
## Documentation
|
|
95
95
|
|
|
96
|
-
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:
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
99
|
python -m pip install -e '.[docs]'
|
|
100
|
-
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
|
|
101
102
|
```
|
|
102
103
|
|
|
103
|
-
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
|
|
@@ -77,6 +74,9 @@ docs/en/reference/recipe-fields.md
|
|
|
77
74
|
docs/en/reference/recipe-overview.md
|
|
78
75
|
docs/en/reference/recipe-parsers-examples.md
|
|
79
76
|
docs/en/reference/resolved-issues.md
|
|
77
|
+
docs/locales/README.md
|
|
78
|
+
docs/zh/.readthedocs.yaml
|
|
79
|
+
docs/zh/conf.py
|
|
80
80
|
docs/zh/index.md
|
|
81
81
|
docs/zh/overview.md
|
|
82
82
|
docs/zh/architecture/extensibility.md
|
|
@@ -183,21 +183,30 @@ operon/tui/actions.py
|
|
|
183
183
|
operon/tui/app.py
|
|
184
184
|
operon/tui/app.tcss
|
|
185
185
|
operon/tui/data.py
|
|
186
|
+
operon/tui/parity.py
|
|
186
187
|
operon/tui/splash.py
|
|
187
188
|
operon/tui/splash_terminal.py
|
|
188
189
|
operon/tui/assets/splash.png
|
|
189
190
|
operon/tui/assets/splash.rgb.z
|
|
190
191
|
operon/tui/screens/__init__.py
|
|
192
|
+
operon/tui/screens/analyze.py
|
|
193
|
+
operon/tui/screens/classify.py
|
|
191
194
|
operon/tui/screens/common.py
|
|
192
195
|
operon/tui/screens/config.py
|
|
196
|
+
operon/tui/screens/config_classification.py
|
|
193
197
|
operon/tui/screens/coverage.py
|
|
194
198
|
operon/tui/screens/decisions.py
|
|
199
|
+
operon/tui/screens/derived_ops.py
|
|
195
200
|
operon/tui/screens/entities.py
|
|
201
|
+
operon/tui/screens/environments.py
|
|
196
202
|
operon/tui/screens/files.py
|
|
197
203
|
operon/tui/screens/files_ops.py
|
|
204
|
+
operon/tui/screens/hits.py
|
|
198
205
|
operon/tui/screens/home.py
|
|
199
206
|
operon/tui/screens/import_wizard.py
|
|
207
|
+
operon/tui/screens/labels.py
|
|
200
208
|
operon/tui/screens/publish.py
|
|
209
|
+
operon/tui/screens/run_external.py
|
|
201
210
|
operon/tui/screens/runs.py
|
|
202
211
|
tests/__init__.py
|
|
203
212
|
tests/helpers.py
|
|
@@ -233,6 +242,7 @@ tests/unit/test_coverage_edges.py
|
|
|
233
242
|
tests/unit/test_database_edges_more.py
|
|
234
243
|
tests/unit/test_defect_registry.py
|
|
235
244
|
tests/unit/test_defects_cli.py
|
|
245
|
+
tests/unit/test_docs_projects.py
|
|
236
246
|
tests/unit/test_docs_versions.py
|
|
237
247
|
tests/unit/test_environment.py
|
|
238
248
|
tests/unit/test_environment_capture.py
|
|
@@ -276,8 +286,12 @@ tests/unit/test_timetree_snapshots.py
|
|
|
276
286
|
tests/unit/test_tools_edges.py
|
|
277
287
|
tests/unit/test_tools_execution_more.py
|
|
278
288
|
tests/unit/test_tui.py
|
|
289
|
+
tests/unit/test_tui_analyze.py
|
|
290
|
+
tests/unit/test_tui_cli_parity.py
|
|
279
291
|
tests/unit/test_tui_config.py
|
|
292
|
+
tests/unit/test_tui_derived_ops.py
|
|
280
293
|
tests/unit/test_tui_flows_more.py
|
|
294
|
+
tests/unit/test_tui_m3_loop.py
|
|
281
295
|
tests/unit/test_tui_publish.py
|
|
282
296
|
tests/unit/test_tui_screens_more.py
|
|
283
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.4
|
|
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
|
|
@@ -93,11 +93,12 @@ python -m pip install -e '.[dev]'
|
|
|
93
93
|
|
|
94
94
|
## Documentation
|
|
95
95
|
|
|
96
|
-
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:
|
|
97
97
|
|
|
98
98
|
```bash
|
|
99
99
|
python -m pip install -e '.[docs]'
|
|
100
|
-
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
|
|
101
102
|
```
|
|
102
103
|
|
|
103
|
-
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`.
|
|
@@ -45,11 +45,12 @@ python -m pip install -e '.[dev]'
|
|
|
45
45
|
|
|
46
46
|
## Documentation
|
|
47
47
|
|
|
48
|
-
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:
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
51
|
python -m pip install -e '.[docs]'
|
|
52
|
-
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
|
|
53
54
|
```
|
|
54
55
|
|
|
55
|
-
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`.
|
|
@@ -43,11 +43,12 @@ python -m pip install -e '.[dev]'
|
|
|
43
43
|
|
|
44
44
|
## 文档
|
|
45
45
|
|
|
46
|
-
完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)
|
|
46
|
+
完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)版本。每种语言是独立的 Sphinx 工程,两条构建都必须无警告通过:
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
49
|
python -m pip install -e '.[docs]'
|
|
50
|
-
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
|
|
51
52
|
```
|
|
52
53
|
|
|
53
|
-
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` 构建。
|