pymetadata 0.6.0__tar.gz → 0.6.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.bumpversion.toml +4 -2
- pymetadata-0.6.2/.github/CODEOWNERS +1 -0
- pymetadata-0.6.2/.github/pull_request_template.md +12 -0
- pymetadata-0.6.2/.github/rulesets/apply.sh +43 -0
- pymetadata-0.6.2/.github/rulesets/develop.json +61 -0
- pymetadata-0.6.2/.github/rulesets/main.json +17 -0
- pymetadata-0.6.2/.github/rulesets/tags.json +16 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.github/workflows/ci-cd.yml +41 -3
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.github/workflows/docs.yml +9 -3
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.github/workflows/ruff.yml +8 -2
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.github/workflows/ty.yml +8 -2
- {pymetadata-0.6.0 → pymetadata-0.6.2}/CITATION.cff +2 -2
- {pymetadata-0.6.0 → pymetadata-0.6.2}/CLAUDE.md +12 -4
- {pymetadata-0.6.0 → pymetadata-0.6.2}/PKG-INFO +7 -7
- {pymetadata-0.6.0 → pymetadata-0.6.2}/README.md +6 -6
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/development.md +103 -9
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/index.md +6 -6
- pymetadata-0.6.2/release-notes/0.6.1.md +11 -0
- pymetadata-0.6.2/release-notes/0.6.2.md +21 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/__init__.py +1 -1
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/core/annotation.py +5 -6
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/omex.py +1 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/ontologies/term.py +10 -5
- pymetadata-0.6.2/tests/test_ols.py +35 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_ontology.py +20 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/zensical.toml +3 -3
- pymetadata-0.6.0/tests/test_ols.py +0 -18
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.github/dependabot.yml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.gitignore +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.pre-commit-config.yaml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.python-version +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.ruff.toml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/.zenodo.json +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/LICENSE +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/README.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/annotations.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/cache.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/console.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/core.annotation.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/core.creator.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/core.miriam.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/core.xref.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/index.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/log.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/omex.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/ontologies.term.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/webservices.chebi.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/webservices.ols.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/webservices.registry.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/webservices.unichem.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/api/webservices.webservice.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/HARMONY2026_slides.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/about.txt +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/android-chrome-192x192.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/android-chrome-512x512.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/apple-touch-icon.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/favicon-16x16.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/favicon-32x32.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/favicon.ico +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/favicon_io.zip +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/pymetadata-100x100-300dpi.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/images/favicon/site.webmanifest +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/installation.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/omex.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/docs/robots.txt +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/annotation.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/cache_path.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/MODEL2402290004.4_pymetadata.omex +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/create_omex.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/BioModelsMetadata_MODEL2402290004.csv +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoAcuteBZ1.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoAcuteBZ2.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoAcuteBZ3.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoChronicBZ.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoChronicRZ1.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoChronicRZ2.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/EndoNZ.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/POM253.mat +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/PlotAPCaTTaAcuteAndChronic.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/Zhou2024_Updated-model.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/getCurrentsStructureCaMKSKJrelpKinetics.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/getStartingState.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/main.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/manifest.xml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/metadata.rdf +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/modelRunnerCaMKSKJrelpKinetics1ms.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/biomodels_omex/files/model_ToRORd_LandCaMKSKJrelpKinetics.m +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/omex.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/omex_from_url.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/omex/test.omex +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/pbpko.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/examples/sbo.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/.gitignore +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/README.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/_extensions/grantmcdermott/clean/_extension.yml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/_extensions/grantmcdermott/clean/clean.scss +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/_extensions/grantmcdermott/clean/mathjax-config.js +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/custom.scss +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/annotation_example.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/annotation_resolved.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/annotation_resolved_small.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/github_screenshot.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/headshot.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/omex_logo.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/omex_overview.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/pymetadata.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/pymetadata_large.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/images/qr_livermetabolism.png +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/mathjax-config.js +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/pymetadata.bib +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/pymetadata.qmd +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/presentations/HARMONY2026/styles.css +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/pyproject.toml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.10.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.11.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.12.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.13.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.14.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.15.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.16.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.17.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.18.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.19.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.2.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.20.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.21.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.22.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.3.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.4.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.5.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.6.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.7.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.8.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.0.9.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.1.0.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.1.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.10.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.2.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.3.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.4.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.5.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.6.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.7.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.8.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.2.9.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.0.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.1.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.10.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.11.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.2.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.3.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.4.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.5.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.6.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.7.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.8.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.3.9.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.4.0.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.4.1.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.4.2.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.4.3.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.4.4.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.0.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.1.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.10.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.11.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.12.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.2.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.3.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.4.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.5.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.6.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.7.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.8.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.5.9.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/release-notes/0.6.0.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/scripts/llms_txt.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/cache.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/console.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/core/__init__.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/core/creator.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/core/miriam.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/core/synonym.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/core/xref.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/log.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/ontologies/__init__.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/ontologies/_ontology_builder.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/ontologies/kisao.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/ontologies/pbpko.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/ontologies/sbo.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/py.typed +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/resources/ontologies/README.md +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/webservices/__init__.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/webservices/chebi.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/webservices/ols.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/webservices/registry.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/webservices/unichem.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/src/pymetadata/webservices/webservice.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/core/test_annotation.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/core/test_creator.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/data/omex/BIOMD0000000001.omex +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/data/omex/CombineArchiveShowCase.omex +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/data/omex/CombineArchiveShowCase_manifest.xml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/data/omex/CompModels.omex +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/data/omex/CompModels_manifest.xml +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/data/omex/iCGB21FR.omex +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_cache.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_chebi.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_log.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_offline.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_omex.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_registry.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_sbo_kisao.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_unichem.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tests/test_webservice.py +0 -0
- {pymetadata-0.6.0 → pymetadata-0.6.2}/tox.ini +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
[tool.bumpversion]
|
|
2
|
-
current_version = "0.6.
|
|
2
|
+
current_version = "0.6.2"
|
|
3
3
|
commit = true
|
|
4
4
|
parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
|
|
5
5
|
serialize = ["{major}.{minor}.{patch}"]
|
|
@@ -7,7 +7,9 @@ search = "{current_version}"
|
|
|
7
7
|
replace = "{new_version}"
|
|
8
8
|
regex = false
|
|
9
9
|
ignore_missing_version = false
|
|
10
|
-
tag
|
|
10
|
+
# no tag: the bump is merged into develop through a pull request, which
|
|
11
|
+
# rewrites the commit, so the tag is created on develop afterwards
|
|
12
|
+
tag = false
|
|
11
13
|
sign_tags = false
|
|
12
14
|
tag_name = "{new_version}"
|
|
13
15
|
tag_message = "Bump version: {current_version} → {new_version}"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @matthiaskoenig
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- what does this change and why -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] the pull request targets `develop`
|
|
8
|
+
- [ ] tests were added or updated for the change
|
|
9
|
+
- [ ] `tox run-parallel` passes locally (tests and `ty`)
|
|
10
|
+
- [ ] `ruff check` and `ruff format` are clean, e.g., via `pre-commit run --all-files`
|
|
11
|
+
- [ ] public functions and classes have type annotations and a docstring
|
|
12
|
+
- [ ] user visible changes are in `release-notes/` and, if needed, in `docs/`
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# Apply the repository policies of pymetadata: the merge settings of the
|
|
4
|
+
# repository and the rulesets in this directory. The script is idempotent, i.e.,
|
|
5
|
+
# a ruleset which already exists is updated instead of added a second time, so
|
|
6
|
+
# it can be run again after every change of the json files.
|
|
7
|
+
#
|
|
8
|
+
# The file name of a ruleset has to match the "name" in the json. A ruleset which
|
|
9
|
+
# is removed from this directory stays on the repository, delete it with
|
|
10
|
+
# `gh api -X DELETE repos/<owner>/<repo>/rulesets/<id>`.
|
|
11
|
+
#
|
|
12
|
+
# Requires the github cli (https://cli.github.com) authenticated as a user with
|
|
13
|
+
# admin permission on the repository:
|
|
14
|
+
#
|
|
15
|
+
# gh auth login
|
|
16
|
+
# .github/rulesets/apply.sh [owner/repo]
|
|
17
|
+
#
|
|
18
|
+
set -euo pipefail
|
|
19
|
+
|
|
20
|
+
REPO="${1:-matthiaskoenig/pymetadata}"
|
|
21
|
+
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
22
|
+
|
|
23
|
+
echo "repository settings of ${REPO}"
|
|
24
|
+
gh api -X PATCH "repos/${REPO}" \
|
|
25
|
+
-F allow_auto_merge=true \
|
|
26
|
+
-F delete_branch_on_merge=true \
|
|
27
|
+
-F allow_update_branch=true \
|
|
28
|
+
-F allow_squash_merge=true \
|
|
29
|
+
-F allow_rebase_merge=true \
|
|
30
|
+
-F allow_merge_commit=false \
|
|
31
|
+
--silent
|
|
32
|
+
|
|
33
|
+
for path in "${DIR}"/*.json; do
|
|
34
|
+
name="$(basename "${path}" .json)"
|
|
35
|
+
id="$(gh api "repos/${REPO}/rulesets" --jq "map(select(.name == \"${name}\")) | .[0].id // empty")"
|
|
36
|
+
if [[ -n "${id}" ]]; then
|
|
37
|
+
gh api -X PUT "repos/${REPO}/rulesets/${id}" --input "${path}" --silent
|
|
38
|
+
echo "ruleset ${name} updated (${id})"
|
|
39
|
+
else
|
|
40
|
+
id="$(gh api -X POST "repos/${REPO}/rulesets" --input "${path}" --jq .id)"
|
|
41
|
+
echo "ruleset ${name} created (${id})"
|
|
42
|
+
fi
|
|
43
|
+
done
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "develop",
|
|
3
|
+
"target": "branch",
|
|
4
|
+
"enforcement": "active",
|
|
5
|
+
"bypass_actors": [],
|
|
6
|
+
"conditions": {
|
|
7
|
+
"ref_name": {
|
|
8
|
+
"include": [
|
|
9
|
+
"refs/heads/develop"
|
|
10
|
+
],
|
|
11
|
+
"exclude": []
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"rules": [
|
|
15
|
+
{
|
|
16
|
+
"type": "deletion"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"type": "non_fast_forward"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"type": "required_linear_history"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "pull_request",
|
|
26
|
+
"parameters": {
|
|
27
|
+
"required_approving_review_count": 0,
|
|
28
|
+
"dismiss_stale_reviews_on_push": true,
|
|
29
|
+
"require_code_owner_review": false,
|
|
30
|
+
"require_last_push_approval": false,
|
|
31
|
+
"required_review_thread_resolution": true,
|
|
32
|
+
"allowed_merge_methods": [
|
|
33
|
+
"squash",
|
|
34
|
+
"rebase"
|
|
35
|
+
],
|
|
36
|
+
"require_extra_approval_for_unattributed_changes": false
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"type": "required_status_checks",
|
|
41
|
+
"parameters": {
|
|
42
|
+
"strict_required_status_checks_policy": false,
|
|
43
|
+
"do_not_enforce_on_create": false,
|
|
44
|
+
"required_status_checks": [
|
|
45
|
+
{
|
|
46
|
+
"context": "tests"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"context": "ruff"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"context": "ty"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"context": "docs"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "main",
|
|
3
|
+
"target": "branch",
|
|
4
|
+
"enforcement": "active",
|
|
5
|
+
"bypass_actors": [],
|
|
6
|
+
"conditions": {
|
|
7
|
+
"ref_name": {
|
|
8
|
+
"include": ["refs/heads/main"],
|
|
9
|
+
"exclude": []
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"rules": [
|
|
13
|
+
{"type": "deletion"},
|
|
14
|
+
{"type": "non_fast_forward"},
|
|
15
|
+
{"type": "required_linear_history"}
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tags",
|
|
3
|
+
"target": "tag",
|
|
4
|
+
"enforcement": "active",
|
|
5
|
+
"bypass_actors": [],
|
|
6
|
+
"conditions": {
|
|
7
|
+
"ref_name": {
|
|
8
|
+
"include": ["~ALL"],
|
|
9
|
+
"exclude": []
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"rules": [
|
|
13
|
+
{"type": "deletion"},
|
|
14
|
+
{"type": "non_fast_forward"}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -2,14 +2,19 @@ name: CI-CD
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
+
# feature branches are tested through their pull request, tags release
|
|
6
|
+
branches: [develop, main]
|
|
7
|
+
tags: ['*']
|
|
8
|
+
pull_request:
|
|
9
|
+
branches: [develop, main]
|
|
5
10
|
workflow_dispatch:
|
|
6
11
|
|
|
7
|
-
# least privilege by default, the release
|
|
12
|
+
# least privilege by default, the release and sync jobs raise what they need
|
|
8
13
|
permissions:
|
|
9
14
|
contents: read
|
|
10
15
|
|
|
11
16
|
concurrency:
|
|
12
|
-
group: ${{ github.workflow }}-${{ github.ref }}
|
|
17
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
13
18
|
# superseded branch runs are cancelled, release runs are never cancelled
|
|
14
19
|
cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
|
15
20
|
|
|
@@ -51,8 +56,24 @@ jobs:
|
|
|
51
56
|
run:
|
|
52
57
|
uvx --with tox-uv tox -e py${{ matrix.python-version }}
|
|
53
58
|
|
|
54
|
-
|
|
59
|
+
tests:
|
|
60
|
+
# the one check the branch protection requires; the names of the matrix
|
|
61
|
+
# jobs change with the matrix, this name does not
|
|
62
|
+
name: tests
|
|
55
63
|
needs: test
|
|
64
|
+
if: always()
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
timeout-minutes: 5
|
|
67
|
+
steps:
|
|
68
|
+
- name: Check the result of the test matrix
|
|
69
|
+
env:
|
|
70
|
+
RESULT: ${{ needs.test.result }}
|
|
71
|
+
run: |
|
|
72
|
+
echo "test matrix: $RESULT"
|
|
73
|
+
test "$RESULT" = "success"
|
|
74
|
+
|
|
75
|
+
release:
|
|
76
|
+
needs: tests
|
|
56
77
|
if: startsWith(github.ref, 'refs/tags/')
|
|
57
78
|
runs-on: ubuntu-latest
|
|
58
79
|
timeout-minutes: 20
|
|
@@ -85,3 +106,20 @@ jobs:
|
|
|
85
106
|
body_path: "release-notes/${{ github.ref_name }}.md"
|
|
86
107
|
draft: false
|
|
87
108
|
prerelease: false
|
|
109
|
+
|
|
110
|
+
sync-main:
|
|
111
|
+
# main tracks the latest published release, see docs/development.md
|
|
112
|
+
needs: release
|
|
113
|
+
if: startsWith(github.ref, 'refs/tags/')
|
|
114
|
+
runs-on: ubuntu-latest
|
|
115
|
+
timeout-minutes: 5
|
|
116
|
+
permissions:
|
|
117
|
+
contents: write # fast-forward main to the released commit
|
|
118
|
+
steps:
|
|
119
|
+
- uses: actions/checkout@v7
|
|
120
|
+
with:
|
|
121
|
+
# a shallow clone cannot be pushed to another branch
|
|
122
|
+
fetch-depth: 0
|
|
123
|
+
- name: Fast-forward main to the release
|
|
124
|
+
# no --force: the push fails loudly if it would not be a fast-forward
|
|
125
|
+
run: git push origin HEAD:main
|
|
@@ -2,18 +2,24 @@ name: documentation
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
+
# feature branches are built through their pull request
|
|
6
|
+
branches: [develop, main]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [develop, main]
|
|
5
9
|
workflow_dispatch:
|
|
6
10
|
|
|
7
11
|
permissions:
|
|
8
12
|
contents: read
|
|
9
13
|
|
|
10
14
|
concurrency:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
11
16
|
# never cancel a running deployment, it would leave the site half published
|
|
12
|
-
group: pages
|
|
13
17
|
cancel-in-progress: false
|
|
14
18
|
|
|
15
19
|
jobs:
|
|
16
|
-
|
|
20
|
+
docs:
|
|
21
|
+
# required by the branch protection, see .github/rulesets/develop.json
|
|
22
|
+
name: docs
|
|
17
23
|
runs-on: ubuntu-latest
|
|
18
24
|
timeout-minutes: 15
|
|
19
25
|
steps:
|
|
@@ -42,7 +48,7 @@ jobs:
|
|
|
42
48
|
path: site
|
|
43
49
|
|
|
44
50
|
deploy:
|
|
45
|
-
needs:
|
|
51
|
+
needs: docs
|
|
46
52
|
# only the default branch publishes to https://matthiaskoenig.github.io/pymetadata
|
|
47
53
|
if: github.ref == 'refs/heads/develop'
|
|
48
54
|
runs-on: ubuntu-latest
|
|
@@ -2,17 +2,23 @@ name: ruff
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
+
# feature branches are checked through their pull request
|
|
6
|
+
branches: [develop, main]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [develop, main]
|
|
5
9
|
workflow_dispatch:
|
|
6
10
|
|
|
7
11
|
permissions:
|
|
8
12
|
contents: read
|
|
9
13
|
|
|
10
14
|
concurrency:
|
|
11
|
-
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
-
cancel-in-progress:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
13
17
|
|
|
14
18
|
jobs:
|
|
15
19
|
ruff:
|
|
20
|
+
# required by the branch protection, see .github/rulesets/develop.json
|
|
21
|
+
name: ruff
|
|
16
22
|
runs-on: ubuntu-latest
|
|
17
23
|
timeout-minutes: 10
|
|
18
24
|
steps:
|
|
@@ -2,17 +2,23 @@ name: ty
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
+
# feature branches are checked through their pull request
|
|
6
|
+
branches: [develop, main]
|
|
7
|
+
pull_request:
|
|
8
|
+
branches: [develop, main]
|
|
5
9
|
workflow_dispatch:
|
|
6
10
|
|
|
7
11
|
permissions:
|
|
8
12
|
contents: read
|
|
9
13
|
|
|
10
14
|
concurrency:
|
|
11
|
-
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
-
cancel-in-progress:
|
|
15
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
16
|
+
cancel-in-progress: true
|
|
13
17
|
|
|
14
18
|
jobs:
|
|
15
19
|
ty:
|
|
20
|
+
# required by the branch protection, see .github/rulesets/develop.json
|
|
21
|
+
name: ty
|
|
16
22
|
runs-on: ubuntu-latest
|
|
17
23
|
timeout-minutes: 15
|
|
18
24
|
steps:
|
|
@@ -8,8 +8,8 @@ authors:
|
|
|
8
8
|
given-names: "Matthias"
|
|
9
9
|
orcid: "https://orcid.org/0000-0003-1725-179X"
|
|
10
10
|
affiliation: "Humboldt-University Berlin, Faculty of Life Science, Institute for Biology, Biology, Berlin; University Lübeck; University Hospital Schleswig-Holstein, Campus Lübeck, First Department of Medicine, Germany"
|
|
11
|
-
version: "0.6.
|
|
12
|
-
date-released: "2026-
|
|
11
|
+
version: "0.6.2"
|
|
12
|
+
date-released: "2026-09-07"
|
|
13
13
|
doi: "10.5281/zenodo.5308801"
|
|
14
14
|
license: MIT
|
|
15
15
|
repository-code: "https://github.com/matthiaskoenig/pymetadata"
|
|
@@ -32,10 +32,18 @@ tox -e ty # ty type check (config in [tool.ty] in pyprojec
|
|
|
32
32
|
uvx ty check # same check, straight from the working tree
|
|
33
33
|
```
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
the
|
|
35
|
+
`develop` is the default branch and takes every change through a pull request;
|
|
36
|
+
direct pushes are rejected by the rulesets in `.github/rulesets/` (applied with
|
|
37
|
+
`.github/rulesets/apply.sh`), which require the `tests`, `ruff`, `ty` and `docs`
|
|
38
|
+
checks. `main` only tracks the latest release and is fast-forwarded by the
|
|
39
|
+
`sync-main` job of the release workflow, never by hand.
|
|
40
|
+
|
|
41
|
+
Release steps are in `docs/development.md` (there is no separate `RELEASE.md`):
|
|
42
|
+
the release is prepared on a branch, `uvx bump-my-version bump [major|minor|patch]`
|
|
43
|
+
updates `src/pymetadata/__init__.py` and `CITATION.cff` and commits without
|
|
44
|
+
tagging (`tag = false`, a squash merge would rewrite the commit), and the tag is
|
|
45
|
+
created on `develop` after the pull request was merged, which triggers the PyPI
|
|
46
|
+
release workflow.
|
|
39
47
|
|
|
40
48
|
Documentation is [Zensical](https://zensical.org/): markdown sources in `docs/`,
|
|
41
49
|
configured in `zensical.toml`, built into the gitignored `site/`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pymetadata
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.2
|
|
4
4
|
Summary: pymetadata are python utilities for working with metadata.
|
|
5
5
|
Project-URL: Homepage, https://matthiaskoenig.github.io/pymetadata
|
|
6
6
|
Project-URL: Documentation, https://matthiaskoenig.github.io/pymetadata
|
|
@@ -45,7 +45,7 @@ Description-Content-Type: text/markdown
|
|
|
45
45
|

|
|
46
46
|
|
|
47
47
|
# pymetadata: python utilities for metadata and COMBINE archives
|
|
48
|
-
[](https://github.com/matthiaskoenig/pymetadata/actions/workflows/ci-cd.yml) [](https://matthiaskoenig.github.io/pymetadata) [](https://pypi.org/project/pymetadata/) [](https://pypi.org/project/pymetadata/) [](https://opensource.org/licenses/MIT) [](https://doi.org/10.5281/zenodo.5308801)
|
|
49
49
|
|
|
50
50
|
pymetadata is a collection of python utilities for working with metadata in the context of COMBINE standards with documentation available from [https://matthiaskoenig.github.io/pymetadata](https://matthiaskoenig.github.io/pymetadata).
|
|
51
51
|
|
|
@@ -63,18 +63,18 @@ If you have any questions or issues please [open an issue](https://github.com/ma
|
|
|
63
63
|
|
|
64
64
|
If you use `pymetadata` please cite the archived software on [Zenodo](https://doi.org/10.5281/zenodo.5308801):
|
|
65
65
|
|
|
66
|
-
> König, M. (2026). *pymetadata are python utilities for working with metadata* (Version 0.
|
|
66
|
+
> König, M. (2026). *pymetadata are python utilities for working with metadata* (Version 0.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.22639628
|
|
67
67
|
|
|
68
68
|
```bibtex
|
|
69
69
|
@software{konig_pymetadata,
|
|
70
70
|
author = {König, Matthias},
|
|
71
71
|
title = {pymetadata are python utilities for working with metadata},
|
|
72
72
|
year = {2026},
|
|
73
|
-
month =
|
|
74
|
-
version = {0.
|
|
73
|
+
month = sep,
|
|
74
|
+
version = {0.6.0},
|
|
75
75
|
publisher = {Zenodo},
|
|
76
|
-
doi = {10.5281/zenodo.
|
|
77
|
-
url = {https://doi.org/10.5281/zenodo.
|
|
76
|
+
doi = {10.5281/zenodo.22639628},
|
|
77
|
+
url = {https://doi.org/10.5281/zenodo.22639628},
|
|
78
78
|
}
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
3
|
# pymetadata: python utilities for metadata and COMBINE archives
|
|
4
|
-
[](https://github.com/matthiaskoenig/pymetadata/actions/workflows/ci-cd.yml) [](https://matthiaskoenig.github.io/pymetadata) [](https://pypi.org/project/pymetadata/) [](https://pypi.org/project/pymetadata/) [](https://opensource.org/licenses/MIT) [](https://doi.org/10.5281/zenodo.5308801)
|
|
5
5
|
|
|
6
6
|
pymetadata is a collection of python utilities for working with metadata in the context of COMBINE standards with documentation available from [https://matthiaskoenig.github.io/pymetadata](https://matthiaskoenig.github.io/pymetadata).
|
|
7
7
|
|
|
@@ -19,18 +19,18 @@ If you have any questions or issues please [open an issue](https://github.com/ma
|
|
|
19
19
|
|
|
20
20
|
If you use `pymetadata` please cite the archived software on [Zenodo](https://doi.org/10.5281/zenodo.5308801):
|
|
21
21
|
|
|
22
|
-
> König, M. (2026). *pymetadata are python utilities for working with metadata* (Version 0.
|
|
22
|
+
> König, M. (2026). *pymetadata are python utilities for working with metadata* (Version 0.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.22639628
|
|
23
23
|
|
|
24
24
|
```bibtex
|
|
25
25
|
@software{konig_pymetadata,
|
|
26
26
|
author = {König, Matthias},
|
|
27
27
|
title = {pymetadata are python utilities for working with metadata},
|
|
28
28
|
year = {2026},
|
|
29
|
-
month =
|
|
30
|
-
version = {0.
|
|
29
|
+
month = sep,
|
|
30
|
+
version = {0.6.0},
|
|
31
31
|
publisher = {Zenodo},
|
|
32
|
-
doi = {10.5281/zenodo.
|
|
33
|
-
url = {https://doi.org/10.5281/zenodo.
|
|
32
|
+
doi = {10.5281/zenodo.22639628},
|
|
33
|
+
url = {https://doi.org/10.5281/zenodo.22639628},
|
|
34
34
|
}
|
|
35
35
|
```
|
|
36
36
|
|
|
@@ -2,6 +2,83 @@
|
|
|
2
2
|
|
|
3
3
|
Contributions are welcome. The repository is [matthiaskoenig/pymetadata](https://github.com/matthiaskoenig/pymetadata); development happens against the `develop` branch via pull requests.
|
|
4
4
|
|
|
5
|
+
## Branch model
|
|
6
|
+
|
|
7
|
+
Two branches are permanent:
|
|
8
|
+
|
|
9
|
+
- **`develop`** is the default branch and the branch everything is integrated
|
|
10
|
+
into. The documentation on
|
|
11
|
+
[matthiaskoenig.github.io/pymetadata](https://matthiaskoenig.github.io/pymetadata)
|
|
12
|
+
is published from it.
|
|
13
|
+
- **`main`** tracks the latest published release. It is fast-forwarded to the
|
|
14
|
+
released commit by the `sync-main` job of the `CI-CD` workflow after the
|
|
15
|
+
package went to pypi, so `main` and the newest version on pypi always agree.
|
|
16
|
+
Nothing is developed on `main` and nothing is merged into it by hand.
|
|
17
|
+
|
|
18
|
+
Work happens on short lived branches off `develop`, which GitHub deletes after
|
|
19
|
+
the merge. Releases are tagged on `develop`, see [Release](#release).
|
|
20
|
+
|
|
21
|
+
## Pull requests
|
|
22
|
+
|
|
23
|
+
Neither branch accepts a direct push, every change goes through a pull request
|
|
24
|
+
against `develop`. This includes the maintainer, there is no bypass.
|
|
25
|
+
|
|
26
|
+
A pull request can only be merged once the four required checks are green:
|
|
27
|
+
|
|
28
|
+
| check | workflow | content |
|
|
29
|
+
| ------- | ------------- | -------------------------------------------------------------------- |
|
|
30
|
+
| `tests` | `ci-cd.yml` | the test matrix, linux, macos and windows with python 3.11 to 3.14 |
|
|
31
|
+
| `ruff` | `ruff.yml` | `ruff check` and `ruff format --check` |
|
|
32
|
+
| `ty` | `ty.yml` | `tox r -e ty` |
|
|
33
|
+
| `docs` | `docs.yml` | the zensical build including the api reference and the agent files |
|
|
34
|
+
|
|
35
|
+
`tests` aggregates the test matrix into a single job, so the name of the
|
|
36
|
+
required check stays the same when the matrix changes.
|
|
37
|
+
|
|
38
|
+
Further rules of a pull request:
|
|
39
|
+
|
|
40
|
+
- conversations have to be resolved before the merge
|
|
41
|
+
- an approval is dismissed when new commits are pushed
|
|
42
|
+
- the history stays linear, i.e., a pull request is merged with squash or
|
|
43
|
+
rebase; merge commits are disabled
|
|
44
|
+
- the maintainer is the code owner of the repository (`.github/CODEOWNERS`) and
|
|
45
|
+
is requested for review on every pull request. A pull request of a contributor
|
|
46
|
+
is therefore reviewed and merged by the maintainer, who has the only write
|
|
47
|
+
access. The rulesets themselves do not require an approval: on a personal
|
|
48
|
+
repository a ruleset cannot ask for an approval only from somebody else, and
|
|
49
|
+
requiring one would block the pull requests of the maintainer, who cannot
|
|
50
|
+
approve their own. Once a second person has write access, a ruleset requiring
|
|
51
|
+
an approving review of a code owner can be added
|
|
52
|
+
|
|
53
|
+
[Auto-merge](https://docs.github.com/pull-requests/collaborating-with-pull-requests/incorporating-changes-from-a-pull-request/automatically-merging-a-pull-request)
|
|
54
|
+
is enabled for the repository, so a pull request can be queued and is merged as
|
|
55
|
+
soon as the checks pass and the required approval is there.
|
|
56
|
+
|
|
57
|
+
### Repository policies { #repository-policies }
|
|
58
|
+
|
|
59
|
+
The protection is implemented with
|
|
60
|
+
[repository rulesets](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/about-rulesets).
|
|
61
|
+
They are part of the repository in `.github/rulesets/` instead of only living in
|
|
62
|
+
the web interface, so a change to a policy is reviewed like any other change:
|
|
63
|
+
|
|
64
|
+
| ruleset | applies to | rules |
|
|
65
|
+
| ----------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
66
|
+
| `develop.json` | `develop` | pull request required, the four checks above, resolved conversations, linear history, no force push, no deletion. **No bypass, for anybody.** |
|
|
67
|
+
| `main.json` | `main` | linear history, no force push, no deletion, no bypass. The fast-forward of the release workflow needs none, only a force push or a merge commit would be rejected |
|
|
68
|
+
| `tags.json` | all tags | a tag cannot be deleted or moved, so a release tag keeps pointing at what was released |
|
|
69
|
+
|
|
70
|
+
Changing a policy means changing the json and applying it:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
.github/rulesets/apply.sh
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The script is idempotent: it updates the rulesets which exist and creates the
|
|
77
|
+
missing ones. It also sets the merge settings of the repository, i.e.,
|
|
78
|
+
auto-merge, delete branch on merge, and squash and rebase as the only merge
|
|
79
|
+
methods. It needs the [github cli](https://cli.github.com) authenticated as a
|
|
80
|
+
user with admin permission on the repository.
|
|
81
|
+
|
|
5
82
|
## Setup development environment
|
|
6
83
|
|
|
7
84
|
Development needs [uv](https://docs.astral.sh/uv/) and a checkout of the repository:
|
|
@@ -138,19 +215,36 @@ Run `ruff format` afterwards, since the rendered modules are not formatted.
|
|
|
138
215
|
|
|
139
216
|
## Release
|
|
140
217
|
|
|
141
|
-
A release is made from `develop
|
|
218
|
+
A release is made from `develop`. Since `develop` only accepts pull requests,
|
|
219
|
+
the release is prepared on a branch and tagged once that pull request is merged:
|
|
220
|
+
|
|
221
|
+
1. branch off `develop`: `git switch -c release/x.y.z develop`
|
|
222
|
+
2. update the ontology modules, see [Regenerating the ontologies](#regenerating-the-ontologies), and commit the changes
|
|
223
|
+
3. write the release notes for the version in `release-notes/x.y.z.md`
|
|
224
|
+
4. make sure everything passes: `tox run-parallel`, `ruff check`, `tox r -e ty`
|
|
225
|
+
5. check the version bump: `uvx bump-my-version bump [major|minor|patch] --dry-run -vv`
|
|
226
|
+
6. bump the version: `uvx bump-my-version bump [major|minor|patch]`, which updates `src/pymetadata/__init__.py` and `CITATION.cff` and commits. It does not create the tag; a squash or rebase merge would rewrite the commit and leave the tag behind on a commit which is not part of `develop`
|
|
227
|
+
7. push the branch, open the pull request against `develop` and merge it once the checks are green
|
|
228
|
+
8. tag the merged commit on `develop` and push the tag:
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
git switch develop
|
|
232
|
+
git pull
|
|
233
|
+
git tag x.y.z
|
|
234
|
+
git push origin x.y.z
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
This starts the `CI-CD` workflow, which runs the test matrix, publishes to
|
|
238
|
+
[pypi](https://pypi.org/project/pymetadata/), creates the GitHub release
|
|
239
|
+
from `release-notes/x.y.z.md` and fast-forwards `main` to the tagged commit.
|
|
240
|
+
Check the version before pushing, a tag cannot be moved or deleted
|
|
241
|
+
afterwards.
|
|
142
242
|
|
|
143
|
-
|
|
144
|
-
2. write the release notes for the version in `release-notes/`
|
|
145
|
-
3. make sure everything passes: `tox run-parallel`, `ruff check`, `tox r -e ty`
|
|
146
|
-
4. check the version bump: `uvx bump-my-version bump [major|minor|patch] --dry-run -vv`
|
|
147
|
-
5. bump the version: `uvx bump-my-version bump [major|minor|patch]`, which updates `src/pymetadata/__init__.py` and `CITATION.cff`, commits and tags
|
|
148
|
-
6. `git push --tags`, which triggers the release workflow publishing to [pypi](https://pypi.org/project/pymetadata/), followed by `git push`
|
|
149
|
-
7. test the installation from pypi in a fresh environment:
|
|
243
|
+
9. test the installation from pypi in a fresh environment:
|
|
150
244
|
|
|
151
245
|
```bash
|
|
152
246
|
uv venv --python 3.14
|
|
153
247
|
uv pip install pymetadata
|
|
154
248
|
```
|
|
155
249
|
|
|
156
|
-
|
|
250
|
+
10. once Zenodo has archived the release, update the citation information, i.e., `date-released` in `CITATION.cff` and the version, date and version DOI of the release in the citation of `README.md` and `docs/index.md`. `bump-my-version` only updates the version, not the date and the DOI, which are only known after the release. These changes go in through a pull request like everything else
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|

|
|
2
2
|
|
|
3
3
|
# pymetadata: python utilities for metadata and COMBINE archives
|
|
4
|
-
[](https://github.com/matthiaskoenig/pymetadata/actions/workflows/ci-cd.yml) [](https://matthiaskoenig.github.io/pymetadata) [](https://pypi.org/project/pymetadata/) [](https://pypi.org/project/pymetadata/) [](https://opensource.org/licenses/MIT) [](https://doi.org/10.5281/zenodo.5308801)
|
|
5
5
|
|
|
6
6
|
`pymetadata` is a collection of python utilities for working with metadata in the context of [COMBINE](https://co.mbine.org/) standards. The source code is available from [https://github.com/matthiaskoenig/pymetadata](https://github.com/matthiaskoenig/pymetadata).
|
|
7
7
|
|
|
@@ -70,18 +70,18 @@ If you have any questions or issues please [open an issue](https://github.com/ma
|
|
|
70
70
|
|
|
71
71
|
If you use `pymetadata` please cite the archived software on [Zenodo](https://doi.org/10.5281/zenodo.5308801):
|
|
72
72
|
|
|
73
|
-
> König, M. (2026). *pymetadata are python utilities for working with metadata* (Version 0.
|
|
73
|
+
> König, M. (2026). *pymetadata are python utilities for working with metadata* (Version 0.6.0) [Computer software]. Zenodo. https://doi.org/10.5281/zenodo.22639628
|
|
74
74
|
|
|
75
75
|
```bibtex
|
|
76
76
|
@software{konig_pymetadata,
|
|
77
77
|
author = {König, Matthias},
|
|
78
78
|
title = {pymetadata are python utilities for working with metadata},
|
|
79
79
|
year = {2026},
|
|
80
|
-
month =
|
|
81
|
-
version = {0.
|
|
80
|
+
month = sep,
|
|
81
|
+
version = {0.6.0},
|
|
82
82
|
publisher = {Zenodo},
|
|
83
|
-
doi = {10.5281/zenodo.
|
|
84
|
-
url = {https://doi.org/10.5281/zenodo.
|
|
83
|
+
doi = {10.5281/zenodo.22639628},
|
|
84
|
+
url = {https://doi.org/10.5281/zenodo.22639628},
|
|
85
85
|
}
|
|
86
86
|
```
|
|
87
87
|
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Release notes for pymetadata 0.6.1
|
|
2
|
+

|
|
3
|
+
|
|
4
|
+
We are pleased to release the next version of pymetadata including the
|
|
5
|
+
following changes:
|
|
6
|
+
|
|
7
|
+
## Fixes
|
|
8
|
+
- `RDFAnnotationData` did not carry the `provider` of its annotation, so `to_dict` (and `resource_normalized`) raised an `AttributeError` for every resolved annotation
|
|
9
|
+
- ontology terms imported from other ontologies, e.g., `PBPKO.COB_0000013` (molecule), could not be validated, pickled or deep-copied, because the lookup required the prefix of the ontology (`ValueError: COB_0000013 is not a PBPKO id.`)
|
|
10
|
+
|
|
11
|
+
Your pymetadata team
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Release notes for pymetadata 0.6.2
|
|
2
|
+

|
|
3
|
+
|
|
4
|
+
We are pleased to release the next version of pymetadata including the
|
|
5
|
+
following changes:
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
- `EntryFormat.ANTIMONY` for Antimony model files in COMBINE archives (`text/plain`)
|
|
9
|
+
|
|
10
|
+
## Development
|
|
11
|
+
- every change goes into `develop` through a pull request; the tests, `ruff`, `ty` and the documentation build have to pass before a merge is possible
|
|
12
|
+
- `main` tracks the latest published release and is fast-forwarded to the released commit by the release workflow
|
|
13
|
+
- the workflows also run on pull requests, so contributions from forks are tested
|
|
14
|
+
- the branch protection is part of the repository as rulesets in `.github/rulesets/`, together with `CODEOWNERS` and a pull request template
|
|
15
|
+
- the branch model, the pull request rules and the adjusted release process are documented in `docs/development.md`
|
|
16
|
+
- the mkdocstrings options in `zensical.toml` use the plugin table directly, as required by zensical 0.0.60
|
|
17
|
+
|
|
18
|
+
## Fixes
|
|
19
|
+
- `RDFAnnotation` raises a `ValueError` for a qualifier which is not a `BQB` or `BQM`, instead of only for a missing one, so an invalid qualifier fails where it is passed
|
|
20
|
+
|
|
21
|
+
Your pymetadata team
|