From ea2d487abb7ddbce24bd09640ac370d8cd2ec9cb Mon Sep 17 00:00:00 2001 From: Nazim Azeli Date: Tue, 10 Sep 2024 14:11:09 -0400 Subject: [PATCH] Fixing typedef schema, adding test for softwareVersion and adding content type parsing for codeRepository --- tests/processes/test_wps_package.py | 32 +++++++++++++++++++++++------ weaver/processes/wps_package.py | 21 +++++++++++++++---- weaver/typedefs.py | 3 ++- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/tests/processes/test_wps_package.py b/tests/processes/test_wps_package.py index d09d5b665..879bc4c9e 100644 --- a/tests/processes/test_wps_package.py +++ b/tests/processes/test_wps_package.py @@ -678,11 +678,13 @@ def test_format_extension_validator_basic(data_input, mode, expect): "s:author": [ {"class": "s:Person", "s:name": "John Doe", "s:affiliation": "Example Inc."} ], - }, "wps_package_metadata": {} }, { + "abstract": "", + "title": "", + "version": "", "metadata": [ { "role": "author", @@ -704,8 +706,12 @@ def test_format_extension_validator_basic(data_input, mode, expect): "wps_package_metadata": {} }, { + "abstract": "", + "title": "", + "version": "", "metadata": [ { + "type": "text/html", "rel": "codeRepository", "href": "https://gitlab.com/" } @@ -717,11 +723,11 @@ def test_format_extension_validator_basic(data_input, mode, expect): { "cwl_package_package": { "s:version": "1.0" - }, "wps_package_metadata": { "metadata": [ { + "type": "text/html", "rel": "codeRepository", "href": "https://gitlab.com/" } @@ -729,16 +735,32 @@ def test_format_extension_validator_basic(data_input, mode, expect): } }, { + "abstract": "", + "title": "", "metadata": [ { + "type": "text/html", "rel": "codeRepository", "href": "https://gitlab.com/" }, - ], "version": "1.0" } ), + ( + # Test softwareVersion + { + "cwl_package_package": { + "s:softwareVersion": "1.0.0" + }, + "wps_package_metadata": {} + }, + { + "abstract": "", + "title": "", + "version": "1.0.0" + } + ), ]) def test_process_metadata(original, expected): # type: (CWL, CWL) -> None @@ -746,6 +768,4 @@ def test_process_metadata(original, expected): wps_package_metadata = original["wps_package_metadata"] _update_package_metadata(wps_package_metadata, cwl_package_package) # Assertions - for key in expected: - assert key in wps_package_metadata - assert sorted(wps_package_metadata[key]) == sorted(expected[key]) + assert wps_package_metadata == expected diff --git a/weaver/processes/wps_package.py b/weaver/processes/wps_package.py index 112840d04..8e4598def 100644 --- a/weaver/processes/wps_package.py +++ b/weaver/processes/wps_package.py @@ -719,17 +719,30 @@ def _update_package_metadata(wps_package_metadata, cwl_package_package): ) # specific use case with a different mapping - if "s:version" in cwl_package_package: + # https://docs.ogc.org/bp/20-089r1.html#toc31 + if "s:version" in cwl_package_package or "s:softwareVersion" in cwl_package_package: wps_package_metadata["version"] = str( - str(cwl_package_package.get("s:version", "")) or str(wps_package_metadata.get("version")) + str(wps_package_metadata.get("version", "")) + or cwl_package_package.get("s:version") + or cwl_package_package.get("s:softwareVersion") ) + else: + wps_package_metadata["version"] = str(wps_package_metadata.get("version", "")) for metadata_mapping in SUPPORTED_METADATA_MAPPING: if metadata_mapping in cwl_package_package: metadata = wps_package_metadata.get("metadata", []) - if (isinstance((cwl_package_package[metadata_mapping]), str) - and urlparse(cwl_package_package[metadata_mapping]) != ""): + if ( + isinstance((cwl_package_package[metadata_mapping]), str) + and urlparse(cwl_package_package[metadata_mapping]).scheme != "" + ): + url = cwl_package_package[metadata_mapping] + if metadata_mapping == "s:codeRepository": + type = "text/html" + else: + type = get_content_type(os.path.splitext(url)[-1], default=ContentType.TEXT_PLAIN) metadata.append({ + "type": type, "rel": metadata_mapping.strip("s:"), "href": cwl_package_package[metadata_mapping] }) diff --git a/weaver/typedefs.py b/weaver/typedefs.py index b90aadd48..00203d778 100644 --- a/weaver/typedefs.py +++ b/weaver/typedefs.py @@ -221,13 +221,14 @@ class CWL_SchemaName(Protocol): "$schemas": NotRequired[Dict[str, str]], "$graph": NotRequired[CWL_Graph], "s:author": NotRequired[List[Dict[str, JSON]]], - "s:citation": NotRequired[List[Dict[str, str]]], + "s:citation": NotRequired[List[Union[str, JSON]]], "s:codeRepository": NotRequired[Link], "s:contributor": NotRequired[List[Dict[str, JSON]]], "s:dateCreated": NotRequired[datetime], "s:license": NotRequired[Optional[Union[Dict[str, JSON], Link]]], "s:releaseNotes": NotRequired[Optional[Union[str, Link]]], "s:version": NotRequired[Optional[Union[str, Number]]], + "s:softwareVersion": NotRequired[Optional[Union[str, Number]]], }, total=False) CWL_WorkflowStepPackage = TypedDict("CWL_WorkflowStepPackage", { "id": str, # reference ID of the package