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.
- metaseed-0.14.0/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
- metaseed-0.14.0/.github/ISSUE_TEMPLATE/feature_request.md +27 -0
- metaseed-0.14.0/.github/PULL_REQUEST_TEMPLATE.md +25 -0
- metaseed-0.14.0/.github/workflows/ci.yml +107 -0
- metaseed-0.14.0/.github/workflows/docs.yml +70 -0
- metaseed-0.14.0/.github/workflows/release.yml +78 -0
- metaseed-0.14.0/.gitignore +69 -0
- metaseed-0.14.0/.pre-commit-config.yaml +59 -0
- metaseed-0.14.0/.python-version +1 -0
- metaseed-0.14.0/CHANGELOG.md +350 -0
- metaseed-0.14.0/CLAUDE.md +101 -0
- metaseed-0.14.0/CODE_OF_CONDUCT.md +54 -0
- metaseed-0.14.0/CONTRIBUTING.md +132 -0
- metaseed-0.14.0/LICENSE +21 -0
- metaseed-0.14.0/Makefile +71 -0
- metaseed-0.14.0/PKG-INFO +276 -0
- metaseed-0.14.0/README.md +217 -0
- metaseed-0.14.0/SECURITY.md +58 -0
- metaseed-0.14.0/docs/REVIEW.md +270 -0
- metaseed-0.14.0/docs/api/cli.md +212 -0
- metaseed-0.14.0/docs/api/client.md +424 -0
- metaseed-0.14.0/docs/api/facade.md +264 -0
- metaseed-0.14.0/docs/api/rest.md +374 -0
- metaseed-0.14.0/docs/api/schema-specs.md +839 -0
- metaseed-0.14.0/docs/api/spec-builder-mcp.md +104 -0
- metaseed-0.14.0/docs/api/storage.md +202 -0
- metaseed-0.14.0/docs/api/validators.md +280 -0
- metaseed-0.14.0/docs/architecture/brapi-import.md +97 -0
- metaseed-0.14.0/docs/architecture/dataset-repository.md +278 -0
- metaseed-0.14.0/docs/architecture/dcat.md +94 -0
- metaseed-0.14.0/docs/architecture/decisions/001-facade-as-entity-storage.md +123 -0
- metaseed-0.14.0/docs/architecture/ena-import.md +70 -0
- metaseed-0.14.0/docs/architecture/entity-repository.md +229 -0
- metaseed-0.14.0/docs/architecture/exceptions.md +101 -0
- metaseed-0.14.0/docs/architecture/integration-adapters.md +105 -0
- metaseed-0.14.0/docs/architecture/isatab-export.md +34 -0
- metaseed-0.14.0/docs/architecture/metabolights-import.md +134 -0
- metaseed-0.14.0/docs/architecture/metadata-agent.md +554 -0
- metaseed-0.14.0/docs/architecture/model-factory.md +62 -0
- metaseed-0.14.0/docs/architecture/overview.md +179 -0
- metaseed-0.14.0/docs/architecture/pride-import.md +142 -0
- metaseed-0.14.0/docs/architecture/seek-export.md +258 -0
- metaseed-0.14.0/docs/architecture/spec-builder.md +117 -0
- metaseed-0.14.0/docs/architecture/ui-helpers.md +161 -0
- metaseed-0.14.0/docs/client_demo.ipynb +674 -0
- metaseed-0.14.0/docs/demo.ipynb +511 -0
- metaseed-0.14.0/docs/development/contributing.md +106 -0
- metaseed-0.14.0/docs/development/testing-best-practices.md +284 -0
- metaseed-0.14.0/docs/development/testing.md +266 -0
- metaseed-0.14.0/docs/discussion/comparison.md +112 -0
- metaseed-0.14.0/docs/discussion/entity-relationships.md +98 -0
- metaseed-0.14.0/docs/discussion/metabolights-design.md +421 -0
- metaseed-0.14.0/docs/discussion/profile-design-approaches.md +166 -0
- metaseed-0.14.0/docs/facade_demo.ipynb +840 -0
- metaseed-0.14.0/docs/getting-started/installation.md +29 -0
- metaseed-0.14.0/docs/getting-started/quickstart.md +81 -0
- metaseed-0.14.0/docs/guides/logging.md +80 -0
- metaseed-0.14.0/docs/guides/ontology-lookup.md +192 -0
- metaseed-0.14.0/docs/guides/spec-builder.md +325 -0
- metaseed-0.14.0/docs/guides/spec-merge.md +320 -0
- metaseed-0.14.0/docs/images/metaseed-icon-128.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-icon-256.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-icon-512.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-icon.svg +61 -0
- metaseed-0.14.0/docs/images/metaseed-logo-400.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-logo-800.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-logo-light-400.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-logo-light-800.png +0 -0
- metaseed-0.14.0/docs/images/metaseed-logo-light.svg +55 -0
- metaseed-0.14.0/docs/images/metaseed-logo.svg +55 -0
- metaseed-0.14.0/docs/index.md +13 -0
- metaseed-0.14.0/docs/isa_demo.ipynb +1131 -0
- metaseed-0.14.0/docs/profiles/darwin-core.md +237 -0
- metaseed-0.14.0/docs/profiles/dissco.md +272 -0
- metaseed-0.14.0/docs/profiles/ena.md +274 -0
- metaseed-0.14.0/docs/profiles/isa.md +431 -0
- metaseed-0.14.0/docs/profiles/jerm.md +184 -0
- metaseed-0.14.0/docs/profiles/metabolights.md +137 -0
- metaseed-0.14.0/docs/profiles/miappe-htp.md +81 -0
- metaseed-0.14.0/docs/profiles/miappe.md +374 -0
- metaseed-0.14.0/docs/profiles/pride.md +126 -0
- metaseed-0.14.0/docs/slides/.gitignore +3 -0
- metaseed-0.14.0/docs/slides/images/entity-editor.jpg +0 -0
- metaseed-0.14.0/docs/slides/images/fellowship-group.jpg +0 -0
- metaseed-0.14.0/docs/slides/images/graph-view.jpg +0 -0
- metaseed-0.14.0/docs/slides/images/isa-miappe-comparison-in-metaseed.jpg +0 -0
- metaseed-0.14.0/docs/slides/images/metaseed-hub.jpg +0 -0
- metaseed-0.14.0/docs/slides/images/metaseed-icon.svg +61 -0
- metaseed-0.14.0/docs/slides/images/metaseed-logo-dark.svg +55 -0
- metaseed-0.14.0/docs/slides/images/metaseed-logo.svg +55 -0
- metaseed-0.14.0/docs/slides/images/spec-builder.jpg +0 -0
- metaseed-0.14.0/docs/slides/index.qmd +514 -0
- metaseed-0.14.0/mkdocs.yml +114 -0
- metaseed-0.14.0/pyproject.toml +280 -0
- metaseed-0.14.0/src/metaseed/__init__.py +110 -0
- metaseed-0.14.0/src/metaseed/_http.py +79 -0
- metaseed-0.14.0/src/metaseed/_mapping.py +24 -0
- metaseed-0.14.0/src/metaseed/_version.py +24 -0
- metaseed-0.14.0/src/metaseed/adapters.py +279 -0
- metaseed-0.14.0/src/metaseed/agent/__init__.py +33 -0
- metaseed-0.14.0/src/metaseed/agent/core.py +530 -0
- metaseed-0.14.0/src/metaseed/agent/mapping.py +278 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/__init__.py +16 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/context.py +36 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/manager.py +352 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/server.py +424 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/__init__.py +17 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/datasets.py +260 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/entities.py +797 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/extraction.py +226 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/ontology.py +354 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/profiles.py +531 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/spec_builder.py +450 -0
- metaseed-0.14.0/src/metaseed/agent/mcp/tools/validation.py +359 -0
- metaseed-0.14.0/src/metaseed/agent/parsers/__init__.py +10 -0
- metaseed-0.14.0/src/metaseed/agent/parsers/csv.py +78 -0
- metaseed-0.14.0/src/metaseed/agent/parsers/excel.py +124 -0
- metaseed-0.14.0/src/metaseed/agent/parsers/json.py +88 -0
- metaseed-0.14.0/src/metaseed/agent/parsers/registry.py +112 -0
- metaseed-0.14.0/src/metaseed/api/__init__.py +67 -0
- metaseed-0.14.0/src/metaseed/api/base.py +33 -0
- metaseed-0.14.0/src/metaseed/api/client.py +537 -0
- metaseed-0.14.0/src/metaseed/api/entities.py +103 -0
- metaseed-0.14.0/src/metaseed/api/errors.py +161 -0
- metaseed-0.14.0/src/metaseed/api/rest.py +164 -0
- metaseed-0.14.0/src/metaseed/api/schema.py +146 -0
- metaseed-0.14.0/src/metaseed/api/serialization.py +148 -0
- metaseed-0.14.0/src/metaseed/api/validation.py +147 -0
- metaseed-0.14.0/src/metaseed/brapi/__init__.py +77 -0
- metaseed-0.14.0/src/metaseed/brapi/client.py +128 -0
- metaseed-0.14.0/src/metaseed/brapi/export.py +155 -0
- metaseed-0.14.0/src/metaseed/brapi/mapper.py +247 -0
- metaseed-0.14.0/src/metaseed/cli/__init__.py +10 -0
- metaseed-0.14.0/src/metaseed/cli/app.py +433 -0
- metaseed-0.14.0/src/metaseed/cli/commands/__init__.py +1 -0
- metaseed-0.14.0/src/metaseed/cli/commands/example.py +358 -0
- metaseed-0.14.0/src/metaseed/cli/commands/merge.py +186 -0
- metaseed-0.14.0/src/metaseed/cli/migrate.py +185 -0
- metaseed-0.14.0/src/metaseed/cli/migrate_specs.py +181 -0
- metaseed-0.14.0/src/metaseed/cli/output.py +112 -0
- metaseed-0.14.0/src/metaseed/core/__init__.py +25 -0
- metaseed-0.14.0/src/metaseed/core/context.py +35 -0
- metaseed-0.14.0/src/metaseed/core/exceptions.py +59 -0
- metaseed-0.14.0/src/metaseed/core/serialization.py +41 -0
- metaseed-0.14.0/src/metaseed/dcat/__init__.py +30 -0
- metaseed-0.14.0/src/metaseed/dcat/model.py +90 -0
- metaseed-0.14.0/src/metaseed/dcat/resolver.py +187 -0
- metaseed-0.14.0/src/metaseed/dcat/serialize.py +207 -0
- metaseed-0.14.0/src/metaseed/ena/__init__.py +51 -0
- metaseed-0.14.0/src/metaseed/ena/client.py +79 -0
- metaseed-0.14.0/src/metaseed/ena/export.py +154 -0
- metaseed-0.14.0/src/metaseed/ena/mapper.py +165 -0
- metaseed-0.14.0/src/metaseed/examples/darwin-core/1.0/forest-biodiversity-survey.yaml +89 -0
- metaseed-0.14.0/src/metaseed/examples/dissco/0.4/herbarium-specimen.yaml +266 -0
- metaseed-0.14.0/src/metaseed/examples/ena/1.0/arabidopsis-drought-rnaseq.yaml +439 -0
- metaseed-0.14.0/src/metaseed/examples/isa/1.0/metabolomics-study.yaml +950 -0
- metaseed-0.14.0/src/metaseed/examples/miappe/1.1/wheat-drought-study.yaml +939 -0
- metaseed-0.14.0/src/metaseed/examples/miappe/1.2/wheat-drought-study.yaml +536 -0
- metaseed-0.14.0/src/metaseed/examples/pride/1.0/hela-phosphoproteome.yaml +107 -0
- metaseed-0.14.0/src/metaseed/facade/__init__.py +61 -0
- metaseed-0.14.0/src/metaseed/facade/core.py +616 -0
- metaseed-0.14.0/src/metaseed/facade/graph.py +235 -0
- metaseed-0.14.0/src/metaseed/facade/helper.py +522 -0
- metaseed-0.14.0/src/metaseed/facade/node.py +57 -0
- metaseed-0.14.0/src/metaseed/facade/profiles.py +194 -0
- metaseed-0.14.0/src/metaseed/facade/store.py +619 -0
- metaseed-0.14.0/src/metaseed/forms/__init__.py +253 -0
- metaseed-0.14.0/src/metaseed/isatab/__init__.py +336 -0
- metaseed-0.14.0/src/metaseed/isatab/reader.py +196 -0
- metaseed-0.14.0/src/metaseed/llm/__init__.py +23 -0
- metaseed-0.14.0/src/metaseed/llm/service.py +224 -0
- metaseed-0.14.0/src/metaseed/logging.py +93 -0
- metaseed-0.14.0/src/metaseed/metabolights/__init__.py +67 -0
- metaseed-0.14.0/src/metaseed/metabolights/client.py +125 -0
- metaseed-0.14.0/src/metaseed/metabolights/export.py +121 -0
- metaseed-0.14.0/src/metaseed/metabolights/mapper.py +535 -0
- metaseed-0.14.0/src/metaseed/metabolights/validate.py +61 -0
- metaseed-0.14.0/src/metaseed/models/__init__.py +93 -0
- metaseed-0.14.0/src/metaseed/models/factory.py +463 -0
- metaseed-0.14.0/src/metaseed/models/registry.py +97 -0
- metaseed-0.14.0/src/metaseed/models/types.py +15 -0
- metaseed-0.14.0/src/metaseed/paths.py +56 -0
- metaseed-0.14.0/src/metaseed/pride/__init__.py +61 -0
- metaseed-0.14.0/src/metaseed/pride/client.py +134 -0
- metaseed-0.14.0/src/metaseed/pride/export.py +239 -0
- metaseed-0.14.0/src/metaseed/pride/mapper.py +227 -0
- metaseed-0.14.0/src/metaseed/pride/validate.py +184 -0
- metaseed-0.14.0/src/metaseed/profiles/__init__.py +9 -0
- metaseed-0.14.0/src/metaseed/profiles/factory.py +125 -0
- metaseed-0.14.0/src/metaseed/repositories/__init__.py +40 -0
- metaseed-0.14.0/src/metaseed/repositories/base.py +150 -0
- metaseed-0.14.0/src/metaseed/repositories/dataset_repository.py +165 -0
- metaseed-0.14.0/src/metaseed/repositories/file.py +436 -0
- metaseed-0.14.0/src/metaseed/repositories/filesystem_dataset.py +212 -0
- metaseed-0.14.0/src/metaseed/repositories/helpers.py +236 -0
- metaseed-0.14.0/src/metaseed/repositories/memory.py +288 -0
- metaseed-0.14.0/src/metaseed/seek/__init__.py +76 -0
- metaseed-0.14.0/src/metaseed/seek/client.py +271 -0
- metaseed-0.14.0/src/metaseed/seek/fairds.py +269 -0
- metaseed-0.14.0/src/metaseed/seek/importer.py +238 -0
- metaseed-0.14.0/src/metaseed/seek/payloads.py +207 -0
- metaseed-0.14.0/src/metaseed/seek/provision.py +359 -0
- metaseed-0.14.0/src/metaseed/seek/roles.py +56 -0
- metaseed-0.14.0/src/metaseed/seek/sync.py +203 -0
- metaseed-0.14.0/src/metaseed/services/__init__.py +13 -0
- metaseed-0.14.0/src/metaseed/services/ontology.py +761 -0
- metaseed-0.14.0/src/metaseed/settings.py +126 -0
- metaseed-0.14.0/src/metaseed/specs/__init__.py +22 -0
- metaseed-0.14.0/src/metaseed/specs/builder.py +554 -0
- metaseed-0.14.0/src/metaseed/specs/darwin-core/1.0/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/darwin-core/1.0/profile.yaml +1340 -0
- metaseed-0.14.0/src/metaseed/specs/dissco/0.4/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/dissco/0.4/profile.yaml +1784 -0
- metaseed-0.14.0/src/metaseed/specs/ena/1.0/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/ena/1.0/profile.yaml +1255 -0
- metaseed-0.14.0/src/metaseed/specs/isa/1.0/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/isa/1.0/profile.yaml +921 -0
- metaseed-0.14.0/src/metaseed/specs/jerm/1.0/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/jerm/1.0/profile.yaml +1188 -0
- metaseed-0.14.0/src/metaseed/specs/loader.py +480 -0
- metaseed-0.14.0/src/metaseed/specs/merge/__init__.py +89 -0
- metaseed-0.14.0/src/metaseed/specs/merge/comparator.py +588 -0
- metaseed-0.14.0/src/metaseed/specs/merge/facade.py +87 -0
- metaseed-0.14.0/src/metaseed/specs/merge/merger.py +438 -0
- metaseed-0.14.0/src/metaseed/specs/merge/models.py +284 -0
- metaseed-0.14.0/src/metaseed/specs/merge/reports.py +519 -0
- metaseed-0.14.0/src/metaseed/specs/merge/strategies.py +389 -0
- metaseed-0.14.0/src/metaseed/specs/merge/visualizer.py +333 -0
- metaseed-0.14.0/src/metaseed/specs/metabolights/1.0/profile.yaml +555 -0
- metaseed-0.14.0/src/metaseed/specs/miappe/1.1/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/miappe/1.1/profile.yaml +1409 -0
- metaseed-0.14.0/src/metaseed/specs/miappe/1.2/notes.md +1 -0
- metaseed-0.14.0/src/metaseed/specs/miappe/1.2/profile.yaml +1671 -0
- metaseed-0.14.0/src/metaseed/specs/miappe-htp/1.0/notes.md +5 -0
- metaseed-0.14.0/src/metaseed/specs/miappe-htp/1.0/profile.yaml +998 -0
- metaseed-0.14.0/src/metaseed/specs/persistence.py +188 -0
- metaseed-0.14.0/src/metaseed/specs/pride/1.0/profile.yaml +455 -0
- metaseed-0.14.0/src/metaseed/specs/schema.py +436 -0
- metaseed-0.14.0/src/metaseed/storage/__init__.py +16 -0
- metaseed-0.14.0/src/metaseed/storage/base.py +53 -0
- metaseed-0.14.0/src/metaseed/storage/json_backend.py +79 -0
- metaseed-0.14.0/src/metaseed/storage/yaml_backend.py +77 -0
- metaseed-0.14.0/src/metaseed/ui/__init__.py +35 -0
- metaseed-0.14.0/src/metaseed/ui/app.py +175 -0
- metaseed-0.14.0/src/metaseed/ui/dataset_manager.py +313 -0
- metaseed-0.14.0/src/metaseed/ui/datasets.py +220 -0
- metaseed-0.14.0/src/metaseed/ui/helpers/__init__.py +94 -0
- metaseed-0.14.0/src/metaseed/ui/helpers/entity_helpers.py +312 -0
- metaseed-0.14.0/src/metaseed/ui/helpers/navigation_helpers.py +221 -0
- metaseed-0.14.0/src/metaseed/ui/helpers/spec_builder_helpers.py +61 -0
- metaseed-0.14.0/src/metaseed/ui/helpers/table_helpers.py +225 -0
- metaseed-0.14.0/src/metaseed/ui/helpers/validation.py +389 -0
- metaseed-0.14.0/src/metaseed/ui/routes/__init__.py +48 -0
- metaseed-0.14.0/src/metaseed/ui/routes/api.py +627 -0
- metaseed-0.14.0/src/metaseed/ui/routes/core.py +226 -0
- metaseed-0.14.0/src/metaseed/ui/routes/crud.py +372 -0
- metaseed-0.14.0/src/metaseed/ui/routes/dcat.py +159 -0
- metaseed-0.14.0/src/metaseed/ui/routes/examples.py +169 -0
- metaseed-0.14.0/src/metaseed/ui/routes/explore.py +193 -0
- metaseed-0.14.0/src/metaseed/ui/routes/forms.py +243 -0
- metaseed-0.14.0/src/metaseed/ui/routes/import_export.py +177 -0
- metaseed-0.14.0/src/metaseed/ui/routes/nested.py +280 -0
- metaseed-0.14.0/src/metaseed/ui/routes/seek.py +285 -0
- metaseed-0.14.0/src/metaseed/ui/routes/settings.py +85 -0
- metaseed-0.14.0/src/metaseed/ui/routes/table.py +384 -0
- metaseed-0.14.0/src/metaseed/ui/routes/validation.py +412 -0
- metaseed-0.14.0/src/metaseed/ui/services/__init__.py +1 -0
- metaseed-0.14.0/src/metaseed/ui/services/entities.py +224 -0
- metaseed-0.14.0/src/metaseed/ui/services/export.py +160 -0
- metaseed-0.14.0/src/metaseed/ui/services/graph.py +43 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/__init__.py +66 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_entities.py +194 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_export.py +297 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_fields.py +314 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_main.py +237 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/routes_rules.py +255 -0
- metaseed-0.14.0/src/metaseed/ui/spec_builder/state.py +64 -0
- metaseed-0.14.0/src/metaseed/ui/spec_filesystem.py +224 -0
- metaseed-0.14.0/src/metaseed/ui/spec_persistence.py +120 -0
- metaseed-0.14.0/src/metaseed/ui/spec_provider.py +82 -0
- metaseed-0.14.0/src/metaseed/ui/state.py +411 -0
- metaseed-0.14.0/src/metaseed/ui/static/css/style.css +5590 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon-128.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon-256.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon-512.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-icon.svg +61 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-400.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-800.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-light-400.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-light-800.png +0 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo-light.svg +55 -0
- metaseed-0.14.0/src/metaseed/ui/static/images/metaseed-logo.svg +55 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/app.js +1775 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/core.js +253 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/dataset.js +223 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/erd-common.js +178 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/graph.js +630 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/lookup.js +717 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/mcp.js +87 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/spec-builder.js +764 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/table-edit.js +339 -0
- metaseed-0.14.0/src/metaseed/ui/static/js/validation.js +116 -0
- metaseed-0.14.0/src/metaseed/ui/templates/base.html +131 -0
- metaseed-0.14.0/src/metaseed/ui/templates/components/breadcrumb.html +18 -0
- metaseed-0.14.0/src/metaseed/ui/templates/components/lookup_modal.html +26 -0
- metaseed-0.14.0/src/metaseed/ui/templates/components/notification.html +3 -0
- metaseed-0.14.0/src/metaseed/ui/templates/components/validation_result.html +130 -0
- metaseed-0.14.0/src/metaseed/ui/templates/datasets_list.html +87 -0
- metaseed-0.14.0/src/metaseed/ui/templates/explore/index.html +762 -0
- metaseed-0.14.0/src/metaseed/ui/templates/index.html +74 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/adapter_toggle.html +50 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/field.html +150 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/form.html +148 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/form_sections.html +74 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/form_success.html +12 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/inline_table.html +117 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/inline_table_row.html +66 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/nested_form.html +70 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/profile_select.html +44 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/table.html +115 -0
- metaseed-0.14.0/src/metaseed/ui/templates/partials/table_row.html +96 -0
- metaseed-0.14.0/src/metaseed/ui/templates/seek/_project_select.html +13 -0
- metaseed-0.14.0/src/metaseed/ui/templates/seek/index.html +141 -0
- metaseed-0.14.0/src/metaseed/ui/templates/settings/index.html +16 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/base.html +270 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/entities_list.html +51 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/entity_editor.html +170 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/field_form.html +317 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/notes_panel.html +100 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/profile_metadata_form.html +52 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/save_result.html +9 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/validation_rule_form.html +281 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/validation_rules_list.html +55 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/partials/yaml_preview.html +104 -0
- metaseed-0.14.0/src/metaseed/ui/templates/spec_builder/start.html +232 -0
- metaseed-0.14.0/src/metaseed/ui/websocket.py +90 -0
- metaseed-0.14.0/src/metaseed/utils/__init__.py +6 -0
- metaseed-0.14.0/src/metaseed/utils/json.py +20 -0
- metaseed-0.14.0/src/metaseed/utils/text.py +16 -0
- metaseed-0.14.0/src/metaseed/validators/__init__.py +44 -0
- metaseed-0.14.0/src/metaseed/validators/api.py +437 -0
- metaseed-0.14.0/src/metaseed/validators/base.py +100 -0
- metaseed-0.14.0/src/metaseed/validators/cv.py +64 -0
- metaseed-0.14.0/src/metaseed/validators/dataset.py +681 -0
- metaseed-0.14.0/src/metaseed/validators/engine.py +522 -0
- metaseed-0.14.0/src/metaseed/validators/rules.py +756 -0
- metaseed-0.14.0/tests/__init__.py +1 -0
- metaseed-0.14.0/tests/conftest.py +43 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/BII-I-1.json +1 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/MIAPPE_Checklist_Data_Model.tsv +106 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/a_MTBLS1_metabolite_profiling.txt +133 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/i_MTBLS1.txt +100 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/i_MTBLS528.txt +97 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/s_MTBLS1.txt +133 -0
- metaseed-0.14.0/tests/fixtures/isa_examples/s_MTBLS528.txt +217 -0
- metaseed-0.14.0/tests/test_adapters.py +145 -0
- metaseed-0.14.0/tests/test_agent/__init__.py +1 -0
- metaseed-0.14.0/tests/test_agent/helpers.py +33 -0
- metaseed-0.14.0/tests/test_agent/test_core.py +358 -0
- metaseed-0.14.0/tests/test_agent/test_core_redos.py +67 -0
- metaseed-0.14.0/tests/test_agent/test_mapping.py +259 -0
- metaseed-0.14.0/tests/test_agent/test_mcp.py +1949 -0
- metaseed-0.14.0/tests/test_agent/test_mcp_spec_builder.py +179 -0
- metaseed-0.14.0/tests/test_agent/test_mcp_state_consistency.py +69 -0
- metaseed-0.14.0/tests/test_agent/test_ontology_tools.py +379 -0
- metaseed-0.14.0/tests/test_agent/test_parsers.py +288 -0
- metaseed-0.14.0/tests/test_api/__init__.py +1 -0
- metaseed-0.14.0/tests/test_api/test_client.py +1004 -0
- metaseed-0.14.0/tests/test_api/test_endpoints.py +120 -0
- metaseed-0.14.0/tests/test_brapi/__init__.py +0 -0
- metaseed-0.14.0/tests/test_brapi/fixtures/brapi.json +190 -0
- metaseed-0.14.0/tests/test_brapi/test_client.py +126 -0
- metaseed-0.14.0/tests/test_brapi/test_conformance.py +42 -0
- metaseed-0.14.0/tests/test_brapi/test_export.py +89 -0
- metaseed-0.14.0/tests/test_brapi/test_import.py +47 -0
- metaseed-0.14.0/tests/test_brapi/test_mapper.py +82 -0
- metaseed-0.14.0/tests/test_cli/__init__.py +1 -0
- metaseed-0.14.0/tests/test_cli/test_check.py +262 -0
- metaseed-0.14.0/tests/test_cli/test_commands.py +336 -0
- metaseed-0.14.0/tests/test_cli/test_example.py +256 -0
- metaseed-0.14.0/tests/test_cli/test_merge_commands.py +161 -0
- metaseed-0.14.0/tests/test_cli/test_merge_docs.py +204 -0
- metaseed-0.14.0/tests/test_cli/test_migrate.py +293 -0
- metaseed-0.14.0/tests/test_cli_commands.py +526 -0
- metaseed-0.14.0/tests/test_core/__init__.py +1 -0
- metaseed-0.14.0/tests/test_core/test_context.py +52 -0
- metaseed-0.14.0/tests/test_core/test_exceptions.py +70 -0
- metaseed-0.14.0/tests/test_dcat/__init__.py +0 -0
- metaseed-0.14.0/tests/test_dcat/test_catalog_metadata_persistence.py +38 -0
- metaseed-0.14.0/tests/test_dcat/test_resolver.py +153 -0
- metaseed-0.14.0/tests/test_dcat/test_route.py +75 -0
- metaseed-0.14.0/tests/test_dcat/test_serialize.py +84 -0
- metaseed-0.14.0/tests/test_dcat/test_serialize_robustness.py +60 -0
- metaseed-0.14.0/tests/test_declared_identity.py +42 -0
- metaseed-0.14.0/tests/test_docs/__init__.py +0 -0
- metaseed-0.14.0/tests/test_docs/test_doc_imports.py +66 -0
- metaseed-0.14.0/tests/test_docs/test_profile_docs.py +198 -0
- metaseed-0.14.0/tests/test_ena/__init__.py +0 -0
- metaseed-0.14.0/tests/test_ena/fixtures/read_run.json +40 -0
- metaseed-0.14.0/tests/test_ena/test_client.py +64 -0
- metaseed-0.14.0/tests/test_ena/test_export.py +90 -0
- metaseed-0.14.0/tests/test_ena/test_import.py +27 -0
- metaseed-0.14.0/tests/test_ena/test_mapper.py +88 -0
- metaseed-0.14.0/tests/test_examples.py +649 -0
- metaseed-0.14.0/tests/test_facade.py +827 -0
- metaseed-0.14.0/tests/test_facade_store.py +268 -0
- metaseed-0.14.0/tests/test_field_metadata.py +123 -0
- metaseed-0.14.0/tests/test_http.py +62 -0
- metaseed-0.14.0/tests/test_isatab/__init__.py +0 -0
- metaseed-0.14.0/tests/test_isatab/fixtures/a_MTBLS1_assay.txt +6 -0
- metaseed-0.14.0/tests/test_isatab/fixtures/m_MTBLS1_metabolite_profiling_NMR_spectroscopy_v2_maf.tsv +6 -0
- metaseed-0.14.0/tests/test_isatab/fixtures/s_MTBLS1.txt +6 -0
- metaseed-0.14.0/tests/test_isatab/test_isatab.py +86 -0
- metaseed-0.14.0/tests/test_isatab/test_reader.py +66 -0
- metaseed-0.14.0/tests/test_llm.py +254 -0
- metaseed-0.14.0/tests/test_logging.py +108 -0
- metaseed-0.14.0/tests/test_mapping.py +37 -0
- metaseed-0.14.0/tests/test_metabolights/__init__.py +1 -0
- metaseed-0.14.0/tests/test_metabolights/fixtures/study.json +196 -0
- metaseed-0.14.0/tests/test_metabolights/test_client.py +76 -0
- metaseed-0.14.0/tests/test_metabolights/test_conformance.py +72 -0
- metaseed-0.14.0/tests/test_metabolights/test_export.py +129 -0
- metaseed-0.14.0/tests/test_metabolights/test_import.py +37 -0
- metaseed-0.14.0/tests/test_metabolights/test_isatab_import.py +86 -0
- metaseed-0.14.0/tests/test_metabolights/test_mapper.py +119 -0
- metaseed-0.14.0/tests/test_metabolights/test_validate.py +103 -0
- metaseed-0.14.0/tests/test_models/__init__.py +1 -0
- metaseed-0.14.0/tests/test_models/test_factory.py +586 -0
- metaseed-0.14.0/tests/test_models/test_registry.py +205 -0
- metaseed-0.14.0/tests/test_models/test_types.py +55 -0
- metaseed-0.14.0/tests/test_modularity.py +53 -0
- metaseed-0.14.0/tests/test_pride/__init__.py +1 -0
- metaseed-0.14.0/tests/test_pride/fixtures/files.json +74 -0
- metaseed-0.14.0/tests/test_pride/fixtures/project.json +91 -0
- metaseed-0.14.0/tests/test_pride/test_client.py +112 -0
- metaseed-0.14.0/tests/test_pride/test_conformance.py +55 -0
- metaseed-0.14.0/tests/test_pride/test_export.py +209 -0
- metaseed-0.14.0/tests/test_pride/test_import.py +39 -0
- metaseed-0.14.0/tests/test_pride/test_mapper.py +116 -0
- metaseed-0.14.0/tests/test_pride/test_validate.py +165 -0
- metaseed-0.14.0/tests/test_profiles.py +193 -0
- metaseed-0.14.0/tests/test_repositories/test_dataset_repository.py +225 -0
- metaseed-0.14.0/tests/test_repositories/test_file_repository.py +437 -0
- metaseed-0.14.0/tests/test_repositories/test_memory_repository.py +48 -0
- metaseed-0.14.0/tests/test_seek/test_client.py +228 -0
- metaseed-0.14.0/tests/test_seek/test_fairds.py +212 -0
- metaseed-0.14.0/tests/test_seek/test_importer.py +215 -0
- metaseed-0.14.0/tests/test_seek/test_live.py +86 -0
- metaseed-0.14.0/tests/test_seek/test_payloads.py +126 -0
- metaseed-0.14.0/tests/test_seek/test_provision.py +241 -0
- metaseed-0.14.0/tests/test_seek/test_sync.py +185 -0
- metaseed-0.14.0/tests/test_serialization_safety.py +107 -0
- metaseed-0.14.0/tests/test_services/__init__.py +1 -0
- metaseed-0.14.0/tests/test_services/test_ontology.py +402 -0
- metaseed-0.14.0/tests/test_settings.py +80 -0
- metaseed-0.14.0/tests/test_spec_language.py +1634 -0
- metaseed-0.14.0/tests/test_specs/__init__.py +1 -0
- metaseed-0.14.0/tests/test_specs/test_builder.py +406 -0
- metaseed-0.14.0/tests/test_specs/test_ena_sample_requirements.py +88 -0
- metaseed-0.14.0/tests/test_specs/test_entities.py +274 -0
- metaseed-0.14.0/tests/test_specs/test_loader.py +566 -0
- metaseed-0.14.0/tests/test_specs/test_marker_roundtrip.py +44 -0
- metaseed-0.14.0/tests/test_specs/test_merge/__init__.py +1 -0
- metaseed-0.14.0/tests/test_specs/test_merge/test_comparator.py +328 -0
- metaseed-0.14.0/tests/test_specs/test_merge/test_docs.py +661 -0
- metaseed-0.14.0/tests/test_specs/test_merge/test_merger.py +205 -0
- metaseed-0.14.0/tests/test_specs/test_merge/test_reports.py +107 -0
- metaseed-0.14.0/tests/test_specs/test_merge/test_strategies.py +418 -0
- metaseed-0.14.0/tests/test_specs/test_merge/test_visualizer.py +462 -0
- metaseed-0.14.0/tests/test_specs/test_persistence_security.py +102 -0
- metaseed-0.14.0/tests/test_specs/test_schema.py +507 -0
- metaseed-0.14.0/tests/test_storage/__init__.py +1 -0
- metaseed-0.14.0/tests/test_storage/test_json.py +184 -0
- metaseed-0.14.0/tests/test_storage/test_yaml.py +171 -0
- metaseed-0.14.0/tests/test_ui/__init__.py +1 -0
- metaseed-0.14.0/tests/test_ui/examples.py +57 -0
- metaseed-0.14.0/tests/test_ui/selenium/__init__.py +1 -0
- metaseed-0.14.0/tests/test_ui/selenium/test_file_creation.py +671 -0
- metaseed-0.14.0/tests/test_ui/test_adapter_export.py +111 -0
- metaseed-0.14.0/tests/test_ui/test_app_context_isolation.py +35 -0
- metaseed-0.14.0/tests/test_ui/test_bulk_edit.py +392 -0
- metaseed-0.14.0/tests/test_ui/test_dataset_manager.py +259 -0
- metaseed-0.14.0/tests/test_ui/test_datasets.py +241 -0
- metaseed-0.14.0/tests/test_ui/test_examples_ui.py +133 -0
- metaseed-0.14.0/tests/test_ui/test_export_service.py +72 -0
- metaseed-0.14.0/tests/test_ui/test_graph.py +234 -0
- metaseed-0.14.0/tests/test_ui/test_helpers.py +486 -0
- metaseed-0.14.0/tests/test_ui/test_htmx.py +1252 -0
- metaseed-0.14.0/tests/test_ui/test_import.py +152 -0
- metaseed-0.14.0/tests/test_ui/test_lookup.py +432 -0
- metaseed-0.14.0/tests/test_ui/test_navigation_helpers.py +53 -0
- metaseed-0.14.0/tests/test_ui/test_nested_routes.py +39 -0
- metaseed-0.14.0/tests/test_ui/test_reference_linked_children.py +753 -0
- metaseed-0.14.0/tests/test_ui/test_reset_isolation.py +49 -0
- metaseed-0.14.0/tests/test_ui/test_seek_routes.py +160 -0
- metaseed-0.14.0/tests/test_ui/test_seek_selenium.py +219 -0
- metaseed-0.14.0/tests/test_ui/test_selenium.py +1989 -0
- metaseed-0.14.0/tests/test_ui/test_settings_routes.py +82 -0
- metaseed-0.14.0/tests/test_ui/test_spec_builder.py +924 -0
- metaseed-0.14.0/tests/test_ui/test_spec_builder_selenium.py +694 -0
- metaseed-0.14.0/tests/test_ui/test_validation_selenium.py +337 -0
- metaseed-0.14.0/tests/test_utils/__init__.py +0 -0
- metaseed-0.14.0/tests/test_utils/test_text.py +18 -0
- metaseed-0.14.0/tests/test_validators/__init__.py +1 -0
- metaseed-0.14.0/tests/test_validators/test_api.py +19 -0
- metaseed-0.14.0/tests/test_validators/test_constraint_enforcement.py +58 -0
- metaseed-0.14.0/tests/test_validators/test_cv.py +75 -0
- metaseed-0.14.0/tests/test_validators/test_dataset.py +412 -0
- metaseed-0.14.0/tests/test_validators/test_engine.py +436 -0
- metaseed-0.14.0/tests/test_validators/test_rule_constraint_enforcement.py +116 -0
- metaseed-0.14.0/tests/test_validators/test_rules.py +620 -0
- metaseed-0.14.0/tests/test_validators/test_uri_pattern_enforcement.py +53 -0
- 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
|