OperonDBS 0.6.2__tar.gz → 0.7.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {operondbs-0.6.2 → operondbs-0.7.2}/.github/workflows/publish.yml +14 -3
- operondbs-0.6.2/.github/workflows/deploy.yml → operondbs-0.7.2/.github/workflows/test.yml +1 -22
- {operondbs-0.6.2 → operondbs-0.7.2}/AGENTS.md +39 -21
- {operondbs-0.6.2 → operondbs-0.7.2}/MANIFEST.in +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/PKG-INFO +4 -19
- {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/SOURCES.txt +15 -6
- {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/requires.txt +3 -11
- {operondbs-0.6.2 → operondbs-0.7.2}/PKG-INFO +4 -19
- {operondbs-0.6.2 → operondbs-0.7.2}/README.md +2 -10
- {operondbs-0.6.2 → operondbs-0.7.2}/README_ZH.md +2 -9
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/conf.py +45 -7
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/extensibility.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/external-analysis.md +2 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/files-and-storage.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/metadata-and-data-model.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/overview.md +8 -6
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/qc-and-rules.md +1 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/development-testing.md +15 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/documentation-deployment.md +0 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/index.md +0 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/pypi-release.md +6 -4
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/repository-guide.md +0 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/first-project.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/installation.md +5 -15
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/backup-migration.md +6 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/curation-lifecycle.md +11 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/external-analysis.md +4 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/metadata-import.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/ncbi-datasets.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/qc-profiles.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/remote-storage.md +4 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/troubleshooting.md +4 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/index.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/database-compatibility.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/ncbi-recovery-migration.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/overview.md +2 -0
- operondbs-0.7.2/docs/en/reference/behaviors-and-limitations.md +192 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-decisions-reports.md +7 -3
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-files-qc.md +4 -2
- operondbs-0.7.2/docs/en/reference/cli-tui.md +242 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/index.md +2 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/recipe-fields.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/recipe-overview.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/recipe-parsers-examples.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/extensibility.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/external-analysis.md +2 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/files-and-storage.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/metadata-and-data-model.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/overview.md +8 -6
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/qc-and-rules.md +1 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/development-testing.md +16 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/documentation-deployment.md +0 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/index.md +0 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/pypi-release.md +5 -3
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/repository-guide.md +0 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/first-project.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/installation.md +4 -12
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/backup-migration.md +10 -4
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/curation-lifecycle.md +15 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/external-analysis.md +9 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/metadata-import.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/ncbi-datasets.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/qc-profiles.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/remote-storage.md +7 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/troubleshooting.md +6 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/index.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/database-compatibility.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/ncbi-recovery-migration.md +1 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/overview.md +2 -0
- operondbs-0.7.2/docs/zh/reference/behaviors-and-limitations.md +190 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-decisions-reports.md +7 -4
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-files-qc.md +4 -2
- operondbs-0.7.2/docs/zh/reference/cli-tui.md +200 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/index.md +2 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/recipe-fields.md +2 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/recipe-overview.md +2 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/recipe-parsers-examples.md +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/backup.py +50 -8
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/cli.py +76 -4
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/database.py +77 -7
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/export.py +68 -8
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/files.py +85 -45
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/import_wizard.py +1 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/lineage.py +73 -14
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/qc_module/__init__.py +97 -12
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/release.py +149 -19
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/rules.py +67 -8
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/table_import.py +11 -7
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/actions.py +131 -31
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/app.py +68 -8
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/app.tcss +121 -0
- operondbs-0.7.2/operon/tui/assets/splash.png +0 -0
- operondbs-0.7.2/operon/tui/assets/splash.rgb.z +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/data.py +279 -14
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/common.py +50 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/config.py +10 -4
- operondbs-0.7.2/operon/tui/screens/coverage.py +290 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/entities.py +18 -3
- operondbs-0.7.2/operon/tui/screens/import_wizard.py +619 -0
- operondbs-0.7.2/operon/tui/screens/publish.py +441 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/runs.py +5 -10
- operondbs-0.7.2/operon/tui/splash.py +188 -0
- operondbs-0.7.2/operon/tui/splash_terminal.py +86 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/utils.py +0 -2
- {operondbs-0.6.2 → operondbs-0.7.2}/pyproject.toml +11 -26
- {operondbs-0.6.2 → operondbs-0.7.2}/setup.py +0 -5
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/compatibility/test_python_support.py +1 -1
- operondbs-0.7.2/tests/integration/test_python_packaging.py +131 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_cli_edges.py +29 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_database_edges_more.py +23 -1
- operondbs-0.7.2/tests/unit/test_docs_versions.py +69 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_export.py +26 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_files_edges.py +52 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_import_wizard_edges.py +9 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_lineage.py +80 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_qc_and_rules.py +41 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_rules_schema_edges.py +31 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_support_edges.py +49 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_table_import_edges.py +13 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tui.py +188 -12
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tui_config.py +72 -2
- operondbs-0.7.2/tests/unit/test_tui_publish.py +725 -0
- operondbs-0.7.2/tests/unit/test_tui_splash_terminal.py +165 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tui_writes.py +28 -1
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_views_release_reports_edges.py +57 -0
- operondbs-0.6.2/docs/en/contributor/application-release.md +0 -52
- operondbs-0.6.2/docs/en/reference/cli-tui.md +0 -117
- operondbs-0.6.2/docs/zh/contributor/application-release.md +0 -69
- operondbs-0.6.2/docs/zh/reference/cli-tui.md +0 -101
- operondbs-0.6.2/tests/integration/test_application_build.py +0 -298
- operondbs-0.6.2/tools/build.py +0 -519
- {operondbs-0.6.2 → operondbs-0.7.2}/.gitignore +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/.readthedocs.yaml +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/LICENSE +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/dependency_links.txt +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/entry_points.txt +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/top_level.txt +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/benchmarks/qc_representative_entities.tsv +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/_static/language-switcher.js +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/_static/operon.css +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/_templates/layout.html +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/release-lifecycle.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/daily-workflow.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/quickstart.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/file-archiving.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/remote-execution.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/qc-performance.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-analysis.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-project-metadata.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-remote.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-taxonomy-lifecycle-admin.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-workflow.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/data-model.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/requirements.txt +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/release-lifecycle.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/taxonomy-coverage.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/daily-workflow.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/quickstart.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/file-archiving.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/remote-execution.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/taxonomy-coverage.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/index.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/qc-performance.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-analysis.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-project-metadata.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-remote.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-taxonomy-lifecycle-admin.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-workflow.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/data-model.md +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/__main__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/adapters/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/adapters/ncbi_datasets.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/config.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/coverage.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/demo.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/entity_view.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/environment.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/errors.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/execution.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/lifecycle.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/metadata_files.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/ncbi_reconcile.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/profiles.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/qc_module/_parsers.pyx +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/qc_module/parsers.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/remotes.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/reports.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/schema.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/shutdown.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/taxonomy.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tools.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/decisions.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/files.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/files_ops.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/home.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/operon/workflow.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/setup.cfg +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/compatibility/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/helpers.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_analysis_resume.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_analysis_shutdown.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_analysis_tools.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_execution_backends.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_lineage_cascade.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_ncbi_datasets_adapter.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_pipeline_and_release.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_taxonomy_coverage.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/test_correctness.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/test_cython_parser_parity.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/test_parser_semantics.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/__init__.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_config_workflow_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_coverage_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_environment.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_execution.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_execution_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_import_backup_show.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_lifecycle.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_ncbi_edge_cases.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_ncbi_reconcile_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_parser_edge_paths.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_qc_edges_more.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_recipe_history.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_remotes.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_remotes_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_schema_2_9.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_schema_and_metadata.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_shutdown.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_taxonomy_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tools_edges.py +0 -0
- {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_workflow_cli.py +0 -0
|
@@ -28,12 +28,23 @@ jobs:
|
|
|
28
28
|
- run: python -m pip install --upgrade build twine
|
|
29
29
|
- run: python -m build --sdist
|
|
30
30
|
- run: python -m twine check dist/*
|
|
31
|
-
- uses: actions/upload-artifact@
|
|
31
|
+
- uses: actions/upload-artifact@v7
|
|
32
32
|
with:
|
|
33
33
|
name: python-package-sdist
|
|
34
34
|
path: dist/*.tar.gz
|
|
35
35
|
if-no-files-found: error
|
|
36
36
|
|
|
37
|
+
documentation:
|
|
38
|
+
runs-on: ubuntu-latest
|
|
39
|
+
steps:
|
|
40
|
+
- uses: actions/checkout@v6
|
|
41
|
+
- uses: actions/setup-python@v7
|
|
42
|
+
with:
|
|
43
|
+
python-version: "3.12"
|
|
44
|
+
- run: python -m pip install --upgrade pip
|
|
45
|
+
- run: python -m pip install -e '.[docs]'
|
|
46
|
+
- run: sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
47
|
+
|
|
37
48
|
wheels:
|
|
38
49
|
strategy:
|
|
39
50
|
fail-fast: false
|
|
@@ -65,7 +76,7 @@ jobs:
|
|
|
65
76
|
CIBW_TEST_COMMAND: >-
|
|
66
77
|
python -c "import operon; import operon.qc_module._parsers;
|
|
67
78
|
print(operon.__version__)" && operon --help
|
|
68
|
-
- uses: actions/upload-artifact@
|
|
79
|
+
- uses: actions/upload-artifact@v7
|
|
69
80
|
with:
|
|
70
81
|
name: python-package-wheel-${{ matrix.artifact }}
|
|
71
82
|
path: wheelhouse/*.whl
|
|
@@ -80,7 +91,7 @@ jobs:
|
|
|
80
91
|
permissions:
|
|
81
92
|
id-token: write
|
|
82
93
|
steps:
|
|
83
|
-
- uses: actions/download-artifact@
|
|
94
|
+
- uses: actions/download-artifact@v8
|
|
84
95
|
with:
|
|
85
96
|
pattern: python-package-*
|
|
86
97
|
path: dist/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
name:
|
|
1
|
+
name: test
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
@@ -25,24 +25,3 @@ jobs:
|
|
|
25
25
|
with:
|
|
26
26
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
27
27
|
report_type: test_results
|
|
28
|
-
|
|
29
|
-
frozen-release-test:
|
|
30
|
-
runs-on: ubuntu-latest
|
|
31
|
-
steps:
|
|
32
|
-
- uses: actions/checkout@v6
|
|
33
|
-
- uses: actions/setup-python@v7
|
|
34
|
-
with:
|
|
35
|
-
python-version: "3.14"
|
|
36
|
-
- run: python -m pip install -e '.[build]'
|
|
37
|
-
- run: python tools/build.py
|
|
38
|
-
|
|
39
|
-
documentation:
|
|
40
|
-
runs-on: ubuntu-latest
|
|
41
|
-
steps:
|
|
42
|
-
- uses: actions/checkout@v6
|
|
43
|
-
- uses: actions/setup-python@v7
|
|
44
|
-
with:
|
|
45
|
-
python-version: "3.12"
|
|
46
|
-
- run: python -m pip install --upgrade pip
|
|
47
|
-
- run: python -m pip install -e '.[docs]'
|
|
48
|
-
- run: sphinx-build -W --keep-going -b html docs docs/_build/html
|
|
@@ -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.
|
|
29
|
+
- `operon` 0.7.0 (`pyproject.toml`)
|
|
30
30
|
- database schema 2.9 (`operon/database.py`, `SCHEMA_VERSION`)
|
|
31
31
|
- metadata schema 1.4 (`operon/schema.py`, `METADATA_SCHEMA_VERSION`)
|
|
32
32
|
|
|
@@ -55,7 +55,13 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
55
55
|
checksum verification) and `sftp://` / `remote://` URL fetching.
|
|
56
56
|
- `operon/tui/` — Textual-based terminal UI (`operon tui`, optional `tui`
|
|
57
57
|
extra): Home dashboard, Entities browser, Files browser, workflow-run
|
|
58
|
-
monitor, a Decisions screen,
|
|
58
|
+
monitor, a Decisions screen, a Config screen, a Publish screen (nav key
|
|
59
|
+
`7`; release builder + selective export builder with read-only previews),
|
|
60
|
+
a Coverage screen (nav key `8`; taxonomy snapshots, reference sets,
|
|
61
|
+
coverage report generation and `COV_*` report browsing), and the import
|
|
62
|
+
dataset wizard (`operon/tui/screens/import_wizard.py`; Home button or
|
|
63
|
+
global `i`, except on the Files screen where `i` stays ingest). Read
|
|
64
|
+
access lives in
|
|
59
65
|
`operon/tui/data.py` and is strictly read-only (short-lived read-only
|
|
60
66
|
connections only). Phase 2 write operations (evaluate, curate,
|
|
61
67
|
retire/restore, ingest, verify, QC batch) live in
|
|
@@ -64,7 +70,12 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
64
70
|
(identical `changes`/`workflow_runs` provenance), and returns plain
|
|
65
71
|
dicts; writable connections are never held by the UI. Every write in the
|
|
66
72
|
UI follows form/plan preview → equivalent CLI command shown → explicit
|
|
67
|
-
Confirm → background worker → notify + reload or inline error.
|
|
73
|
+
Confirm → background worker → notify + reload or inline error. Phase 3
|
|
74
|
+
actions in the same module: `import_dataset` (commits wizard drafts
|
|
75
|
+
through the shared single-transaction `import_wizard._commit`),
|
|
76
|
+
`reserve_entity_ids`, `create_release`, `export`, and `run_coverage`
|
|
77
|
+
(a below-threshold coverage report returns `exit_code=1` in the result
|
|
78
|
+
dict — a warning, not an exception). The
|
|
68
79
|
Config screen (`operon/tui/screens/config.py`, nav key `6`) edits
|
|
69
80
|
`config/profiles/*.yaml` (kind `qc`) and single recipes inside
|
|
70
81
|
`config/tools.yaml` through structured control-based forms (no free-text
|
|
@@ -101,9 +112,6 @@ The project is licensed AGPL-3.0-or-later (`LICENSE` at the repo root).
|
|
|
101
112
|
(`.readthedocs.yaml`).
|
|
102
113
|
- `benchmarks/` — representative entity sets for QC performance diagnostics
|
|
103
114
|
(see `docs/*/operations/qc-performance.md`).
|
|
104
|
-
- `tools/build.py` — the only standalone-application release entry point.
|
|
105
|
-
- `build/release/v<version>/` — generated cx_Freeze application releases,
|
|
106
|
-
including third-party licenses and corresponding source.
|
|
107
115
|
|
|
108
116
|
## Setup, test, and build
|
|
109
117
|
|
|
@@ -112,9 +120,8 @@ repo root; activate it or invoke `.venv/bin/python` explicitly).
|
|
|
112
120
|
|
|
113
121
|
```bash
|
|
114
122
|
python3 -m venv .venv && source .venv/bin/activate
|
|
115
|
-
python -m pip install -e '.[dev]' # runtime + pytest +
|
|
116
|
-
#
|
|
117
|
-
# extension
|
|
123
|
+
python -m pip install -e '.[dev]' # runtime + pytest + Cython + Sphinx;
|
|
124
|
+
# also compiles the qc parsers extension
|
|
118
125
|
|
|
119
126
|
python -m pytest # full suite (coverage gate: 90% branch)
|
|
120
127
|
python -m pytest tests/unit # by category: unit / integration /
|
|
@@ -123,19 +130,12 @@ python -m pytest tests/unit # by category: unit / integration /
|
|
|
123
130
|
python setup.py build_ext --inplace # rebuild only the Cython extension
|
|
124
131
|
|
|
125
132
|
sphinx-build -W --keep-going -b html docs docs/_build/html # strict docs build
|
|
126
|
-
|
|
127
|
-
python tools/build.py # complete standalone release -> build/release/v<version>/
|
|
128
133
|
```
|
|
129
134
|
|
|
130
135
|
Run the relevant test category after any change; run the full suite before
|
|
131
136
|
considering work done. CI (`.github/workflows/deploy.yml`) runs pytest on
|
|
132
|
-
Python 3.10–3.14
|
|
133
|
-
|
|
134
|
-
`tools/build.py` compiles the Cython parser, builds the Sphinx documentation
|
|
135
|
-
strictly, collects third-party license texts, builds the
|
|
136
|
-
corresponding-source sdist, freezes the application, assembles the versioned
|
|
137
|
-
directory, and runs the frozen executable smoke test. Do not call cx_Freeze
|
|
138
|
-
directly for a release bundle.
|
|
137
|
+
Python 3.10–3.14 and the strict Sphinx build. Releases are published
|
|
138
|
+
exclusively to PyPI; see `docs/*/contributor/pypi-release.md`.
|
|
139
139
|
|
|
140
140
|
Do not commit or perform other git mutations unless the user explicitly
|
|
141
141
|
asks.
|
|
@@ -145,7 +145,7 @@ asks.
|
|
|
145
145
|
- Python 3.10+. Treat `pyproject.toml` as the authoritative dependency
|
|
146
146
|
list: `[project.dependencies]` contains core runtime dependencies, while
|
|
147
147
|
`[project.optional-dependencies]` contains separately installable extras
|
|
148
|
-
(`test`, `
|
|
148
|
+
(`test`, `docs`, `dev`). Runtime-feature extras must
|
|
149
149
|
remain lazy-imported by their feature paths (e.g. Paramiko is only
|
|
150
150
|
imported inside remote/SSH code); test/build extras must stay out of
|
|
151
151
|
normal runtime paths. Do not promote an extra dependency to core, or add a
|
|
@@ -186,5 +186,23 @@ change:
|
|
|
186
186
|
- Contributor-facing processes → `docs/*/contributor/`; navigation →
|
|
187
187
|
`docs/*/index.md`
|
|
188
188
|
|
|
189
|
-
Version markers in docs (`operon` 0.
|
|
190
|
-
schema 1.4) must match `pyproject.toml` and the code.
|
|
189
|
+
Version markers in docs (`operon` 0.7.0, database schema 2.9, metadata
|
|
190
|
+
schema 1.4) must match `pyproject.toml` and the code. Do not write the
|
|
191
|
+
current values literally in Markdown sources: use the `myst_substitutions`
|
|
192
|
+
references `{{ operon_version }}`, `{{ db_schema }}`, and
|
|
193
|
+
`{{ metadata_schema }}`, which `docs/conf.py` resolves from the single
|
|
194
|
+
sources above at build time. Substitutions expand in paragraph text only,
|
|
195
|
+
never inside code spans or fenced code blocks — examples there use
|
|
196
|
+
`<version>` placeholders instead. Intentional historical pins stay literal — either on the
|
|
197
|
+
allowlisted era-pinned pages (`docs/*/operations/database-compatibility.md`,
|
|
198
|
+
`docs/*/operations/ncbi-recovery-migration.md`) or on a line carrying an
|
|
199
|
+
inline `<!-- version-pin -->` marker — and
|
|
200
|
+
`tests/unit/test_docs_versions.py` fails on any other hardcoded current
|
|
201
|
+
version. Only this `AGENTS.md` keeps literal current markers (it is not
|
|
202
|
+
Sphinx-rendered); update the list above when bumping.
|
|
203
|
+
|
|
204
|
+
## Special Note For Codex/ChatGPT
|
|
205
|
+
|
|
206
|
+
Due to specific limitations of the sandbox environment, executing certain TUI test code may cause the system to freeze; this often occurs on Codex/ChatGPT. The specific reason is that when this test code runs in the sandbox, it may results a Textual/asyncio cleanup block, and reports "FAIL" due to timeout.
|
|
207
|
+
|
|
208
|
+
If you are Codex/ChatGPT, please execute TUI-related test code OUTSIDE the sandbox.
|
|
@@ -12,6 +12,6 @@ recursive-include benchmarks *.tsv
|
|
|
12
12
|
recursive-include docs *.css *.html *.js *.md *.py *.txt
|
|
13
13
|
prune docs/_build
|
|
14
14
|
recursive-include operon *.py *.pyx *.tcss
|
|
15
|
+
recursive-include operon/tui/assets *.png *.z *.md
|
|
15
16
|
recursive-include tests *.py
|
|
16
|
-
recursive-include tools *.py
|
|
17
17
|
exclude operon/qc_module/_parsers.c
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OperonDBS
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.2
|
|
4
4
|
Summary: Operon the Database System: Archive, Quality-Control, Organize, Analyze and Release Your Bio-Data
|
|
5
5
|
Author-email: hyli360 <lihuanyu2003@gmail.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -32,20 +32,13 @@ Requires-Dist: pytest>=8.0; extra == "test"
|
|
|
32
32
|
Requires-Dist: setuptools>=77; extra == "test"
|
|
33
33
|
Requires-Dist: textual>=8.0; extra == "test"
|
|
34
34
|
Requires-Dist: cython>=3.0; extra == "test"
|
|
35
|
-
Provides-Extra: build
|
|
36
|
-
Requires-Dist: cx-Freeze>=8.4; extra == "build"
|
|
37
|
-
Requires-Dist: myst-parser<5,>=4.0; extra == "build"
|
|
38
|
-
Requires-Dist: Sphinx<9,>=7.4; extra == "build"
|
|
39
|
-
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "build"
|
|
40
|
-
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "build"
|
|
41
|
-
Requires-Dist: cython>=3.0; extra == "build"
|
|
42
35
|
Provides-Extra: docs
|
|
43
36
|
Requires-Dist: Sphinx<9,>=7.4; extra == "docs"
|
|
44
37
|
Requires-Dist: myst-parser<5,>=4.0; extra == "docs"
|
|
45
38
|
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "docs"
|
|
39
|
+
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "docs"
|
|
46
40
|
Provides-Extra: dev
|
|
47
41
|
Requires-Dist: coverage>=7.0; extra == "dev"
|
|
48
|
-
Requires-Dist: cx-Freeze>=8.4; extra == "dev"
|
|
49
42
|
Requires-Dist: cython>=3.0; extra == "dev"
|
|
50
43
|
Requires-Dist: pytest-cov>=7.0; extra == "dev"
|
|
51
44
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
@@ -57,7 +50,7 @@ Dynamic: license-file
|
|
|
57
50
|
|
|
58
51
|
# Operon
|
|
59
52
|
|
|
60
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [](https://codecov.io/gh/HYLi360/Operon)
|
|
61
54
|
|
|
62
55
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
63
56
|
|
|
@@ -78,7 +71,7 @@ A Python-based, **file-based database** designed for large-scale genomic data, u
|
|
|
78
71
|
|
|
79
72
|
- Python 3.10+
|
|
80
73
|
- Runtime dependencies: `PyYAML`, `requests`, `aiohttp`, `Biopython`, `Paramiko`, `Textual`, and `questionary`; the built-in QC acceleration extension is compiled when the package is built
|
|
81
|
-
- Optional extras: `test` (pytest and Cython), `
|
|
74
|
+
- Optional extras: `test` (pytest and Cython), `docs` (documentation tooling), and `dev` (all development/build dependencies)
|
|
82
75
|
|
|
83
76
|
## Install
|
|
84
77
|
|
|
@@ -95,14 +88,6 @@ For an editable checkout, run from the repository root:
|
|
|
95
88
|
python -m pip install -e '.[dev]'
|
|
96
89
|
```
|
|
97
90
|
|
|
98
|
-
PyPI installation does not use cx_Freeze. To build the separately distributed
|
|
99
|
-
standalone application instead:
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
python -m pip install -e '.[build]'
|
|
103
|
-
python tools/build.py
|
|
104
|
-
```
|
|
105
|
-
|
|
106
91
|
## Documentation
|
|
107
92
|
|
|
108
93
|
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). To build the Sphinx site locally:
|
|
@@ -7,8 +7,8 @@ README.md
|
|
|
7
7
|
README_ZH.md
|
|
8
8
|
pyproject.toml
|
|
9
9
|
setup.py
|
|
10
|
-
.github/workflows/deploy.yml
|
|
11
10
|
.github/workflows/publish.yml
|
|
11
|
+
.github/workflows/test.yml
|
|
12
12
|
OperonDBS.egg-info/PKG-INFO
|
|
13
13
|
OperonDBS.egg-info/SOURCES.txt
|
|
14
14
|
OperonDBS.egg-info/dependency_links.txt
|
|
@@ -33,7 +33,6 @@ docs/en/architecture/overview.md
|
|
|
33
33
|
docs/en/architecture/qc-and-rules.md
|
|
34
34
|
docs/en/architecture/release-lifecycle.md
|
|
35
35
|
docs/en/architecture/taxonomy-coverage.md
|
|
36
|
-
docs/en/contributor/application-release.md
|
|
37
36
|
docs/en/contributor/development-testing.md
|
|
38
37
|
docs/en/contributor/documentation-deployment.md
|
|
39
38
|
docs/en/contributor/index.md
|
|
@@ -60,6 +59,7 @@ docs/en/operations/database-compatibility.md
|
|
|
60
59
|
docs/en/operations/index.md
|
|
61
60
|
docs/en/operations/ncbi-recovery-migration.md
|
|
62
61
|
docs/en/operations/qc-performance.md
|
|
62
|
+
docs/en/reference/behaviors-and-limitations.md
|
|
63
63
|
docs/en/reference/cli-analysis.md
|
|
64
64
|
docs/en/reference/cli-decisions-reports.md
|
|
65
65
|
docs/en/reference/cli-files-qc.md
|
|
@@ -84,7 +84,6 @@ docs/zh/architecture/overview.md
|
|
|
84
84
|
docs/zh/architecture/qc-and-rules.md
|
|
85
85
|
docs/zh/architecture/release-lifecycle.md
|
|
86
86
|
docs/zh/architecture/taxonomy-coverage.md
|
|
87
|
-
docs/zh/contributor/application-release.md
|
|
88
87
|
docs/zh/contributor/development-testing.md
|
|
89
88
|
docs/zh/contributor/documentation-deployment.md
|
|
90
89
|
docs/zh/contributor/index.md
|
|
@@ -111,6 +110,7 @@ docs/zh/operations/database-compatibility.md
|
|
|
111
110
|
docs/zh/operations/index.md
|
|
112
111
|
docs/zh/operations/ncbi-recovery-migration.md
|
|
113
112
|
docs/zh/operations/qc-performance.md
|
|
113
|
+
docs/zh/reference/behaviors-and-limitations.md
|
|
114
114
|
docs/zh/reference/cli-analysis.md
|
|
115
115
|
docs/zh/reference/cli-decisions-reports.md
|
|
116
116
|
docs/zh/reference/cli-files-qc.md
|
|
@@ -165,14 +165,21 @@ operon/tui/actions.py
|
|
|
165
165
|
operon/tui/app.py
|
|
166
166
|
operon/tui/app.tcss
|
|
167
167
|
operon/tui/data.py
|
|
168
|
+
operon/tui/splash.py
|
|
169
|
+
operon/tui/splash_terminal.py
|
|
170
|
+
operon/tui/assets/splash.png
|
|
171
|
+
operon/tui/assets/splash.rgb.z
|
|
168
172
|
operon/tui/screens/__init__.py
|
|
169
173
|
operon/tui/screens/common.py
|
|
170
174
|
operon/tui/screens/config.py
|
|
175
|
+
operon/tui/screens/coverage.py
|
|
171
176
|
operon/tui/screens/decisions.py
|
|
172
177
|
operon/tui/screens/entities.py
|
|
173
178
|
operon/tui/screens/files.py
|
|
174
179
|
operon/tui/screens/files_ops.py
|
|
175
180
|
operon/tui/screens/home.py
|
|
181
|
+
operon/tui/screens/import_wizard.py
|
|
182
|
+
operon/tui/screens/publish.py
|
|
176
183
|
operon/tui/screens/runs.py
|
|
177
184
|
tests/__init__.py
|
|
178
185
|
tests/helpers.py
|
|
@@ -182,11 +189,11 @@ tests/integration/__init__.py
|
|
|
182
189
|
tests/integration/test_analysis_resume.py
|
|
183
190
|
tests/integration/test_analysis_shutdown.py
|
|
184
191
|
tests/integration/test_analysis_tools.py
|
|
185
|
-
tests/integration/test_application_build.py
|
|
186
192
|
tests/integration/test_execution_backends.py
|
|
187
193
|
tests/integration/test_lineage_cascade.py
|
|
188
194
|
tests/integration/test_ncbi_datasets_adapter.py
|
|
189
195
|
tests/integration/test_pipeline_and_release.py
|
|
196
|
+
tests/integration/test_python_packaging.py
|
|
190
197
|
tests/integration/test_taxonomy_coverage.py
|
|
191
198
|
tests/regression/__init__.py
|
|
192
199
|
tests/regression/test_correctness.py
|
|
@@ -197,6 +204,7 @@ tests/unit/test_cli_edges.py
|
|
|
197
204
|
tests/unit/test_config_workflow_edges.py
|
|
198
205
|
tests/unit/test_coverage_edges.py
|
|
199
206
|
tests/unit/test_database_edges_more.py
|
|
207
|
+
tests/unit/test_docs_versions.py
|
|
200
208
|
tests/unit/test_environment.py
|
|
201
209
|
tests/unit/test_execution.py
|
|
202
210
|
tests/unit/test_execution_edges.py
|
|
@@ -224,7 +232,8 @@ tests/unit/test_taxonomy_edges.py
|
|
|
224
232
|
tests/unit/test_tools_edges.py
|
|
225
233
|
tests/unit/test_tui.py
|
|
226
234
|
tests/unit/test_tui_config.py
|
|
235
|
+
tests/unit/test_tui_publish.py
|
|
236
|
+
tests/unit/test_tui_splash_terminal.py
|
|
227
237
|
tests/unit/test_tui_writes.py
|
|
228
238
|
tests/unit/test_views_release_reports_edges.py
|
|
229
|
-
tests/unit/test_workflow_cli.py
|
|
230
|
-
tools/build.py
|
|
239
|
+
tests/unit/test_workflow_cli.py
|
|
@@ -6,19 +6,8 @@ questionary>=2.1
|
|
|
6
6
|
requests>=2.32
|
|
7
7
|
textual>=8.0
|
|
8
8
|
|
|
9
|
-
[build]
|
|
10
|
-
cx-Freeze>=8.4
|
|
11
|
-
myst-parser<5,>=4.0
|
|
12
|
-
Sphinx<9,>=7.4
|
|
13
|
-
sphinx-rtd-theme<4,>=3.0
|
|
14
|
-
cython>=3.0
|
|
15
|
-
|
|
16
|
-
[build:python_version < "3.11"]
|
|
17
|
-
tomli>=2.0
|
|
18
|
-
|
|
19
9
|
[dev]
|
|
20
10
|
coverage>=7.0
|
|
21
|
-
cx-Freeze>=8.4
|
|
22
11
|
cython>=3.0
|
|
23
12
|
pytest-cov>=7.0
|
|
24
13
|
pytest>=8.0
|
|
@@ -34,6 +23,9 @@ Sphinx<9,>=7.4
|
|
|
34
23
|
myst-parser<5,>=4.0
|
|
35
24
|
sphinx-rtd-theme<4,>=3.0
|
|
36
25
|
|
|
26
|
+
[docs:python_version < "3.11"]
|
|
27
|
+
tomli>=2.0
|
|
28
|
+
|
|
37
29
|
[test]
|
|
38
30
|
coverage>=7.0
|
|
39
31
|
paramiko>=3.4
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: OperonDBS
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.2
|
|
4
4
|
Summary: Operon the Database System: Archive, Quality-Control, Organize, Analyze and Release Your Bio-Data
|
|
5
5
|
Author-email: hyli360 <lihuanyu2003@gmail.com>
|
|
6
6
|
License-Expression: AGPL-3.0-or-later
|
|
@@ -32,20 +32,13 @@ Requires-Dist: pytest>=8.0; extra == "test"
|
|
|
32
32
|
Requires-Dist: setuptools>=77; extra == "test"
|
|
33
33
|
Requires-Dist: textual>=8.0; extra == "test"
|
|
34
34
|
Requires-Dist: cython>=3.0; extra == "test"
|
|
35
|
-
Provides-Extra: build
|
|
36
|
-
Requires-Dist: cx-Freeze>=8.4; extra == "build"
|
|
37
|
-
Requires-Dist: myst-parser<5,>=4.0; extra == "build"
|
|
38
|
-
Requires-Dist: Sphinx<9,>=7.4; extra == "build"
|
|
39
|
-
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "build"
|
|
40
|
-
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "build"
|
|
41
|
-
Requires-Dist: cython>=3.0; extra == "build"
|
|
42
35
|
Provides-Extra: docs
|
|
43
36
|
Requires-Dist: Sphinx<9,>=7.4; extra == "docs"
|
|
44
37
|
Requires-Dist: myst-parser<5,>=4.0; extra == "docs"
|
|
45
38
|
Requires-Dist: sphinx-rtd-theme<4,>=3.0; extra == "docs"
|
|
39
|
+
Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "docs"
|
|
46
40
|
Provides-Extra: dev
|
|
47
41
|
Requires-Dist: coverage>=7.0; extra == "dev"
|
|
48
|
-
Requires-Dist: cx-Freeze>=8.4; extra == "dev"
|
|
49
42
|
Requires-Dist: cython>=3.0; extra == "dev"
|
|
50
43
|
Requires-Dist: pytest-cov>=7.0; extra == "dev"
|
|
51
44
|
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
@@ -57,7 +50,7 @@ Dynamic: license-file
|
|
|
57
50
|
|
|
58
51
|
# Operon
|
|
59
52
|
|
|
60
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [](https://codecov.io/gh/HYLi360/Operon)
|
|
61
54
|
|
|
62
55
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
63
56
|
|
|
@@ -78,7 +71,7 @@ A Python-based, **file-based database** designed for large-scale genomic data, u
|
|
|
78
71
|
|
|
79
72
|
- Python 3.10+
|
|
80
73
|
- Runtime dependencies: `PyYAML`, `requests`, `aiohttp`, `Biopython`, `Paramiko`, `Textual`, and `questionary`; the built-in QC acceleration extension is compiled when the package is built
|
|
81
|
-
- Optional extras: `test` (pytest and Cython), `
|
|
74
|
+
- Optional extras: `test` (pytest and Cython), `docs` (documentation tooling), and `dev` (all development/build dependencies)
|
|
82
75
|
|
|
83
76
|
## Install
|
|
84
77
|
|
|
@@ -95,14 +88,6 @@ For an editable checkout, run from the repository root:
|
|
|
95
88
|
python -m pip install -e '.[dev]'
|
|
96
89
|
```
|
|
97
90
|
|
|
98
|
-
PyPI installation does not use cx_Freeze. To build the separately distributed
|
|
99
|
-
standalone application instead:
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
python -m pip install -e '.[build]'
|
|
103
|
-
python tools/build.py
|
|
104
|
-
```
|
|
105
|
-
|
|
106
91
|
## Documentation
|
|
107
92
|
|
|
108
93
|
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). To build the Sphinx site locally:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Operon
|
|
2
2
|
|
|
3
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [](https://codecov.io/gh/HYLi360/Operon)
|
|
4
4
|
|
|
5
5
|
A Python-based, **file-based database** designed for large-scale genomic data, used for archiving, quality control, analysis, and deterministic automation.
|
|
6
6
|
|
|
@@ -21,7 +21,7 @@ A Python-based, **file-based database** designed for large-scale genomic data, u
|
|
|
21
21
|
|
|
22
22
|
- Python 3.10+
|
|
23
23
|
- Runtime dependencies: `PyYAML`, `requests`, `aiohttp`, `Biopython`, `Paramiko`, `Textual`, and `questionary`; the built-in QC acceleration extension is compiled when the package is built
|
|
24
|
-
- Optional extras: `test` (pytest and Cython), `
|
|
24
|
+
- Optional extras: `test` (pytest and Cython), `docs` (documentation tooling), and `dev` (all development/build dependencies)
|
|
25
25
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
@@ -38,14 +38,6 @@ For an editable checkout, run from the repository root:
|
|
|
38
38
|
python -m pip install -e '.[dev]'
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
PyPI installation does not use cx_Freeze. To build the separately distributed
|
|
42
|
-
standalone application instead:
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
python -m pip install -e '.[build]'
|
|
46
|
-
python tools/build.py
|
|
47
|
-
```
|
|
48
|
-
|
|
49
41
|
## Documentation
|
|
50
42
|
|
|
51
43
|
The complete documentation is maintained in [English](docs/en/index.md) and [Chinese](docs/zh/index.md). To build the Sphinx site locally:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Operon
|
|
2
2
|
|
|
3
|
-
[](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [](https://codecov.io/gh/HYLi360/Operon)
|
|
4
4
|
|
|
5
5
|
一个基于 Python 的、面向大规模基因组数据的**基于文件的数据库**,用于归档、质控、分析与确定性自动化处理。
|
|
6
6
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
- Python 3.10 及以上版本
|
|
21
21
|
- 运行时依赖:`PyYAML`、`requests`、`aiohttp`、`Biopython`、`Paramiko`、`Textual` 与 `questionary`;内置 QC 加速扩展在构建软件包时编译
|
|
22
|
-
- 可选 extras:`test`(pytest 与 Cython)、`
|
|
22
|
+
- 可选 extras:`test`(pytest 与 Cython)、`docs`(文档工具)和 `dev`(全部开发/构建依赖)
|
|
23
23
|
|
|
24
24
|
## 安装
|
|
25
25
|
|
|
@@ -36,13 +36,6 @@ python -m pip install OperonDBS
|
|
|
36
36
|
python -m pip install -e '.[dev]'
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
PyPI 安装不使用 cx_Freeze。若要另行构建独立可执行应用:
|
|
40
|
-
|
|
41
|
-
```bash
|
|
42
|
-
python -m pip install -e '.[build]'
|
|
43
|
-
python tools/build.py
|
|
44
|
-
```
|
|
45
|
-
|
|
46
39
|
## 文档
|
|
47
40
|
|
|
48
41
|
完整文档同时维护[中文](docs/zh/index.md)和[英文](docs/en/index.md)版本。本地构建 Sphinx 站点:
|
|
@@ -2,22 +2,60 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import re
|
|
5
6
|
from importlib.metadata import PackageNotFoundError, version
|
|
6
7
|
from pathlib import Path
|
|
7
8
|
|
|
9
|
+
try:
|
|
10
|
+
import tomllib
|
|
11
|
+
except ModuleNotFoundError: # Python 3.10
|
|
12
|
+
import tomli as tomllib
|
|
13
|
+
|
|
8
14
|
|
|
9
15
|
DOCS_DIR = Path(__file__).resolve().parent
|
|
16
|
+
REPO_ROOT = DOCS_DIR.parent
|
|
10
17
|
|
|
11
18
|
project = "Operon"
|
|
12
|
-
author = "Operon
|
|
13
|
-
copyright = "2026,
|
|
19
|
+
author = "Project Operon Development Group"
|
|
20
|
+
copyright = f"2026, {author}. All Rights Reserved."
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
|
|
23
|
+
def _package_version() -> str:
|
|
24
|
+
try:
|
|
25
|
+
return version("OperonDBS")
|
|
26
|
+
except PackageNotFoundError:
|
|
27
|
+
with (REPO_ROOT / "pyproject.toml").open("rb") as handle:
|
|
28
|
+
return tomllib.load(handle)["project"]["version"]
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _source_constant(module: str, name: str) -> str:
|
|
32
|
+
"""Read a module-level string constant, falling back to the source file."""
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
imported = __import__(f"operon.{module}", fromlist=[name])
|
|
36
|
+
return str(getattr(imported, name))
|
|
37
|
+
except Exception:
|
|
38
|
+
source = (REPO_ROOT / "operon" / f"{module}.py").read_text(encoding="utf-8")
|
|
39
|
+
match = re.search(rf'^{name} = "([^"]+)"', source, re.MULTILINE)
|
|
40
|
+
if match is None:
|
|
41
|
+
raise RuntimeError(f"cannot resolve {name} from operon/{module}.py")
|
|
42
|
+
return match.group(1)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
release = _package_version()
|
|
19
46
|
version = release
|
|
20
47
|
|
|
48
|
+
# Markdown sources reference these as {{ operon_version }} / {{ db_schema }} /
|
|
49
|
+
# {{ metadata_schema }} in paragraph text. Substitutions do not expand inside
|
|
50
|
+
# code spans or fenced code blocks, so examples there use `<version>`
|
|
51
|
+
# placeholders instead. Historical version mentions stay literal and are
|
|
52
|
+
# guarded by tests/unit/test_docs_versions.py.
|
|
53
|
+
myst_substitutions = {
|
|
54
|
+
"operon_version": release,
|
|
55
|
+
"db_schema": _source_constant("database", "SCHEMA_VERSION"),
|
|
56
|
+
"metadata_schema": _source_constant("schema", "METADATA_SCHEMA_VERSION"),
|
|
57
|
+
}
|
|
58
|
+
|
|
21
59
|
extensions = ["myst_parser"]
|
|
22
60
|
source_suffix = {".md": "markdown"}
|
|
23
61
|
root_doc = "index"
|
|
@@ -27,7 +65,7 @@ templates_path = ["_templates"]
|
|
|
27
65
|
# resolves their relative Markdown links as Sphinx cross-references, while the
|
|
28
66
|
# toctrees provide one coherent navigation hierarchy for both languages.
|
|
29
67
|
myst_heading_anchors = 4
|
|
30
|
-
myst_enable_extensions = ["colon_fence", "deflist", "fieldlist"]
|
|
68
|
+
myst_enable_extensions = ["colon_fence", "deflist", "fieldlist", "substitution"]
|
|
31
69
|
|
|
32
70
|
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
|
|
33
71
|
nitpicky = True
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Current boundaries
|
|
4
4
|
|
|
5
|
-
The built-in source adapter currently covers NCBI Datasets; sources such as ENA remain part of the future extension boundary. Taxonomy coverage currently supports only NCBI Taxonomy; GTDB and the NCBI↔GTDB crosswalk are not yet implemented. Built-in QC covers file level, reads basics, assembly structure, and annotation structure. BUSCO is natively integrated through directory output and a JSON summary parser; tools without a parser yet — QUAST, Merqury, Kraken2, CheckM2, and similar — can still be integrated through `run-external` + `import-qc`. Downstream comparative-genomics analysis is done by external workflows in `analysis/`; `operon` is responsible for data admission, provenance, and publication.
|
|
5
|
+
The built-in source adapter currently covers NCBI Datasets; sources such as ENA remain part of the future extension boundary. Taxonomy coverage currently supports only NCBI Taxonomy; GTDB and the NCBI↔GTDB crosswalk are not yet implemented. Built-in QC covers file level, generic sequence basics for non-genome FASTA (CDS/protein), reads basics, assembly structure, and annotation structure. BUSCO is natively integrated through directory output and a JSON summary parser; tools without a parser yet — QUAST, Merqury, Kraken2, CheckM2, and similar — can still be integrated through `run-external` + `import-qc`. Downstream comparative-genomics analysis is done by external workflows in `analysis/`; `operon` is responsible for data admission, provenance, and publication.
|
|
6
6
|
|
|
7
7
|
The contract between downstream workflows and the database is a closed loop formed by `operon export` and `operon adopt`: export materializes the selected entities by file identity into a `data/<entity_type>/<entity_id>/<filename>` layout, accompanied by `manifest.tsv` (with SHA-256 recomputed over the materialized bytes), a `qc.tsv` QC long-table snapshot, `checksums.sha256`, and `provenance.json` (the input-side manifest); after consuming this artifact set, the external workflow uses adopt to re-register derived artifacts as first-class manifest members — materialized under `analysis/adopted/<entity_id>/`, inheriting the ingest idempotency/conflict invariants, with file-to-file lineage edges recorded in `file_lineage` (the output-side manifest). Adopted products can be QC'd, evaluated, exported, released, and selected by `analyze` as inputs of downstream recipes (cascading analysis). Downstream workflows should read and write through this contract instead of reading the database directly. Orchestration of cascading workflows (dependency graphs, parallelism, retries) belongs to workflow managers such as snakemake/nextflow; `operon` is responsible for data admission, lineage, and publication, while `run-pipeline` only covers simple single-file chaining. The batch adopt manifest format is described in the [external analysis guide](../guides/external-analysis.md). Export is semantically complementary to release: release targets publication (QC-gated, immutable snapshot), while export targets analysis inputs (arbitrary selection criteria, materialized on demand).
|
|
8
8
|
|
|
@@ -30,9 +30,9 @@ Execution environment capture (schema 2.8, `environment.py`): all three backends
|
|
|
30
30
|
|
|
31
31
|
A failed probe leaves the run's `environment_id` NULL without raising an error or affecting the run; rows from before 2.8 are likewise NULL.
|
|
32
32
|
|
|
33
|
-
Recipe versioning and snapshots (schema 2.9): a recipe gains an optional `version:` field (a positive integer, default 1; invalid values are rejected at configuration validation). As `analyze` processes each candidate file it records the current recipe together with the verbatim spec of its referenced tool into the `recipe_snapshots` table: the snapshot document is `{"recipe": <the recipe's raw mapping>, "tool": <the referenced tool spec's raw mapping>}`, content-addressed by the SHA-256 of its canonicalized JSON and deduplicated by `UNIQUE(recipe_name, recipe_version, recipe_sha256)` — so edits to the tool definition also produce a new snapshot, and cache hits record a snapshot of the current configuration as well. `analysis_jobs.recipe_snapshot_id` points back to the exact configuration that produced the job; jobs adopted during resume inherit the original job's snapshot id (they were produced by that configuration, not today's). Inspect them with `operon recipes list / history / show`; the QC-profile counterparts recorded in `qc_profiles` are inspected with `operon profiles history / show`. Restoration via the CLI is print-only in both cases: a human copies the output back into the configuration YAML, and the CLI never rewrites files in place. The audited alternative is the TUI Config screen, whose structured editors save every change as the next version with a new snapshot and can restore any recorded snapshot into the editor (saving it creates the next version); TUI recipe saves normalize `tools.yaml` formatting and drop hand-written comments.
|
|
33
|
+
Recipe versioning and snapshots (schema 2.9): a recipe gains an optional `version:` field (a positive integer, default 1; invalid values are rejected at configuration validation). As `analyze` processes each candidate file it records the current recipe together with the verbatim spec of its referenced tool into the `recipe_snapshots` table: the snapshot document is `{"recipe": <the recipe's raw mapping>, "tool": <the referenced tool spec's raw mapping>}`, content-addressed by the SHA-256 of its canonicalized JSON and deduplicated by `UNIQUE(recipe_name, recipe_version, recipe_sha256)` — so edits to the tool definition also produce a new snapshot, and cache hits record a snapshot of the current configuration as well. `analysis_jobs.recipe_snapshot_id` points back to the exact configuration that produced the job; jobs adopted during resume inherit the original job's snapshot id (they were produced by that configuration, not today's). Inspect them with `operon recipes list / history / show`; the QC-profile counterparts recorded in `qc_profiles` are inspected with `operon profiles history / show`. Restoration via the CLI is print-only in both cases: a human copies the output back into the configuration YAML, and the CLI never rewrites files in place. The audited alternative is the TUI Config screen, whose structured editors save every change as the next version with a new snapshot and can restore any recorded snapshot into the editor (saving it creates the next version); TUI recipe saves normalize `tools.yaml` formatting and drop hand-written comments. <!-- version-pin -->
|
|
34
34
|
|
|
35
|
-
Run resource-usage recording (schema 2.9): `workflow_runs` gains `duration_seconds` (wall clock; previously only present in the JSONL), `avg_rss_mb` (average RSS), and `cpu_seconds` (core-seconds), and the pre-existing `max_rss_mb` column is now actually populated. Collection is per backend:
|
|
35
|
+
Run resource-usage recording (schema 2.9): `workflow_runs` gains `duration_seconds` (wall clock; previously only present in the JSONL), `avg_rss_mb` (average RSS), and `cpu_seconds` (core-seconds), and the pre-existing `max_rss_mb` column is now actually populated. Collection is per backend: <!-- version-pin -->
|
|
36
36
|
|
|
37
37
|
- `local`: a sampling thread polls `VmRSS` in `/proc/<pid>/status` when procfs is available and otherwise uses the POSIX `ps` RSS field (including on macOS) for peak and average; core-seconds come from the `getrusage(RUSAGE_CHILDREN)` delta across the run;
|
|
38
38
|
- `slurm`: after the job finishes, `sacct` is queried with extended fields (`MaxRSS`/`AveRSS`/`Elapsed`/`TotalCPU`); remote Slurm (`ssh` with `scheduler: slurm`) follows the same path;
|
|
@@ -25,7 +25,7 @@ The `remotes:` section of `project.yaml` can configure one or more SFTP remote m
|
|
|
25
25
|
- After `pull` restores a locally missing file, `files.status` returns to `CHECKSUM_VERIFIED`, and this change is written to `changes` just like the status changes from `verify`/`evict`;
|
|
26
26
|
- `ingest --source` also directly accepts `sftp://[user@]host[:port]/path` and `remote://<name>/<path>`; the latter must exist in the remote manifest and is identity-checked first, while the former is downloaded and assigned a fresh identity by ingest, then follows exactly the same archiving flow as a local file.
|
|
27
27
|
|
|
28
|
-
Paramiko is a core runtime dependency but remains lazily imported, so local-only commands do not initialize the SSH stack.
|
|
28
|
+
Paramiko is a core runtime dependency but remains lazily imported, so local-only commands do not initialize the SSH stack.
|
|
29
29
|
|
|
30
30
|
## Local control plane and remote data plane
|
|
31
31
|
|
|
@@ -50,7 +50,7 @@ Identity and relationship policy:
|
|
|
50
50
|
- Records without a BioSample use an assembly-specific sample;
|
|
51
51
|
- Annotation identity includes source accession, provider, version, and release date, with files automatically assigned to the corresponding `ANN_`; pre-2.6 rows are continued with strictly identical metadata, avoiding duplicate assignment when the provider is not `NCBI *`.
|
|
52
52
|
|
|
53
|
-
Before writing metadata, the adapter computes SHA-256 for the files to be archived and checks both in-package conflicts for the same entity/role and existing manifest conflicts. Alternate genomes/reports from paired sources use controlled roles with `_genbank`/`_refseq` suffixes, so bytes from different sources can coexist without relaxing the no-overwrite constraint on the same entity and role. Original reports/ZIPs are stored by SHA-256 under `raw/metadata/ncbi_datasets/`; import summaries are written to `changes` and the workflow provenance. On a formal import into an old project, adapter-owned fields and source-file roles are merged in, and the metadata schema is upgraded to
|
|
53
|
+
Before writing metadata, the adapter computes SHA-256 for the files to be archived and checks both in-package conflicts for the same entity/role and existing manifest conflicts. Alternate genomes/reports from paired sources use controlled roles with `_genbank`/`_refseq` suffixes, so bytes from different sources can coexist without relaxing the no-overwrite constraint on the same entity and role. Original reports/ZIPs are stored by SHA-256 under `raw/metadata/ncbi_datasets/`; import summaries are written to `changes` and the workflow provenance. On a formal import into an old project, adapter-owned fields and source-file roles are merged in, and the metadata schema is upgraded to {{ metadata_schema }}; custom fields are preserved, and dry runs use only the in-memory upgraded schema.
|
|
54
54
|
|
|
55
55
|
An adapter run writes a `running` workflow before processing begins; each accession's state is kept in `adapter_run_items`. Failed or interrupted runs keep their state, and a resumed run uses a new run ID with `resumes_run_id`; a request whose SHA-256 does not match is refused. Field-level before/after values of metadata upserts are linked to the concrete run through `changes.workflow_run_id`. Anomalies from the old adapter are handled by an explicit `ncbi-reconcile` that generates and applies a compensation plan, preserving all old rows and files through `entity_supersessions`.
|
|
56
56
|
|