From 033b58d4dd8260c95a642633be70385aa058608a Mon Sep 17 00:00:00 2001 From: Vuillaume <thomas.vuillaume@lapp.in2p3.fr> Date: Fri, 1 Apr 2022 16:23:13 +0000 Subject: [PATCH] Add script to update eossr codemeta and run it --- codemeta.json | 6 ++-- eossr/metadata/codemeta.py | 8 +++++ eossr/metadata/tests/test_codemeta.py | 11 ++++++ eossr/scripts/update_codemeta_eossr.py | 49 ++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 eossr/scripts/update_codemeta_eossr.py diff --git a/codemeta.json b/codemeta.json index 663e5e48..976e85fe 100644 --- a/codemeta.json +++ b/codemeta.json @@ -2,7 +2,7 @@ "@context": "https://doi.org/10.5063/schema/codemeta-2.0", "@type": "SoftwareSourceCode", "name": "eossr", - "description": "<p><img alt=\"eOSSR\" src=\"docs/images/eossr_logo.png\" /></p><h2>The ESCAPE OSSR library</h2><p>The eOSSR Python library gathers all the developments made for the OSSR. In particular, it includes:- an API to programmatically access the OSSR, retrieve records and publish content- functions to map and crosswalk metadata between the CodeMeta schema adopted for the OSSR and Zenodo internal schema- functions to help developers automatically contribute to the OSSR, in particular using their continuous integration (see also code snippets)</p><p>Code: <a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr\">https://gitlab.in2p3.fr/escape2020/wp3/eossr</a> <br />Documentation: <a href=\"https://escape2020.pages.in2p3.fr/wp3/eossr/\">https://escape2020.pages.in2p3.fr/wp3/eossr/</a></p><p><a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/commits/master\"><img alt=\"pipeline status\" src=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/badges/master/pipeline.svg\" /></a><a href=\"https://opensource.org/licenses/MIT\"><img alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-blue.svg\" /></a><a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/commits/master\"><img alt=\"coverage report\" src=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/badges/master/coverage.svg\" /></a><a href=\"https://doi.org/10.5281/zenodo.5524912\"><img alt=\"DOI\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.5524912.svg\" /></a><a href=\"https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.in2p3.fr%2Fescape2020%2Fwp3%2Feossr/HEAD\"><img alt=\"Binder\" src=\"https://mybinder.org/badge_logo.svg\" /></a></p><h2>Stable versions</h2><ul><li>v0.3.3: <a href=\"https://doi.org/10.5281/zenodo.5592584\"><img alt=\"DOI\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.5592584.svg\" /></a></li><li>v0.2 : <a href=\"https://doi.org/10.5281/zenodo.5524913\"><img alt=\"DOI\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.5524913.svg\" /></a></li></ul><h2>Install</h2><p>Commands to be run in your terminal.</p><h3>For users</h3><pre><code>pip install eossr</code></pre><p>You can also run it with docker:</p><pre><code>docker run -it gitlab-registry.in2p3.fr/escape2020/wp3/eossr:latest</code></pre><p><a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/container_registry\">Visit our registry</a> to see the available docker containers.</p><p>Note that <code>latest</code> tag always point to the latest stable released container.</p><h3>For developers</h3><pre><code>git clone https://gitlab.in2p3.fr/escape2020/wp3/eossr.gitpip install -e eossr</code></pre><h4>Running tests</h4><p>To run tests locally, run:</p><pre><code>pip install pytestpytest eossr</code></pre><p>Some tests will be skiped if <code>SANDBOX_ZENODO_TOKEN</code> is not defined in your environment variables.If you want to run these tests, you will need to create a <a href=\"https://sandbox.zenodo.org/account/settings/applications/tokens/new/\">sandbox zenodo token</a> and add it to your env:</p><pre><code>export SANDBOX_ZENODO_TOKEN="your_sandbox_token"</code></pre><h2>Cite</h2><p>To cite this library, use the cite module in <a href=\"https://zenodo.org/record/5524913#.YWBq79kzZB0\">the Zenodo page</a>.</p>", + "description": "<p align=\"left\"><img src=\"docs/images/eossr_logo.png\" width=\"400px\" ></p><h1>The ESCAPE OSSR library</h1><p>The eOSSR Python library gathers all the developments made for the OSSR. In particular, it includes:- an API to programmatically access the OSSR, retrieve records and publish content- functions to map and crosswalk metadata between the CodeMeta schema adopted for the OSSR and Zenodo internal schema- functions to help developers automatically contribute to the OSSR, in particular using their continuous integration (see also code snippets)</p><p>Code: <a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr\">https://gitlab.in2p3.fr/escape2020/wp3/eossr</a>Documentation: <a href=\"https://escape2020.pages.in2p3.fr/wp3/eossr/\">https://escape2020.pages.in2p3.fr/wp3/eossr/</a></p><p><a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/commits/master\"><img alt=\"\" src=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/badges/master/pipeline.svg\" /></a><a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/commits/master\"><img alt=\"\" src=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/badges/master/coverage.svg\" /></a><a href=\"https://opensource.org/licenses/MIT\"><img alt=\"\" src=\"https://img.shields.io/badge/License-MIT-blue.svg\" /></a><a href=\"https://doi.org/10.5281/zenodo.5524912\"><img alt=\"\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.5524912.svg\" /></a><a href=\"https://mybinder.org/v2/git/https%3A%2F%2Fgitlab.in2p3.fr%2Fescape2020%2Fwp3%2Feossr/HEAD\"><img alt=\"\" src=\"https://mybinder.org/badge_logo.svg\" /></a></p><h2>Former stable versions</h2><ul><li>v0.4: <a href=\"https://doi.org/10.5281/zenodo.6326454\"><img alt=\"DOI\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.6326454.svg\" /></a></li><li>v0.3.3: <a href=\"https://doi.org/10.5281/zenodo.5592584\"><img alt=\"\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.5592584.svg\" /></a></li><li>v0.2 : <a href=\"https://doi.org/10.5281/zenodo.5524913\"><img alt=\"\" src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.5524913.svg\" /></a></li></ul><h2>Install</h2><p>Commands to be run in your terminal.</p><h3>For users</h3><pre><code>pip install eossr</code></pre><p>You can also run it with docker:</p><pre><code>docker run -it gitlab-registry.in2p3.fr/escape2020/wp3/eossr:latest</code></pre><p><a href=\"https://gitlab.in2p3.fr/escape2020/wp3/eossr/container_registry\">Visit our registry</a> to see the available docker containers.</p><p>Note that <code>latest</code> tag always point to the latest stable released container.</p><h3>For developers</h3><pre><code>git clone https://gitlab.in2p3.fr/escape2020/wp3/eossr.gitpip install -e "./eossr"</code></pre><h4>Running tests</h4><p>To run tests locally, run:</p><pre><code>pip install -e "./eossr[tests]"pytest eossr</code></pre><p>Some tests will be skiped if <code>SANDBOX_ZENODO_TOKEN</code> is not defined in your environment variables.If you want to run these tests, you will need to create a <a href=\"https://sandbox.zenodo.org/account/settings/applications/tokens/new/\">sandbox zenodo token</a> and add it to your env:</p><pre><code>export SANDBOX_ZENODO_TOKEN="your_sandbox_token"</code></pre><h2>License</h2><p>See <a href=\"LICENSE\">LICENSE</a></p><h2>Cite</h2><p>To cite this library, use the cite section in <a href=\"https://zenodo.org/record/5592584#.YiALJRPMI-Q\">the Zenodo page</a> (rightcolumn, below the <code>Versions</code> section).</p>", "license": "https://spdx.org/licenses/MIT", "version": "0.5", "softwareVersion": "0.5", @@ -43,11 +43,11 @@ "zenodo" ], "runtimePlatform": "Python 3", - "downloadUrl": "https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/archive/v0.4/eossr-v0.4.zip", + "downloadUrl": "https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/archive/v0.5/eossr-v0.5.zip", "releaseNotes": "eossr v0.5. Full changelog: https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/releases/v0.5", "dateCreated": "2021-08-31", "datePublished": "2022-03-14", - "dateModified": "2022-03-11", + "dateModified": "2022-03-14", "operatingSystem": "", "maintainer": { "@type": "Person", diff --git a/eossr/metadata/codemeta.py b/eossr/metadata/codemeta.py index 1e6ddf60..5e76762a 100644 --- a/eossr/metadata/codemeta.py +++ b/eossr/metadata/codemeta.py @@ -1,4 +1,5 @@ import json +from pathlib import Path from warnings import warn import pandas as pd @@ -74,3 +75,10 @@ class Codemeta: def validate(self): for error in self.error_generator(): raise error + + def write(self, path='codemeta.json', overwrite=False): + if Path(path).exists() and not overwrite: + raise FileExistsError(f"File {path} exists. Use overwrite=True to overwrite") + else: + with open(path, 'w') as f: + json.dump(self.metadata, f, indent=4) diff --git a/eossr/metadata/tests/test_codemeta.py b/eossr/metadata/tests/test_codemeta.py index 7dba17cf..78b0f64c 100644 --- a/eossr/metadata/tests/test_codemeta.py +++ b/eossr/metadata/tests/test_codemeta.py @@ -1,3 +1,4 @@ +import tempfile from os import path from pathlib import Path @@ -35,3 +36,13 @@ def test_read_codemeta_crosswalk(): cw = codemeta.codemeta_crosswalk() assert set(cw['OSSR Requirement Level'].values) == {'required', 'recommended', nan} + + +def test_codemeta_write(): + metadata = {'name': 'Rick', 'version': 'v10'} + codemeta_handler = codemeta.Codemeta(metadata) + with tempfile.TemporaryDirectory() as tmpdirname: + filename = Path(tmpdirname, 'codemeta.json') + codemeta_handler.write(filename) + new_codemeta = codemeta.Codemeta.from_file(filename) + assert new_codemeta.metadata == metadata diff --git a/eossr/scripts/update_codemeta_eossr.py b/eossr/scripts/update_codemeta_eossr.py new file mode 100644 index 00000000..124d4572 --- /dev/null +++ b/eossr/scripts/update_codemeta_eossr.py @@ -0,0 +1,49 @@ +import argparse +from pathlib import Path + +from eossr import ROOT_DIR +from eossr import __version__ as eossr_version +from eossr.metadata import codemeta +from eossr.utils import update_codemeta + + +def build_argparser(): + """ + Construct main argument parser for the ``codemet2zenodo`` script + + :return: + argparser: `argparse.ArgumentParser` + """ + parser = argparse.ArgumentParser(description="Update Codemeta") + + parser.add_argument( + '--codemeta_path', + '-c', + type=str, + dest='codemeta_path', + help='Path to codemeta.json', + default=Path(ROOT_DIR).joinpath('codemeta.json'), + required=False, + ) + return parser + + +def update_version(codemeta_path): + codemeta_handler = codemeta.Codemeta.from_file(codemeta_path) + metadata = codemeta_handler.metadata + + metadata[ + 'downloadUrl' + ] = f'https://gitlab.in2p3.fr/escape2020/wp3/eossr/-/archive/v{eossr_version}/eossr-v{eossr_version}.zip' + metadata['version'] = eossr_version + metadata['softwareVersion'] = eossr_version + + codemeta_handler.write(path=codemeta_path, overwrite=True) + + +if __name__ == '__main__': + + parser = build_argparser() + args = parser.parse_args() + html = update_codemeta(codemeta_path=args.codemeta_path) + update_version(args.codemeta_path) -- GitLab