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.
Files changed (247) hide show
  1. {operondbs-0.6.2 → operondbs-0.7.2}/.github/workflows/publish.yml +14 -3
  2. operondbs-0.6.2/.github/workflows/deploy.yml → operondbs-0.7.2/.github/workflows/test.yml +1 -22
  3. {operondbs-0.6.2 → operondbs-0.7.2}/AGENTS.md +39 -21
  4. {operondbs-0.6.2 → operondbs-0.7.2}/MANIFEST.in +1 -1
  5. {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/PKG-INFO +4 -19
  6. {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/SOURCES.txt +15 -6
  7. {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/requires.txt +3 -11
  8. {operondbs-0.6.2 → operondbs-0.7.2}/PKG-INFO +4 -19
  9. {operondbs-0.6.2 → operondbs-0.7.2}/README.md +2 -10
  10. {operondbs-0.6.2 → operondbs-0.7.2}/README_ZH.md +2 -9
  11. {operondbs-0.6.2 → operondbs-0.7.2}/docs/conf.py +45 -7
  12. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/extensibility.md +1 -1
  13. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/external-analysis.md +2 -2
  14. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/files-and-storage.md +1 -1
  15. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/metadata-and-data-model.md +1 -1
  16. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/overview.md +8 -6
  17. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/qc-and-rules.md +1 -0
  18. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/development-testing.md +15 -1
  19. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/documentation-deployment.md +0 -2
  20. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/index.md +0 -2
  21. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/pypi-release.md +6 -4
  22. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/contributor/repository-guide.md +0 -1
  23. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/first-project.md +1 -1
  24. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/installation.md +5 -15
  25. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/backup-migration.md +6 -2
  26. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/curation-lifecycle.md +11 -0
  27. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/external-analysis.md +4 -1
  28. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/metadata-import.md +1 -1
  29. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/ncbi-datasets.md +1 -1
  30. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/qc-profiles.md +1 -1
  31. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/remote-storage.md +4 -1
  32. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/troubleshooting.md +4 -0
  33. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/index.md +1 -1
  34. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/database-compatibility.md +1 -1
  35. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/ncbi-recovery-migration.md +1 -1
  36. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/overview.md +2 -0
  37. operondbs-0.7.2/docs/en/reference/behaviors-and-limitations.md +192 -0
  38. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-decisions-reports.md +7 -3
  39. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-files-qc.md +4 -2
  40. operondbs-0.7.2/docs/en/reference/cli-tui.md +242 -0
  41. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/index.md +2 -0
  42. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/recipe-fields.md +1 -1
  43. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/recipe-overview.md +1 -1
  44. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/recipe-parsers-examples.md +1 -1
  45. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/extensibility.md +1 -1
  46. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/external-analysis.md +2 -2
  47. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/files-and-storage.md +1 -1
  48. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/metadata-and-data-model.md +1 -1
  49. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/overview.md +8 -6
  50. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/qc-and-rules.md +1 -0
  51. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/development-testing.md +16 -1
  52. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/documentation-deployment.md +0 -2
  53. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/index.md +0 -2
  54. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/pypi-release.md +5 -3
  55. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/contributor/repository-guide.md +0 -1
  56. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/first-project.md +1 -1
  57. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/installation.md +4 -12
  58. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/backup-migration.md +10 -4
  59. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/curation-lifecycle.md +15 -0
  60. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/external-analysis.md +9 -2
  61. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/metadata-import.md +1 -1
  62. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/ncbi-datasets.md +1 -1
  63. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/qc-profiles.md +1 -1
  64. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/remote-storage.md +7 -1
  65. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/troubleshooting.md +6 -0
  66. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/index.md +1 -1
  67. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/database-compatibility.md +1 -1
  68. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/ncbi-recovery-migration.md +1 -2
  69. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/overview.md +2 -0
  70. operondbs-0.7.2/docs/zh/reference/behaviors-and-limitations.md +190 -0
  71. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-decisions-reports.md +7 -4
  72. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-files-qc.md +4 -2
  73. operondbs-0.7.2/docs/zh/reference/cli-tui.md +200 -0
  74. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/index.md +2 -0
  75. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/recipe-fields.md +2 -2
  76. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/recipe-overview.md +2 -2
  77. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/recipe-parsers-examples.md +1 -1
  78. {operondbs-0.6.2 → operondbs-0.7.2}/operon/backup.py +50 -8
  79. {operondbs-0.6.2 → operondbs-0.7.2}/operon/cli.py +76 -4
  80. {operondbs-0.6.2 → operondbs-0.7.2}/operon/database.py +77 -7
  81. {operondbs-0.6.2 → operondbs-0.7.2}/operon/export.py +68 -8
  82. {operondbs-0.6.2 → operondbs-0.7.2}/operon/files.py +85 -45
  83. {operondbs-0.6.2 → operondbs-0.7.2}/operon/import_wizard.py +1 -1
  84. {operondbs-0.6.2 → operondbs-0.7.2}/operon/lineage.py +73 -14
  85. {operondbs-0.6.2 → operondbs-0.7.2}/operon/qc_module/__init__.py +97 -12
  86. {operondbs-0.6.2 → operondbs-0.7.2}/operon/release.py +149 -19
  87. {operondbs-0.6.2 → operondbs-0.7.2}/operon/rules.py +67 -8
  88. {operondbs-0.6.2 → operondbs-0.7.2}/operon/table_import.py +11 -7
  89. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/actions.py +131 -31
  90. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/app.py +68 -8
  91. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/app.tcss +121 -0
  92. operondbs-0.7.2/operon/tui/assets/splash.png +0 -0
  93. operondbs-0.7.2/operon/tui/assets/splash.rgb.z +0 -0
  94. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/data.py +279 -14
  95. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/common.py +50 -2
  96. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/config.py +10 -4
  97. operondbs-0.7.2/operon/tui/screens/coverage.py +290 -0
  98. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/entities.py +18 -3
  99. operondbs-0.7.2/operon/tui/screens/import_wizard.py +619 -0
  100. operondbs-0.7.2/operon/tui/screens/publish.py +441 -0
  101. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/runs.py +5 -10
  102. operondbs-0.7.2/operon/tui/splash.py +188 -0
  103. operondbs-0.7.2/operon/tui/splash_terminal.py +86 -0
  104. {operondbs-0.6.2 → operondbs-0.7.2}/operon/utils.py +0 -2
  105. {operondbs-0.6.2 → operondbs-0.7.2}/pyproject.toml +11 -26
  106. {operondbs-0.6.2 → operondbs-0.7.2}/setup.py +0 -5
  107. {operondbs-0.6.2 → operondbs-0.7.2}/tests/compatibility/test_python_support.py +1 -1
  108. operondbs-0.7.2/tests/integration/test_python_packaging.py +131 -0
  109. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_cli_edges.py +29 -1
  110. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_database_edges_more.py +23 -1
  111. operondbs-0.7.2/tests/unit/test_docs_versions.py +69 -0
  112. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_export.py +26 -0
  113. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_files_edges.py +52 -0
  114. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_import_wizard_edges.py +9 -0
  115. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_lineage.py +80 -0
  116. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_qc_and_rules.py +41 -0
  117. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_rules_schema_edges.py +31 -0
  118. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_support_edges.py +49 -1
  119. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_table_import_edges.py +13 -0
  120. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tui.py +188 -12
  121. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tui_config.py +72 -2
  122. operondbs-0.7.2/tests/unit/test_tui_publish.py +725 -0
  123. operondbs-0.7.2/tests/unit/test_tui_splash_terminal.py +165 -0
  124. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tui_writes.py +28 -1
  125. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_views_release_reports_edges.py +57 -0
  126. operondbs-0.6.2/docs/en/contributor/application-release.md +0 -52
  127. operondbs-0.6.2/docs/en/reference/cli-tui.md +0 -117
  128. operondbs-0.6.2/docs/zh/contributor/application-release.md +0 -69
  129. operondbs-0.6.2/docs/zh/reference/cli-tui.md +0 -101
  130. operondbs-0.6.2/tests/integration/test_application_build.py +0 -298
  131. operondbs-0.6.2/tools/build.py +0 -519
  132. {operondbs-0.6.2 → operondbs-0.7.2}/.gitignore +0 -0
  133. {operondbs-0.6.2 → operondbs-0.7.2}/.readthedocs.yaml +0 -0
  134. {operondbs-0.6.2 → operondbs-0.7.2}/LICENSE +0 -0
  135. {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/dependency_links.txt +0 -0
  136. {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/entry_points.txt +0 -0
  137. {operondbs-0.6.2 → operondbs-0.7.2}/OperonDBS.egg-info/top_level.txt +0 -0
  138. {operondbs-0.6.2 → operondbs-0.7.2}/benchmarks/qc_representative_entities.tsv +0 -0
  139. {operondbs-0.6.2 → operondbs-0.7.2}/docs/_static/language-switcher.js +0 -0
  140. {operondbs-0.6.2 → operondbs-0.7.2}/docs/_static/operon.css +0 -0
  141. {operondbs-0.6.2 → operondbs-0.7.2}/docs/_templates/layout.html +0 -0
  142. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/index.md +0 -0
  143. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/release-lifecycle.md +0 -0
  144. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/architecture/taxonomy-coverage.md +0 -0
  145. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/daily-workflow.md +0 -0
  146. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/index.md +0 -0
  147. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/getting-started/quickstart.md +0 -0
  148. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/file-archiving.md +0 -0
  149. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/index.md +0 -0
  150. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/remote-execution.md +0 -0
  151. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/guides/taxonomy-coverage.md +0 -0
  152. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/index.md +0 -0
  153. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/operations/qc-performance.md +0 -0
  154. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-analysis.md +0 -0
  155. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-project-metadata.md +0 -0
  156. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-remote.md +0 -0
  157. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-taxonomy-lifecycle-admin.md +0 -0
  158. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/cli-workflow.md +0 -0
  159. {operondbs-0.6.2 → operondbs-0.7.2}/docs/en/reference/data-model.md +0 -0
  160. {operondbs-0.6.2 → operondbs-0.7.2}/docs/index.md +0 -0
  161. {operondbs-0.6.2 → operondbs-0.7.2}/docs/requirements.txt +0 -0
  162. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/index.md +0 -0
  163. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/release-lifecycle.md +0 -0
  164. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/architecture/taxonomy-coverage.md +0 -0
  165. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/daily-workflow.md +0 -0
  166. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/index.md +0 -0
  167. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/getting-started/quickstart.md +0 -0
  168. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/file-archiving.md +0 -0
  169. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/index.md +0 -0
  170. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/remote-execution.md +0 -0
  171. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/guides/taxonomy-coverage.md +0 -0
  172. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/index.md +0 -0
  173. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/operations/qc-performance.md +0 -0
  174. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-analysis.md +0 -0
  175. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-project-metadata.md +0 -0
  176. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-remote.md +0 -0
  177. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-taxonomy-lifecycle-admin.md +0 -0
  178. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/cli-workflow.md +0 -0
  179. {operondbs-0.6.2 → operondbs-0.7.2}/docs/zh/reference/data-model.md +0 -0
  180. {operondbs-0.6.2 → operondbs-0.7.2}/operon/__init__.py +0 -0
  181. {operondbs-0.6.2 → operondbs-0.7.2}/operon/__main__.py +0 -0
  182. {operondbs-0.6.2 → operondbs-0.7.2}/operon/adapters/__init__.py +0 -0
  183. {operondbs-0.6.2 → operondbs-0.7.2}/operon/adapters/ncbi_datasets.py +0 -0
  184. {operondbs-0.6.2 → operondbs-0.7.2}/operon/config.py +0 -0
  185. {operondbs-0.6.2 → operondbs-0.7.2}/operon/coverage.py +0 -0
  186. {operondbs-0.6.2 → operondbs-0.7.2}/operon/demo.py +0 -0
  187. {operondbs-0.6.2 → operondbs-0.7.2}/operon/entity_view.py +0 -0
  188. {operondbs-0.6.2 → operondbs-0.7.2}/operon/environment.py +0 -0
  189. {operondbs-0.6.2 → operondbs-0.7.2}/operon/errors.py +0 -0
  190. {operondbs-0.6.2 → operondbs-0.7.2}/operon/execution.py +0 -0
  191. {operondbs-0.6.2 → operondbs-0.7.2}/operon/lifecycle.py +0 -0
  192. {operondbs-0.6.2 → operondbs-0.7.2}/operon/metadata_files.py +0 -0
  193. {operondbs-0.6.2 → operondbs-0.7.2}/operon/ncbi_reconcile.py +0 -0
  194. {operondbs-0.6.2 → operondbs-0.7.2}/operon/profiles.py +0 -0
  195. {operondbs-0.6.2 → operondbs-0.7.2}/operon/qc_module/_parsers.pyx +0 -0
  196. {operondbs-0.6.2 → operondbs-0.7.2}/operon/qc_module/parsers.py +0 -0
  197. {operondbs-0.6.2 → operondbs-0.7.2}/operon/remotes.py +0 -0
  198. {operondbs-0.6.2 → operondbs-0.7.2}/operon/reports.py +0 -0
  199. {operondbs-0.6.2 → operondbs-0.7.2}/operon/schema.py +0 -0
  200. {operondbs-0.6.2 → operondbs-0.7.2}/operon/shutdown.py +0 -0
  201. {operondbs-0.6.2 → operondbs-0.7.2}/operon/taxonomy.py +0 -0
  202. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tools.py +0 -0
  203. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/__init__.py +0 -0
  204. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/__init__.py +0 -0
  205. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/decisions.py +0 -0
  206. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/files.py +0 -0
  207. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/files_ops.py +0 -0
  208. {operondbs-0.6.2 → operondbs-0.7.2}/operon/tui/screens/home.py +0 -0
  209. {operondbs-0.6.2 → operondbs-0.7.2}/operon/workflow.py +0 -0
  210. {operondbs-0.6.2 → operondbs-0.7.2}/setup.cfg +0 -0
  211. {operondbs-0.6.2 → operondbs-0.7.2}/tests/__init__.py +0 -0
  212. {operondbs-0.6.2 → operondbs-0.7.2}/tests/compatibility/__init__.py +0 -0
  213. {operondbs-0.6.2 → operondbs-0.7.2}/tests/helpers.py +0 -0
  214. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/__init__.py +0 -0
  215. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_analysis_resume.py +0 -0
  216. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_analysis_shutdown.py +0 -0
  217. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_analysis_tools.py +0 -0
  218. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_execution_backends.py +0 -0
  219. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_lineage_cascade.py +0 -0
  220. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_ncbi_datasets_adapter.py +0 -0
  221. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_pipeline_and_release.py +0 -0
  222. {operondbs-0.6.2 → operondbs-0.7.2}/tests/integration/test_taxonomy_coverage.py +0 -0
  223. {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/__init__.py +0 -0
  224. {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/test_correctness.py +0 -0
  225. {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/test_cython_parser_parity.py +0 -0
  226. {operondbs-0.6.2 → operondbs-0.7.2}/tests/regression/test_parser_semantics.py +0 -0
  227. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/__init__.py +0 -0
  228. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_config_workflow_edges.py +0 -0
  229. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_coverage_edges.py +0 -0
  230. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_environment.py +0 -0
  231. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_execution.py +0 -0
  232. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_execution_edges.py +0 -0
  233. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_import_backup_show.py +0 -0
  234. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_lifecycle.py +0 -0
  235. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_ncbi_edge_cases.py +0 -0
  236. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_ncbi_reconcile_edges.py +0 -0
  237. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_parser_edge_paths.py +0 -0
  238. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_qc_edges_more.py +0 -0
  239. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_recipe_history.py +0 -0
  240. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_remotes.py +0 -0
  241. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_remotes_edges.py +0 -0
  242. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_schema_2_9.py +0 -0
  243. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_schema_and_metadata.py +0 -0
  244. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_shutdown.py +0 -0
  245. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_taxonomy_edges.py +0 -0
  246. {operondbs-0.6.2 → operondbs-0.7.2}/tests/unit/test_tools_edges.py +0 -0
  247. {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@v5
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@v5
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@v6
94
+ - uses: actions/download-artifact@v8
84
95
  with:
85
96
  pattern: python-package-*
86
97
  path: dist/
@@ -1,4 +1,4 @@
1
- name: deploy
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.6.2 (`pyproject.toml`)
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, and a Config screen. Read access lives in
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. The
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 + cx_Freeze + Cython +
116
- # Sphinx; also compiles the qc parsers
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, the frozen release build, and the strict Sphinx build.
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`, `build`, `remote`, `tui`, `docs`, `dev`). Runtime-feature extras must
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.6.2, database schema 2.9, metadata
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.6.2
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
- [![deploy status](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
53
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](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), `build` (cx_Freeze, Cython, and documentation tooling), `docs` (documentation tooling), and `dev` (all development/build dependencies)
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.6.2
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
- [![deploy status](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
53
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](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), `build` (cx_Freeze, Cython, and documentation tooling), `docs` (documentation tooling), and `dev` (all development/build dependencies)
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
- [![deploy status](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
3
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](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), `build` (cx_Freeze, Cython, and documentation tooling), `docs` (documentation tooling), and `dev` (all development/build dependencies)
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
- [![deploy status](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/deploy.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](https://codecov.io/gh/HYLi360/Operon)
3
+ [![test status](https://github.com/HYLi360/Operon/actions/workflows/test.yml/badge.svg)](https://github.com/HYLi360/Operon/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/HYLi360/Operon/branch/master/graph/badge.svg?token=BC4LD8UPL2)](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)、`build`(cx_Freeze、Cython 与文档工具)、`docs`(文档工具)和 `dev`(全部开发/构建依赖)
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 contributors"
13
- copyright = "2026, Operon contributors"
19
+ author = "Project Operon Development Group"
20
+ copyright = f"2026, {author}. All Rights Reserved."
14
21
 
15
- try:
16
- release = version("OperonDBS")
17
- except PackageNotFoundError:
18
- release = "0.6.2"
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. The cx_Freeze release packages include it as well.
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 1.4; custom fields are preserved, and dry runs use only the in-memory upgraded schema.
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