metaseed 0.14.0__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 (513) hide show
  1. metaseed-0.14.0/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
  2. metaseed-0.14.0/.github/ISSUE_TEMPLATE/feature_request.md +27 -0
  3. metaseed-0.14.0/.github/PULL_REQUEST_TEMPLATE.md +25 -0
  4. metaseed-0.14.0/.github/workflows/ci.yml +107 -0
  5. metaseed-0.14.0/.github/workflows/docs.yml +70 -0
  6. metaseed-0.14.0/.github/workflows/release.yml +78 -0
  7. metaseed-0.14.0/.gitignore +69 -0
  8. metaseed-0.14.0/.pre-commit-config.yaml +59 -0
  9. metaseed-0.14.0/.python-version +1 -0
  10. metaseed-0.14.0/CHANGELOG.md +350 -0
  11. metaseed-0.14.0/CLAUDE.md +101 -0
  12. metaseed-0.14.0/CODE_OF_CONDUCT.md +54 -0
  13. metaseed-0.14.0/CONTRIBUTING.md +132 -0
  14. metaseed-0.14.0/LICENSE +21 -0
  15. metaseed-0.14.0/Makefile +71 -0
  16. metaseed-0.14.0/PKG-INFO +276 -0
  17. metaseed-0.14.0/README.md +217 -0
  18. metaseed-0.14.0/SECURITY.md +58 -0
  19. metaseed-0.14.0/docs/REVIEW.md +270 -0
  20. metaseed-0.14.0/docs/api/cli.md +212 -0
  21. metaseed-0.14.0/docs/api/client.md +424 -0
  22. metaseed-0.14.0/docs/api/facade.md +264 -0
  23. metaseed-0.14.0/docs/api/rest.md +374 -0
  24. metaseed-0.14.0/docs/api/schema-specs.md +839 -0
  25. metaseed-0.14.0/docs/api/spec-builder-mcp.md +104 -0
  26. metaseed-0.14.0/docs/api/storage.md +202 -0
  27. metaseed-0.14.0/docs/api/validators.md +280 -0
  28. metaseed-0.14.0/docs/architecture/brapi-import.md +97 -0
  29. metaseed-0.14.0/docs/architecture/dataset-repository.md +278 -0
  30. metaseed-0.14.0/docs/architecture/dcat.md +94 -0
  31. metaseed-0.14.0/docs/architecture/decisions/001-facade-as-entity-storage.md +123 -0
  32. metaseed-0.14.0/docs/architecture/ena-import.md +70 -0
  33. metaseed-0.14.0/docs/architecture/entity-repository.md +229 -0
  34. metaseed-0.14.0/docs/architecture/exceptions.md +101 -0
  35. metaseed-0.14.0/docs/architecture/integration-adapters.md +105 -0
  36. metaseed-0.14.0/docs/architecture/isatab-export.md +34 -0
  37. metaseed-0.14.0/docs/architecture/metabolights-import.md +134 -0
  38. metaseed-0.14.0/docs/architecture/metadata-agent.md +554 -0
  39. metaseed-0.14.0/docs/architecture/model-factory.md +62 -0
  40. metaseed-0.14.0/docs/architecture/overview.md +179 -0
  41. metaseed-0.14.0/docs/architecture/pride-import.md +142 -0
  42. metaseed-0.14.0/docs/architecture/seek-export.md +258 -0
  43. metaseed-0.14.0/docs/architecture/spec-builder.md +117 -0
  44. metaseed-0.14.0/docs/architecture/ui-helpers.md +161 -0
  45. metaseed-0.14.0/docs/client_demo.ipynb +674 -0
  46. metaseed-0.14.0/docs/demo.ipynb +511 -0
  47. metaseed-0.14.0/docs/development/contributing.md +106 -0
  48. metaseed-0.14.0/docs/development/testing-best-practices.md +284 -0
  49. metaseed-0.14.0/docs/development/testing.md +266 -0
  50. metaseed-0.14.0/docs/discussion/comparison.md +112 -0
  51. metaseed-0.14.0/docs/discussion/entity-relationships.md +98 -0
  52. metaseed-0.14.0/docs/discussion/metabolights-design.md +421 -0
  53. metaseed-0.14.0/docs/discussion/profile-design-approaches.md +166 -0
  54. metaseed-0.14.0/docs/facade_demo.ipynb +840 -0
  55. metaseed-0.14.0/docs/getting-started/installation.md +29 -0
  56. metaseed-0.14.0/docs/getting-started/quickstart.md +81 -0
  57. metaseed-0.14.0/docs/guides/logging.md +80 -0
  58. metaseed-0.14.0/docs/guides/ontology-lookup.md +192 -0
  59. metaseed-0.14.0/docs/guides/spec-builder.md +325 -0
  60. metaseed-0.14.0/docs/guides/spec-merge.md +320 -0
  61. metaseed-0.14.0/docs/images/metaseed-icon-128.png +0 -0
  62. metaseed-0.14.0/docs/images/metaseed-icon-256.png +0 -0
  63. metaseed-0.14.0/docs/images/metaseed-icon-512.png +0 -0
  64. metaseed-0.14.0/docs/images/metaseed-icon.svg +61 -0
  65. metaseed-0.14.0/docs/images/metaseed-logo-400.png +0 -0
  66. metaseed-0.14.0/docs/images/metaseed-logo-800.png +0 -0
  67. metaseed-0.14.0/docs/images/metaseed-logo-light-400.png +0 -0
  68. metaseed-0.14.0/docs/images/metaseed-logo-light-800.png +0 -0
  69. metaseed-0.14.0/docs/images/metaseed-logo-light.svg +55 -0
  70. metaseed-0.14.0/docs/images/metaseed-logo.svg +55 -0
  71. metaseed-0.14.0/docs/index.md +13 -0
  72. metaseed-0.14.0/docs/isa_demo.ipynb +1131 -0
  73. metaseed-0.14.0/docs/profiles/darwin-core.md +237 -0
  74. metaseed-0.14.0/docs/profiles/dissco.md +272 -0
  75. metaseed-0.14.0/docs/profiles/ena.md +274 -0
  76. metaseed-0.14.0/docs/profiles/isa.md +431 -0
  77. metaseed-0.14.0/docs/profiles/jerm.md +184 -0
  78. metaseed-0.14.0/docs/profiles/metabolights.md +137 -0
  79. metaseed-0.14.0/docs/profiles/miappe-htp.md +81 -0
  80. metaseed-0.14.0/docs/profiles/miappe.md +374 -0
  81. metaseed-0.14.0/docs/profiles/pride.md +126 -0
  82. metaseed-0.14.0/docs/slides/.gitignore +3 -0
  83. metaseed-0.14.0/docs/slides/images/entity-editor.jpg +0 -0
  84. metaseed-0.14.0/docs/slides/images/fellowship-group.jpg +0 -0
  85. metaseed-0.14.0/docs/slides/images/graph-view.jpg +0 -0
  86. metaseed-0.14.0/docs/slides/images/isa-miappe-comparison-in-metaseed.jpg +0 -0
  87. metaseed-0.14.0/docs/slides/images/metaseed-hub.jpg +0 -0
  88. metaseed-0.14.0/docs/slides/images/metaseed-icon.svg +61 -0
  89. metaseed-0.14.0/docs/slides/images/metaseed-logo-dark.svg +55 -0
  90. metaseed-0.14.0/docs/slides/images/metaseed-logo.svg +55 -0
  91. metaseed-0.14.0/docs/slides/images/spec-builder.jpg +0 -0
  92. metaseed-0.14.0/docs/slides/index.qmd +514 -0
  93. metaseed-0.14.0/mkdocs.yml +114 -0
  94. metaseed-0.14.0/pyproject.toml +280 -0
  95. metaseed-0.14.0/src/metaseed/__init__.py +110 -0
  96. metaseed-0.14.0/src/metaseed/_http.py +79 -0
  97. metaseed-0.14.0/src/metaseed/_mapping.py +24 -0
  98. metaseed-0.14.0/src/metaseed/_version.py +24 -0
  99. metaseed-0.14.0/src/metaseed/adapters.py +279 -0
  100. metaseed-0.14.0/src/metaseed/agent/__init__.py +33 -0
  101. metaseed-0.14.0/src/metaseed/agent/core.py +530 -0
  102. metaseed-0.14.0/src/metaseed/agent/mapping.py +278 -0
  103. metaseed-0.14.0/src/metaseed/agent/mcp/__init__.py +16 -0
  104. metaseed-0.14.0/src/metaseed/agent/mcp/context.py +36 -0
  105. metaseed-0.14.0/src/metaseed/agent/mcp/manager.py +352 -0
  106. metaseed-0.14.0/src/metaseed/agent/mcp/server.py +424 -0
  107. metaseed-0.14.0/src/metaseed/agent/mcp/tools/__init__.py +17 -0
  108. metaseed-0.14.0/src/metaseed/agent/mcp/tools/datasets.py +260 -0
  109. metaseed-0.14.0/src/metaseed/agent/mcp/tools/entities.py +797 -0
  110. metaseed-0.14.0/src/metaseed/agent/mcp/tools/extraction.py +226 -0
  111. metaseed-0.14.0/src/metaseed/agent/mcp/tools/ontology.py +354 -0
  112. metaseed-0.14.0/src/metaseed/agent/mcp/tools/profiles.py +531 -0
  113. metaseed-0.14.0/src/metaseed/agent/mcp/tools/spec_builder.py +450 -0
  114. metaseed-0.14.0/src/metaseed/agent/mcp/tools/validation.py +359 -0
  115. metaseed-0.14.0/src/metaseed/agent/parsers/__init__.py +10 -0
  116. metaseed-0.14.0/src/metaseed/agent/parsers/csv.py +78 -0
  117. metaseed-0.14.0/src/metaseed/agent/parsers/excel.py +124 -0
  118. metaseed-0.14.0/src/metaseed/agent/parsers/json.py +88 -0
  119. metaseed-0.14.0/src/metaseed/agent/parsers/registry.py +112 -0
  120. metaseed-0.14.0/src/metaseed/api/__init__.py +67 -0
  121. metaseed-0.14.0/src/metaseed/api/base.py +33 -0
  122. metaseed-0.14.0/src/metaseed/api/client.py +537 -0
  123. metaseed-0.14.0/src/metaseed/api/entities.py +103 -0
  124. metaseed-0.14.0/src/metaseed/api/errors.py +161 -0
  125. metaseed-0.14.0/src/metaseed/api/rest.py +164 -0
  126. metaseed-0.14.0/src/metaseed/api/schema.py +146 -0
  127. metaseed-0.14.0/src/metaseed/api/serialization.py +148 -0
  128. metaseed-0.14.0/src/metaseed/api/validation.py +147 -0
  129. metaseed-0.14.0/src/metaseed/brapi/__init__.py +77 -0
  130. metaseed-0.14.0/src/metaseed/brapi/client.py +128 -0
  131. metaseed-0.14.0/src/metaseed/brapi/export.py +155 -0
  132. metaseed-0.14.0/src/metaseed/brapi/mapper.py +247 -0
  133. metaseed-0.14.0/src/metaseed/cli/__init__.py +10 -0
  134. metaseed-0.14.0/src/metaseed/cli/app.py +433 -0
  135. metaseed-0.14.0/src/metaseed/cli/commands/__init__.py +1 -0
  136. metaseed-0.14.0/src/metaseed/cli/commands/example.py +358 -0
  137. metaseed-0.14.0/src/metaseed/cli/commands/merge.py +186 -0
  138. metaseed-0.14.0/src/metaseed/cli/migrate.py +185 -0
  139. metaseed-0.14.0/src/metaseed/cli/migrate_specs.py +181 -0
  140. metaseed-0.14.0/src/metaseed/cli/output.py +112 -0
  141. metaseed-0.14.0/src/metaseed/core/__init__.py +25 -0
  142. metaseed-0.14.0/src/metaseed/core/context.py +35 -0
  143. metaseed-0.14.0/src/metaseed/core/exceptions.py +59 -0
  144. metaseed-0.14.0/src/metaseed/core/serialization.py +41 -0
  145. metaseed-0.14.0/src/metaseed/dcat/__init__.py +30 -0
  146. metaseed-0.14.0/src/metaseed/dcat/model.py +90 -0
  147. metaseed-0.14.0/src/metaseed/dcat/resolver.py +187 -0
  148. metaseed-0.14.0/src/metaseed/dcat/serialize.py +207 -0
  149. metaseed-0.14.0/src/metaseed/ena/__init__.py +51 -0
  150. metaseed-0.14.0/src/metaseed/ena/client.py +79 -0
  151. metaseed-0.14.0/src/metaseed/ena/export.py +154 -0
  152. metaseed-0.14.0/src/metaseed/ena/mapper.py +165 -0
  153. metaseed-0.14.0/src/metaseed/examples/darwin-core/1.0/forest-biodiversity-survey.yaml +89 -0
  154. metaseed-0.14.0/src/metaseed/examples/dissco/0.4/herbarium-specimen.yaml +266 -0
  155. metaseed-0.14.0/src/metaseed/examples/ena/1.0/arabidopsis-drought-rnaseq.yaml +439 -0
  156. metaseed-0.14.0/src/metaseed/examples/isa/1.0/metabolomics-study.yaml +950 -0
  157. metaseed-0.14.0/src/metaseed/examples/miappe/1.1/wheat-drought-study.yaml +939 -0
  158. metaseed-0.14.0/src/metaseed/examples/miappe/1.2/wheat-drought-study.yaml +536 -0
  159. metaseed-0.14.0/src/metaseed/examples/pride/1.0/hela-phosphoproteome.yaml +107 -0
  160. metaseed-0.14.0/src/metaseed/facade/__init__.py +61 -0
  161. metaseed-0.14.0/src/metaseed/facade/core.py +616 -0
  162. metaseed-0.14.0/src/metaseed/facade/graph.py +235 -0
  163. metaseed-0.14.0/src/metaseed/facade/helper.py +522 -0
  164. metaseed-0.14.0/src/metaseed/facade/node.py +57 -0
  165. metaseed-0.14.0/src/metaseed/facade/profiles.py +194 -0
  166. metaseed-0.14.0/src/metaseed/facade/store.py +619 -0
  167. metaseed-0.14.0/src/metaseed/forms/__init__.py +253 -0
  168. metaseed-0.14.0/src/metaseed/isatab/__init__.py +336 -0
  169. metaseed-0.14.0/src/metaseed/isatab/reader.py +196 -0
  170. metaseed-0.14.0/src/metaseed/llm/__init__.py +23 -0
  171. metaseed-0.14.0/src/metaseed/llm/service.py +224 -0
  172. metaseed-0.14.0/src/metaseed/logging.py +93 -0
  173. metaseed-0.14.0/src/metaseed/metabolights/__init__.py +67 -0
  174. metaseed-0.14.0/src/metaseed/metabolights/client.py +125 -0
  175. metaseed-0.14.0/src/metaseed/metabolights/export.py +121 -0
  176. metaseed-0.14.0/src/metaseed/metabolights/mapper.py +535 -0
  177. metaseed-0.14.0/src/metaseed/metabolights/validate.py +61 -0
  178. metaseed-0.14.0/src/metaseed/models/__init__.py +93 -0
  179. metaseed-0.14.0/src/metaseed/models/factory.py +463 -0
  180. metaseed-0.14.0/src/metaseed/models/registry.py +97 -0
  181. metaseed-0.14.0/src/metaseed/models/types.py +15 -0
  182. metaseed-0.14.0/src/metaseed/paths.py +56 -0
  183. metaseed-0.14.0/src/metaseed/pride/__init__.py +61 -0
  184. metaseed-0.14.0/src/metaseed/pride/client.py +134 -0
  185. metaseed-0.14.0/src/metaseed/pride/export.py +239 -0
  186. metaseed-0.14.0/src/metaseed/pride/mapper.py +227 -0
  187. metaseed-0.14.0/src/metaseed/pride/validate.py +184 -0
  188. metaseed-0.14.0/src/metaseed/profiles/__init__.py +9 -0
  189. metaseed-0.14.0/src/metaseed/profiles/factory.py +125 -0
  190. metaseed-0.14.0/src/metaseed/repositories/__init__.py +40 -0
  191. metaseed-0.14.0/src/metaseed/repositories/base.py +150 -0
  192. metaseed-0.14.0/src/metaseed/repositories/dataset_repository.py +165 -0
  193. metaseed-0.14.0/src/metaseed/repositories/file.py +436 -0
  194. metaseed-0.14.0/src/metaseed/repositories/filesystem_dataset.py +212 -0
  195. metaseed-0.14.0/src/metaseed/repositories/helpers.py +236 -0
  196. metaseed-0.14.0/src/metaseed/repositories/memory.py +288 -0
  197. metaseed-0.14.0/src/metaseed/seek/__init__.py +76 -0
  198. metaseed-0.14.0/src/metaseed/seek/client.py +271 -0
  199. metaseed-0.14.0/src/metaseed/seek/fairds.py +269 -0
  200. metaseed-0.14.0/src/metaseed/seek/importer.py +238 -0
  201. metaseed-0.14.0/src/metaseed/seek/payloads.py +207 -0
  202. metaseed-0.14.0/src/metaseed/seek/provision.py +359 -0
  203. metaseed-0.14.0/src/metaseed/seek/roles.py +56 -0
  204. metaseed-0.14.0/src/metaseed/seek/sync.py +203 -0
  205. metaseed-0.14.0/src/metaseed/services/__init__.py +13 -0
  206. metaseed-0.14.0/src/metaseed/services/ontology.py +761 -0
  207. metaseed-0.14.0/src/metaseed/settings.py +126 -0
  208. metaseed-0.14.0/src/metaseed/specs/__init__.py +22 -0
  209. metaseed-0.14.0/src/metaseed/specs/builder.py +554 -0
  210. metaseed-0.14.0/src/metaseed/specs/darwin-core/1.0/notes.md +1 -0
  211. metaseed-0.14.0/src/metaseed/specs/darwin-core/1.0/profile.yaml +1340 -0
  212. metaseed-0.14.0/src/metaseed/specs/dissco/0.4/notes.md +1 -0
  213. metaseed-0.14.0/src/metaseed/specs/dissco/0.4/profile.yaml +1784 -0
  214. metaseed-0.14.0/src/metaseed/specs/ena/1.0/notes.md +1 -0
  215. metaseed-0.14.0/src/metaseed/specs/ena/1.0/profile.yaml +1255 -0
  216. metaseed-0.14.0/src/metaseed/specs/isa/1.0/notes.md +1 -0
  217. metaseed-0.14.0/src/metaseed/specs/isa/1.0/profile.yaml +921 -0
  218. metaseed-0.14.0/src/metaseed/specs/jerm/1.0/notes.md +1 -0
  219. metaseed-0.14.0/src/metaseed/specs/jerm/1.0/profile.yaml +1188 -0
  220. metaseed-0.14.0/src/metaseed/specs/loader.py +480 -0
  221. metaseed-0.14.0/src/metaseed/specs/merge/__init__.py +89 -0
  222. metaseed-0.14.0/src/metaseed/specs/merge/comparator.py +588 -0
  223. metaseed-0.14.0/src/metaseed/specs/merge/facade.py +87 -0
  224. metaseed-0.14.0/src/metaseed/specs/merge/merger.py +438 -0
  225. metaseed-0.14.0/src/metaseed/specs/merge/models.py +284 -0
  226. metaseed-0.14.0/src/metaseed/specs/merge/reports.py +519 -0
  227. metaseed-0.14.0/src/metaseed/specs/merge/strategies.py +389 -0
  228. metaseed-0.14.0/src/metaseed/specs/merge/visualizer.py +333 -0
  229. metaseed-0.14.0/src/metaseed/specs/metabolights/1.0/profile.yaml +555 -0
  230. metaseed-0.14.0/src/metaseed/specs/miappe/1.1/notes.md +1 -0
  231. metaseed-0.14.0/src/metaseed/specs/miappe/1.1/profile.yaml +1409 -0
  232. metaseed-0.14.0/src/metaseed/specs/miappe/1.2/notes.md +1 -0
  233. metaseed-0.14.0/src/metaseed/specs/miappe/1.2/profile.yaml +1671 -0
  234. metaseed-0.14.0/src/metaseed/specs/miappe-htp/1.0/notes.md +5 -0
  235. metaseed-0.14.0/src/metaseed/specs/miappe-htp/1.0/profile.yaml +998 -0
  236. metaseed-0.14.0/src/metaseed/specs/persistence.py +188 -0
  237. metaseed-0.14.0/src/metaseed/specs/pride/1.0/profile.yaml +455 -0
  238. metaseed-0.14.0/src/metaseed/specs/schema.py +436 -0
  239. metaseed-0.14.0/src/metaseed/storage/__init__.py +16 -0
  240. metaseed-0.14.0/src/metaseed/storage/base.py +53 -0
  241. metaseed-0.14.0/src/metaseed/storage/json_backend.py +79 -0
  242. metaseed-0.14.0/src/metaseed/storage/yaml_backend.py +77 -0
  243. metaseed-0.14.0/src/metaseed/ui/__init__.py +35 -0
  244. metaseed-0.14.0/src/metaseed/ui/app.py +175 -0
  245. metaseed-0.14.0/src/metaseed/ui/dataset_manager.py +313 -0
  246. metaseed-0.14.0/src/metaseed/ui/datasets.py +220 -0
  247. metaseed-0.14.0/src/metaseed/ui/helpers/__init__.py +94 -0
  248. metaseed-0.14.0/src/metaseed/ui/helpers/entity_helpers.py +312 -0
  249. metaseed-0.14.0/src/metaseed/ui/helpers/navigation_helpers.py +221 -0
  250. metaseed-0.14.0/src/metaseed/ui/helpers/spec_builder_helpers.py +61 -0
  251. metaseed-0.14.0/src/metaseed/ui/helpers/table_helpers.py +225 -0
  252. metaseed-0.14.0/src/metaseed/ui/helpers/validation.py +389 -0
  253. metaseed-0.14.0/src/metaseed/ui/routes/__init__.py +48 -0
  254. metaseed-0.14.0/src/metaseed/ui/routes/api.py +627 -0
  255. metaseed-0.14.0/src/metaseed/ui/routes/core.py +226 -0
  256. metaseed-0.14.0/src/metaseed/ui/routes/crud.py +372 -0
  257. metaseed-0.14.0/src/metaseed/ui/routes/dcat.py +159 -0
  258. metaseed-0.14.0/src/metaseed/ui/routes/examples.py +169 -0
  259. metaseed-0.14.0/src/metaseed/ui/routes/explore.py +193 -0
  260. metaseed-0.14.0/src/metaseed/ui/routes/forms.py +243 -0
  261. metaseed-0.14.0/src/metaseed/ui/routes/import_export.py +177 -0
  262. metaseed-0.14.0/src/metaseed/ui/routes/nested.py +280 -0
  263. metaseed-0.14.0/src/metaseed/ui/routes/seek.py +285 -0
  264. metaseed-0.14.0/src/metaseed/ui/routes/settings.py +85 -0
  265. metaseed-0.14.0/src/metaseed/ui/routes/table.py +384 -0
  266. metaseed-0.14.0/src/metaseed/ui/routes/validation.py +412 -0
  267. metaseed-0.14.0/src/metaseed/ui/services/__init__.py +1 -0
  268. metaseed-0.14.0/src/metaseed/ui/services/entities.py +224 -0
  269. metaseed-0.14.0/src/metaseed/ui/services/export.py +160 -0
  270. metaseed-0.14.0/src/metaseed/ui/services/graph.py +43 -0
  271. metaseed-0.14.0/src/metaseed/ui/spec_builder/__init__.py +66 -0
  272. metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_entities.py +194 -0
  273. metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_export.py +297 -0
  274. metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_fields.py +314 -0
  275. metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_main.py +237 -0
  276. metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_rules.py +255 -0
  277. metaseed-0.14.0/src/metaseed/ui/spec_builder/state.py +64 -0
  278. metaseed-0.14.0/src/metaseed/ui/spec_filesystem.py +224 -0
  279. metaseed-0.14.0/src/metaseed/ui/spec_persistence.py +120 -0
  280. metaseed-0.14.0/src/metaseed/ui/spec_provider.py +82 -0
  281. metaseed-0.14.0/src/metaseed/ui/state.py +411 -0
  282. metaseed-0.14.0/src/metaseed/ui/static/css/style.css +5590 -0
  283. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon-128.png +0 -0
  284. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon-256.png +0 -0
  285. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon-512.png +0 -0
  286. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon.svg +61 -0
  287. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-400.png +0 -0
  288. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-800.png +0 -0
  289. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-light-400.png +0 -0
  290. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-light-800.png +0 -0
  291. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-light.svg +55 -0
  292. metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo.svg +55 -0
  293. metaseed-0.14.0/src/metaseed/ui/static/js/app.js +1775 -0
  294. metaseed-0.14.0/src/metaseed/ui/static/js/core.js +253 -0
  295. metaseed-0.14.0/src/metaseed/ui/static/js/dataset.js +223 -0
  296. metaseed-0.14.0/src/metaseed/ui/static/js/erd-common.js +178 -0
  297. metaseed-0.14.0/src/metaseed/ui/static/js/graph.js +630 -0
  298. metaseed-0.14.0/src/metaseed/ui/static/js/lookup.js +717 -0
  299. metaseed-0.14.0/src/metaseed/ui/static/js/mcp.js +87 -0
  300. metaseed-0.14.0/src/metaseed/ui/static/js/spec-builder.js +764 -0
  301. metaseed-0.14.0/src/metaseed/ui/static/js/table-edit.js +339 -0
  302. metaseed-0.14.0/src/metaseed/ui/static/js/validation.js +116 -0
  303. metaseed-0.14.0/src/metaseed/ui/templates/base.html +131 -0
  304. metaseed-0.14.0/src/metaseed/ui/templates/components/breadcrumb.html +18 -0
  305. metaseed-0.14.0/src/metaseed/ui/templates/components/lookup_modal.html +26 -0
  306. metaseed-0.14.0/src/metaseed/ui/templates/components/notification.html +3 -0
  307. metaseed-0.14.0/src/metaseed/ui/templates/components/validation_result.html +130 -0
  308. metaseed-0.14.0/src/metaseed/ui/templates/datasets_list.html +87 -0
  309. metaseed-0.14.0/src/metaseed/ui/templates/explore/index.html +762 -0
  310. metaseed-0.14.0/src/metaseed/ui/templates/index.html +74 -0
  311. metaseed-0.14.0/src/metaseed/ui/templates/partials/adapter_toggle.html +50 -0
  312. metaseed-0.14.0/src/metaseed/ui/templates/partials/field.html +150 -0
  313. metaseed-0.14.0/src/metaseed/ui/templates/partials/form.html +148 -0
  314. metaseed-0.14.0/src/metaseed/ui/templates/partials/form_sections.html +74 -0
  315. metaseed-0.14.0/src/metaseed/ui/templates/partials/form_success.html +12 -0
  316. metaseed-0.14.0/src/metaseed/ui/templates/partials/inline_table.html +117 -0
  317. metaseed-0.14.0/src/metaseed/ui/templates/partials/inline_table_row.html +66 -0
  318. metaseed-0.14.0/src/metaseed/ui/templates/partials/nested_form.html +70 -0
  319. metaseed-0.14.0/src/metaseed/ui/templates/partials/profile_select.html +44 -0
  320. metaseed-0.14.0/src/metaseed/ui/templates/partials/table.html +115 -0
  321. metaseed-0.14.0/src/metaseed/ui/templates/partials/table_row.html +96 -0
  322. metaseed-0.14.0/src/metaseed/ui/templates/seek/_project_select.html +13 -0
  323. metaseed-0.14.0/src/metaseed/ui/templates/seek/index.html +141 -0
  324. metaseed-0.14.0/src/metaseed/ui/templates/settings/index.html +16 -0
  325. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/base.html +270 -0
  326. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/entities_list.html +51 -0
  327. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/entity_editor.html +170 -0
  328. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/field_form.html +317 -0
  329. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/notes_panel.html +100 -0
  330. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/profile_metadata_form.html +52 -0
  331. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/save_result.html +9 -0
  332. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/validation_rule_form.html +281 -0
  333. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/validation_rules_list.html +55 -0
  334. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/yaml_preview.html +104 -0
  335. metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/start.html +232 -0
  336. metaseed-0.14.0/src/metaseed/ui/websocket.py +90 -0
  337. metaseed-0.14.0/src/metaseed/utils/__init__.py +6 -0
  338. metaseed-0.14.0/src/metaseed/utils/json.py +20 -0
  339. metaseed-0.14.0/src/metaseed/utils/text.py +16 -0
  340. metaseed-0.14.0/src/metaseed/validators/__init__.py +44 -0
  341. metaseed-0.14.0/src/metaseed/validators/api.py +437 -0
  342. metaseed-0.14.0/src/metaseed/validators/base.py +100 -0
  343. metaseed-0.14.0/src/metaseed/validators/cv.py +64 -0
  344. metaseed-0.14.0/src/metaseed/validators/dataset.py +681 -0
  345. metaseed-0.14.0/src/metaseed/validators/engine.py +522 -0
  346. metaseed-0.14.0/src/metaseed/validators/rules.py +756 -0
  347. metaseed-0.14.0/tests/__init__.py +1 -0
  348. metaseed-0.14.0/tests/conftest.py +43 -0
  349. metaseed-0.14.0/tests/fixtures/isa_examples/BII-I-1.json +1 -0
  350. metaseed-0.14.0/tests/fixtures/isa_examples/MIAPPE_Checklist_Data_Model.tsv +106 -0
  351. metaseed-0.14.0/tests/fixtures/isa_examples/a_MTBLS1_metabolite_profiling.txt +133 -0
  352. metaseed-0.14.0/tests/fixtures/isa_examples/i_MTBLS1.txt +100 -0
  353. metaseed-0.14.0/tests/fixtures/isa_examples/i_MTBLS528.txt +97 -0
  354. metaseed-0.14.0/tests/fixtures/isa_examples/s_MTBLS1.txt +133 -0
  355. metaseed-0.14.0/tests/fixtures/isa_examples/s_MTBLS528.txt +217 -0
  356. metaseed-0.14.0/tests/test_adapters.py +145 -0
  357. metaseed-0.14.0/tests/test_agent/__init__.py +1 -0
  358. metaseed-0.14.0/tests/test_agent/helpers.py +33 -0
  359. metaseed-0.14.0/tests/test_agent/test_core.py +358 -0
  360. metaseed-0.14.0/tests/test_agent/test_core_redos.py +67 -0
  361. metaseed-0.14.0/tests/test_agent/test_mapping.py +259 -0
  362. metaseed-0.14.0/tests/test_agent/test_mcp.py +1949 -0
  363. metaseed-0.14.0/tests/test_agent/test_mcp_spec_builder.py +179 -0
  364. metaseed-0.14.0/tests/test_agent/test_mcp_state_consistency.py +69 -0
  365. metaseed-0.14.0/tests/test_agent/test_ontology_tools.py +379 -0
  366. metaseed-0.14.0/tests/test_agent/test_parsers.py +288 -0
  367. metaseed-0.14.0/tests/test_api/__init__.py +1 -0
  368. metaseed-0.14.0/tests/test_api/test_client.py +1004 -0
  369. metaseed-0.14.0/tests/test_api/test_endpoints.py +120 -0
  370. metaseed-0.14.0/tests/test_brapi/__init__.py +0 -0
  371. metaseed-0.14.0/tests/test_brapi/fixtures/brapi.json +190 -0
  372. metaseed-0.14.0/tests/test_brapi/test_client.py +126 -0
  373. metaseed-0.14.0/tests/test_brapi/test_conformance.py +42 -0
  374. metaseed-0.14.0/tests/test_brapi/test_export.py +89 -0
  375. metaseed-0.14.0/tests/test_brapi/test_import.py +47 -0
  376. metaseed-0.14.0/tests/test_brapi/test_mapper.py +82 -0
  377. metaseed-0.14.0/tests/test_cli/__init__.py +1 -0
  378. metaseed-0.14.0/tests/test_cli/test_check.py +262 -0
  379. metaseed-0.14.0/tests/test_cli/test_commands.py +336 -0
  380. metaseed-0.14.0/tests/test_cli/test_example.py +256 -0
  381. metaseed-0.14.0/tests/test_cli/test_merge_commands.py +161 -0
  382. metaseed-0.14.0/tests/test_cli/test_merge_docs.py +204 -0
  383. metaseed-0.14.0/tests/test_cli/test_migrate.py +293 -0
  384. metaseed-0.14.0/tests/test_cli_commands.py +526 -0
  385. metaseed-0.14.0/tests/test_core/__init__.py +1 -0
  386. metaseed-0.14.0/tests/test_core/test_context.py +52 -0
  387. metaseed-0.14.0/tests/test_core/test_exceptions.py +70 -0
  388. metaseed-0.14.0/tests/test_dcat/__init__.py +0 -0
  389. metaseed-0.14.0/tests/test_dcat/test_catalog_metadata_persistence.py +38 -0
  390. metaseed-0.14.0/tests/test_dcat/test_resolver.py +153 -0
  391. metaseed-0.14.0/tests/test_dcat/test_route.py +75 -0
  392. metaseed-0.14.0/tests/test_dcat/test_serialize.py +84 -0
  393. metaseed-0.14.0/tests/test_dcat/test_serialize_robustness.py +60 -0
  394. metaseed-0.14.0/tests/test_declared_identity.py +42 -0
  395. metaseed-0.14.0/tests/test_docs/__init__.py +0 -0
  396. metaseed-0.14.0/tests/test_docs/test_doc_imports.py +66 -0
  397. metaseed-0.14.0/tests/test_docs/test_profile_docs.py +198 -0
  398. metaseed-0.14.0/tests/test_ena/__init__.py +0 -0
  399. metaseed-0.14.0/tests/test_ena/fixtures/read_run.json +40 -0
  400. metaseed-0.14.0/tests/test_ena/test_client.py +64 -0
  401. metaseed-0.14.0/tests/test_ena/test_export.py +90 -0
  402. metaseed-0.14.0/tests/test_ena/test_import.py +27 -0
  403. metaseed-0.14.0/tests/test_ena/test_mapper.py +88 -0
  404. metaseed-0.14.0/tests/test_examples.py +649 -0
  405. metaseed-0.14.0/tests/test_facade.py +827 -0
  406. metaseed-0.14.0/tests/test_facade_store.py +268 -0
  407. metaseed-0.14.0/tests/test_field_metadata.py +123 -0
  408. metaseed-0.14.0/tests/test_http.py +62 -0
  409. metaseed-0.14.0/tests/test_isatab/__init__.py +0 -0
  410. metaseed-0.14.0/tests/test_isatab/fixtures/a_MTBLS1_assay.txt +6 -0
  411. metaseed-0.14.0/tests/test_isatab/fixtures/m_MTBLS1_metabolite_profiling_NMR_spectroscopy_v2_maf.tsv +6 -0
  412. metaseed-0.14.0/tests/test_isatab/fixtures/s_MTBLS1.txt +6 -0
  413. metaseed-0.14.0/tests/test_isatab/test_isatab.py +86 -0
  414. metaseed-0.14.0/tests/test_isatab/test_reader.py +66 -0
  415. metaseed-0.14.0/tests/test_llm.py +254 -0
  416. metaseed-0.14.0/tests/test_logging.py +108 -0
  417. metaseed-0.14.0/tests/test_mapping.py +37 -0
  418. metaseed-0.14.0/tests/test_metabolights/__init__.py +1 -0
  419. metaseed-0.14.0/tests/test_metabolights/fixtures/study.json +196 -0
  420. metaseed-0.14.0/tests/test_metabolights/test_client.py +76 -0
  421. metaseed-0.14.0/tests/test_metabolights/test_conformance.py +72 -0
  422. metaseed-0.14.0/tests/test_metabolights/test_export.py +129 -0
  423. metaseed-0.14.0/tests/test_metabolights/test_import.py +37 -0
  424. metaseed-0.14.0/tests/test_metabolights/test_isatab_import.py +86 -0
  425. metaseed-0.14.0/tests/test_metabolights/test_mapper.py +119 -0
  426. metaseed-0.14.0/tests/test_metabolights/test_validate.py +103 -0
  427. metaseed-0.14.0/tests/test_models/__init__.py +1 -0
  428. metaseed-0.14.0/tests/test_models/test_factory.py +586 -0
  429. metaseed-0.14.0/tests/test_models/test_registry.py +205 -0
  430. metaseed-0.14.0/tests/test_models/test_types.py +55 -0
  431. metaseed-0.14.0/tests/test_modularity.py +53 -0
  432. metaseed-0.14.0/tests/test_pride/__init__.py +1 -0
  433. metaseed-0.14.0/tests/test_pride/fixtures/files.json +74 -0
  434. metaseed-0.14.0/tests/test_pride/fixtures/project.json +91 -0
  435. metaseed-0.14.0/tests/test_pride/test_client.py +112 -0
  436. metaseed-0.14.0/tests/test_pride/test_conformance.py +55 -0
  437. metaseed-0.14.0/tests/test_pride/test_export.py +209 -0
  438. metaseed-0.14.0/tests/test_pride/test_import.py +39 -0
  439. metaseed-0.14.0/tests/test_pride/test_mapper.py +116 -0
  440. metaseed-0.14.0/tests/test_pride/test_validate.py +165 -0
  441. metaseed-0.14.0/tests/test_profiles.py +193 -0
  442. metaseed-0.14.0/tests/test_repositories/test_dataset_repository.py +225 -0
  443. metaseed-0.14.0/tests/test_repositories/test_file_repository.py +437 -0
  444. metaseed-0.14.0/tests/test_repositories/test_memory_repository.py +48 -0
  445. metaseed-0.14.0/tests/test_seek/test_client.py +228 -0
  446. metaseed-0.14.0/tests/test_seek/test_fairds.py +212 -0
  447. metaseed-0.14.0/tests/test_seek/test_importer.py +215 -0
  448. metaseed-0.14.0/tests/test_seek/test_live.py +86 -0
  449. metaseed-0.14.0/tests/test_seek/test_payloads.py +126 -0
  450. metaseed-0.14.0/tests/test_seek/test_provision.py +241 -0
  451. metaseed-0.14.0/tests/test_seek/test_sync.py +185 -0
  452. metaseed-0.14.0/tests/test_serialization_safety.py +107 -0
  453. metaseed-0.14.0/tests/test_services/__init__.py +1 -0
  454. metaseed-0.14.0/tests/test_services/test_ontology.py +402 -0
  455. metaseed-0.14.0/tests/test_settings.py +80 -0
  456. metaseed-0.14.0/tests/test_spec_language.py +1634 -0
  457. metaseed-0.14.0/tests/test_specs/__init__.py +1 -0
  458. metaseed-0.14.0/tests/test_specs/test_builder.py +406 -0
  459. metaseed-0.14.0/tests/test_specs/test_ena_sample_requirements.py +88 -0
  460. metaseed-0.14.0/tests/test_specs/test_entities.py +274 -0
  461. metaseed-0.14.0/tests/test_specs/test_loader.py +566 -0
  462. metaseed-0.14.0/tests/test_specs/test_marker_roundtrip.py +44 -0
  463. metaseed-0.14.0/tests/test_specs/test_merge/__init__.py +1 -0
  464. metaseed-0.14.0/tests/test_specs/test_merge/test_comparator.py +328 -0
  465. metaseed-0.14.0/tests/test_specs/test_merge/test_docs.py +661 -0
  466. metaseed-0.14.0/tests/test_specs/test_merge/test_merger.py +205 -0
  467. metaseed-0.14.0/tests/test_specs/test_merge/test_reports.py +107 -0
  468. metaseed-0.14.0/tests/test_specs/test_merge/test_strategies.py +418 -0
  469. metaseed-0.14.0/tests/test_specs/test_merge/test_visualizer.py +462 -0
  470. metaseed-0.14.0/tests/test_specs/test_persistence_security.py +102 -0
  471. metaseed-0.14.0/tests/test_specs/test_schema.py +507 -0
  472. metaseed-0.14.0/tests/test_storage/__init__.py +1 -0
  473. metaseed-0.14.0/tests/test_storage/test_json.py +184 -0
  474. metaseed-0.14.0/tests/test_storage/test_yaml.py +171 -0
  475. metaseed-0.14.0/tests/test_ui/__init__.py +1 -0
  476. metaseed-0.14.0/tests/test_ui/examples.py +57 -0
  477. metaseed-0.14.0/tests/test_ui/selenium/__init__.py +1 -0
  478. metaseed-0.14.0/tests/test_ui/selenium/test_file_creation.py +671 -0
  479. metaseed-0.14.0/tests/test_ui/test_adapter_export.py +111 -0
  480. metaseed-0.14.0/tests/test_ui/test_app_context_isolation.py +35 -0
  481. metaseed-0.14.0/tests/test_ui/test_bulk_edit.py +392 -0
  482. metaseed-0.14.0/tests/test_ui/test_dataset_manager.py +259 -0
  483. metaseed-0.14.0/tests/test_ui/test_datasets.py +241 -0
  484. metaseed-0.14.0/tests/test_ui/test_examples_ui.py +133 -0
  485. metaseed-0.14.0/tests/test_ui/test_export_service.py +72 -0
  486. metaseed-0.14.0/tests/test_ui/test_graph.py +234 -0
  487. metaseed-0.14.0/tests/test_ui/test_helpers.py +486 -0
  488. metaseed-0.14.0/tests/test_ui/test_htmx.py +1252 -0
  489. metaseed-0.14.0/tests/test_ui/test_import.py +152 -0
  490. metaseed-0.14.0/tests/test_ui/test_lookup.py +432 -0
  491. metaseed-0.14.0/tests/test_ui/test_navigation_helpers.py +53 -0
  492. metaseed-0.14.0/tests/test_ui/test_nested_routes.py +39 -0
  493. metaseed-0.14.0/tests/test_ui/test_reference_linked_children.py +753 -0
  494. metaseed-0.14.0/tests/test_ui/test_reset_isolation.py +49 -0
  495. metaseed-0.14.0/tests/test_ui/test_seek_routes.py +160 -0
  496. metaseed-0.14.0/tests/test_ui/test_seek_selenium.py +219 -0
  497. metaseed-0.14.0/tests/test_ui/test_selenium.py +1989 -0
  498. metaseed-0.14.0/tests/test_ui/test_settings_routes.py +82 -0
  499. metaseed-0.14.0/tests/test_ui/test_spec_builder.py +924 -0
  500. metaseed-0.14.0/tests/test_ui/test_spec_builder_selenium.py +694 -0
  501. metaseed-0.14.0/tests/test_ui/test_validation_selenium.py +337 -0
  502. metaseed-0.14.0/tests/test_utils/__init__.py +0 -0
  503. metaseed-0.14.0/tests/test_utils/test_text.py +18 -0
  504. metaseed-0.14.0/tests/test_validators/__init__.py +1 -0
  505. metaseed-0.14.0/tests/test_validators/test_api.py +19 -0
  506. metaseed-0.14.0/tests/test_validators/test_constraint_enforcement.py +58 -0
  507. metaseed-0.14.0/tests/test_validators/test_cv.py +75 -0
  508. metaseed-0.14.0/tests/test_validators/test_dataset.py +412 -0
  509. metaseed-0.14.0/tests/test_validators/test_engine.py +436 -0
  510. metaseed-0.14.0/tests/test_validators/test_rule_constraint_enforcement.py +116 -0
  511. metaseed-0.14.0/tests/test_validators/test_rules.py +620 -0
  512. metaseed-0.14.0/tests/test_validators/test_uri_pattern_enforcement.py +53 -0
  513. metaseed-0.14.0/uv.lock +3218 -0
@@ -0,0 +1,42 @@
1
+ ---
2
+ name: Bug Report
3
+ about: Report a bug to help us improve
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Description
10
+
11
+ A clear description of the bug.
12
+
13
+ ## Steps to Reproduce
14
+
15
+ 1. Go to '...'
16
+ 2. Click on '...'
17
+ 3. See error
18
+
19
+ ## Expected Behavior
20
+
21
+ What you expected to happen.
22
+
23
+ ## Actual Behavior
24
+
25
+ What actually happened.
26
+
27
+ ## Environment
28
+
29
+ - OS: [e.g., macOS 14, Ubuntu 22.04]
30
+ - Python version: [e.g., 3.11.5]
31
+ - Metaseed version: [e.g., 0.6.0]
32
+ - Browser (if UI issue): [e.g., Chrome 120]
33
+
34
+ ## Error Messages
35
+
36
+ ```
37
+ Paste any error messages here
38
+ ```
39
+
40
+ ## Additional Context
41
+
42
+ Any other relevant information.
@@ -0,0 +1,27 @@
1
+ ---
2
+ name: Feature Request
3
+ about: Suggest a new feature
4
+ title: ''
5
+ labels: enhancement
6
+ assignees: ''
7
+ ---
8
+
9
+ ## Problem
10
+
11
+ Describe the problem this feature would solve.
12
+
13
+ ## Proposed Solution
14
+
15
+ Describe your proposed solution.
16
+
17
+ ## Alternatives Considered
18
+
19
+ Any alternative solutions you've considered.
20
+
21
+ ## Use Case
22
+
23
+ How would you use this feature?
24
+
25
+ ## Additional Context
26
+
27
+ Any other relevant information, mockups, or examples.
@@ -0,0 +1,25 @@
1
+ ## Description
2
+
3
+ Brief description of the changes.
4
+
5
+ ## Related Issues
6
+
7
+ Fixes #(issue number)
8
+
9
+ ## Type of Change
10
+
11
+ - [ ] Bug fix
12
+ - [ ] New feature
13
+ - [ ] Breaking change
14
+ - [ ] Documentation update
15
+
16
+ ## Checklist
17
+
18
+ - [ ] Tests pass locally
19
+ - [ ] Pre-commit hooks pass
20
+ - [ ] Documentation updated (if applicable)
21
+ - [ ] Changes are backward compatible (or breaking changes documented)
22
+
23
+ ## Testing
24
+
25
+ Describe how the changes were tested.
@@ -0,0 +1,107 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ # Least privilege: CI only needs to read the repo.
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ test:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
21
+
22
+ - name: Set up Python
23
+ run: uv python install 3.12
24
+
25
+ - name: Install dependencies
26
+ # dcat (rdflib) is needed so mypy sees real types for dcat/serialize.py;
27
+ # the other extras are just httpx, already pulled in by dev.
28
+ run: uv sync --extra dev --extra dcat
29
+
30
+ - name: Run linting
31
+ run: uv run ruff check .
32
+
33
+ - name: Check formatting
34
+ # Gate formatting in CI, not only in the pre-commit hook. Without this,
35
+ # drift is invisible to anyone who commits without the hook installed --
36
+ # which is how main reached 18 non-compliant files before #147.
37
+ run: uv run ruff format --check .
38
+
39
+ - name: Run type checking
40
+ run: uv run mypy src/metaseed
41
+
42
+ - name: Run tests with coverage
43
+ # Exclude network-marked tests: they hit live third-party services
44
+ # (e.g. the EBI/MetaboLights API), so an external outage would fail CI
45
+ # for unrelated changes. Exclude selenium-marked tests: they drive a real
46
+ # browser and run in the dedicated `selenium` job below. This matches the
47
+ # project's pre-push hook.
48
+ run: |
49
+ uv run pytest \
50
+ -m "not selenium and not network" \
51
+ --cov=src/metaseed \
52
+ --cov-report=xml \
53
+ --cov-fail-under=78 \
54
+ -q
55
+
56
+ - name: Upload coverage to Codecov
57
+ uses: codecov/codecov-action@0565863a31f2c772f9f0395002a31e3f06189574 # v5.4.0
58
+ with:
59
+ token: ${{ secrets.CODECOV_TOKEN }}
60
+ files: ./coverage.xml
61
+ fail_ci_if_error: false
62
+
63
+ selenium:
64
+ runs-on: ubuntu-latest
65
+ # Advisory: the browser suite drives a real headless Chrome, so occasional
66
+ # flakiness must never block a merge. ubuntu-latest ships Chrome, and
67
+ # Selenium Manager (selenium>=4.20) resolves the driver; the tests start
68
+ # their own uvicorn server, so no extra service setup is needed.
69
+ continue-on-error: true
70
+ steps:
71
+ - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
72
+
73
+ - name: Install uv
74
+ uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
75
+
76
+ - name: Set up Python
77
+ run: uv python install 3.12
78
+
79
+ - name: Install dependencies
80
+ run: uv sync --extra dev --extra dcat
81
+
82
+ - name: Run Selenium tests (headless Chrome)
83
+ # --timeout caps any hung browser so a stuck test cannot stall the job.
84
+ run: uv run pytest -m selenium tests/test_ui -q --timeout=180
85
+
86
+ audit:
87
+ runs-on: ubuntu-latest
88
+ # Advisory: a newly-disclosed CVE in a transitive dependency must not block
89
+ # an unrelated PR — the vulnerability DB updates independently of this code.
90
+ continue-on-error: true
91
+ steps:
92
+ - uses: actions/checkout@08eba0b27e820071cde6df949e0beb9ba4906955 # v4.3.0
93
+
94
+ - name: Install uv
95
+ uses: astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5.4.2
96
+
97
+ - name: Set up Python
98
+ # Use uv-managed CPython (ships ensurepip), so uvx can build pip-audit's
99
+ # isolated environment.
100
+ run: uv python install 3.12
101
+
102
+ - name: Audit dependencies for known vulnerabilities
103
+ # Audit the full locked closure — base + all extras + dev group — so a CVE
104
+ # in an optional adapter dep (metaseed[pride], dcat, …) is caught too.
105
+ run: |
106
+ uv export --format requirements-txt --no-emit-project --no-hashes --all-extras \
107
+ | uvx --python 3.12 pip-audit --requirement /dev/stdin
@@ -0,0 +1,70 @@
1
+ name: Deploy Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ paths:
8
+ - 'docs/**'
9
+ - 'mkdocs.yml'
10
+ - '.github/workflows/docs.yml'
11
+ workflow_dispatch:
12
+
13
+ permissions:
14
+ contents: read
15
+ pages: write
16
+ id-token: write
17
+
18
+ concurrency:
19
+ group: pages
20
+ cancel-in-progress: false
21
+
22
+ jobs:
23
+ build:
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+
28
+ - name: Install uv
29
+ uses: astral-sh/setup-uv@v5
30
+
31
+ - name: Set up Python
32
+ run: uv python install 3.12
33
+
34
+ - name: Install dependencies
35
+ run: uv sync --extra docs
36
+
37
+ - name: Install Quarto
38
+ uses: quarto-dev/quarto-actions/setup@v2
39
+
40
+ - name: Build presentation
41
+ run: |
42
+ cd docs/slides
43
+ quarto render index.qmd
44
+
45
+ - name: Build documentation
46
+ run: uv run mkdocs build --strict
47
+
48
+ - name: Copy presentation to site
49
+ run: |
50
+ mkdir -p site/slides
51
+ cp -r docs/slides/index.html docs/slides/images site/slides/
52
+ # embed-resources renders a self-contained index.html; index_files
53
+ # only exists when resources are not embedded.
54
+ [ -d docs/slides/index_files ] && cp -r docs/slides/index_files site/slides/ || true
55
+
56
+ - name: Upload artifact
57
+ uses: actions/upload-pages-artifact@v3
58
+ with:
59
+ path: site
60
+
61
+ deploy:
62
+ needs: build
63
+ runs-on: ubuntu-latest
64
+ environment:
65
+ name: github-pages
66
+ url: ${{ steps.deployment.outputs.page_url }}
67
+ steps:
68
+ - name: Deploy to GitHub Pages
69
+ id: deployment
70
+ uses: actions/deploy-pages@v4
@@ -0,0 +1,78 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ release:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+ with:
17
+ fetch-depth: 0 # Need full history for hatch-vcs
18
+
19
+ - name: Set up Python
20
+ uses: actions/setup-python@v5
21
+ with:
22
+ python-version: "3.12"
23
+
24
+ - name: Install uv
25
+ uses: astral-sh/setup-uv@v4
26
+
27
+ - name: Install dependencies
28
+ # Must match the CI gate's extras, not just its markers: tests/test_seek
29
+ # imports rdflib, so `--extra dev` alone fails at collection and the
30
+ # release never reaches the publish job.
31
+ run: uv sync --extra dev --extra dcat --extra seek
32
+
33
+ - name: Run tests
34
+ # Match the CI gate: exclude network-marked tests. They hit live third-party
35
+ # APIs (EBI/MetaboLights) and flake for unrelated reasons, so a release must
36
+ # never be blocked by an external outage (per CLAUDE.md "Local must match CI").
37
+ run: |
38
+ uv run python -m pytest tests/ \
39
+ -m "not selenium and not network" \
40
+ --ignore=tests/test_ui/test_selenium.py \
41
+ --ignore=tests/test_ui/test_spec_builder_selenium.py \
42
+ --ignore=tests/test_ui/test_validation_selenium.py \
43
+ --ignore=tests/test_ui/selenium/ \
44
+ -q
45
+
46
+ - name: Build package
47
+ run: uv build
48
+
49
+ - name: Create GitHub Release
50
+ uses: softprops/action-gh-release@v2
51
+ with:
52
+ files: dist/*
53
+ generate_release_notes: true
54
+
55
+ - name: Upload dist for the publish job
56
+ uses: actions/upload-artifact@v4
57
+ with:
58
+ name: dist
59
+ path: dist/
60
+
61
+ publish:
62
+ # Publishes to PyPI via Trusted Publishing (OIDC): no API token is stored in
63
+ # the repo. Requires a matching publisher on PyPI for this repo + workflow +
64
+ # environment. Runs only after the release job's tests and build succeed.
65
+ needs: release
66
+ runs-on: ubuntu-latest
67
+ environment: pypi
68
+ permissions:
69
+ id-token: write # mint the short-lived OIDC token PyPI verifies
70
+ steps:
71
+ - name: Download the built distributions
72
+ uses: actions/download-artifact@v4
73
+ with:
74
+ name: dist
75
+ path: dist/
76
+
77
+ - name: Publish to PyPI
78
+ uses: pypa/gh-action-pypi-publish@release/v1
@@ -0,0 +1,69 @@
1
+ # Python
2
+ __pycache__/
3
+
4
+ # Generated version file (hatch-vcs)
5
+ src/metaseed/_version.py
6
+ *.py[cod]
7
+ *$py.class
8
+ *.so
9
+ .Python
10
+ build/
11
+ develop-eggs/
12
+ dist/
13
+ downloads/
14
+ eggs/
15
+ .eggs/
16
+ lib/
17
+ lib64/
18
+ parts/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+
26
+ # Virtual environments
27
+ .venv/
28
+ venv/
29
+ ENV/
30
+
31
+ # UV
32
+ .uv/
33
+ # uv.lock is committed for reproducible dev/CI builds and Dependabot scanning.
34
+
35
+ # Testing
36
+ .pytest_cache/
37
+ .coverage
38
+ htmlcov/
39
+ .tox/
40
+ .nox/
41
+
42
+ # IDE
43
+ .idea/
44
+ .vscode/
45
+ *.swp
46
+ *.swo
47
+ *~
48
+
49
+ # Jupyter
50
+ .ipynb_checkpoints/
51
+
52
+ # Documentation
53
+ site/
54
+
55
+ # OS
56
+ .DS_Store
57
+ Thumbs.db
58
+
59
+ # Environment
60
+ .env
61
+ .env.local
62
+ *.local
63
+
64
+ # Logs
65
+ *.log
66
+
67
+ # Type checking
68
+ .mypy_cache/
69
+ .pytype/
@@ -0,0 +1,59 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v4.6.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ exclude: ^mkdocs\.yml$
9
+ - id: check-toml
10
+ - id: check-added-large-files
11
+ args: ['--maxkb=1000']
12
+ - id: check-merge-conflict
13
+ - id: debug-statements
14
+
15
+ - repo: https://github.com/astral-sh/ruff-pre-commit
16
+ # Keep in step with the ruff version resolved in uv.lock. When the two drift,
17
+ # the hook and CI format the same code differently and every toolchain bump
18
+ # produces a repo-wide reformat commit.
19
+ rev: v0.15.22
20
+ hooks:
21
+ - id: ruff
22
+ args: [--fix, --exit-non-zero-on-fix, .]
23
+ pass_filenames: false
24
+ - id: ruff-format
25
+ args: [.]
26
+ pass_filenames: false
27
+
28
+ - repo: local
29
+ hooks:
30
+ - id: vulture
31
+ name: vulture dead code
32
+ entry: uv run vulture
33
+ language: system
34
+ types: [python]
35
+ args: [src/, --min-confidence=80]
36
+ pass_filenames: false
37
+
38
+ - id: mypy
39
+ name: mypy type check
40
+ entry: uv run python -m mypy src/metaseed
41
+ language: system
42
+ types: [python]
43
+ pass_filenames: false
44
+
45
+ - repo: https://github.com/commitizen-tools/commitizen
46
+ rev: v3.27.0
47
+ hooks:
48
+ - id: commitizen
49
+ stages: [commit-msg]
50
+
51
+ - repo: local
52
+ hooks:
53
+ - id: pytest
54
+ name: run tests before push
55
+ entry: uv run python -m pytest -x -q --tb=short -n auto -m "not network and not selenium"
56
+ language: system
57
+ stages: [pre-push]
58
+ pass_filenames: false
59
+ always_run: true
@@ -0,0 +1 @@
1
+ 3.12