From ef5ee033f3b55d5021f8b9e530d5fb0f1df117a8 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Thu, 27 Feb 2025 12:18:48 -0500 Subject: [PATCH 1/3] Fix #19515 - invalid citation handling changed with 24.2. --- lib/galaxy/tool_util/parser/xml.py | 8 +++++++- test/unit/tool_util/invalid_citation.xml | 17 +++++++++++++++++ test/unit/tool_util/invalid_citation_24.2.xml | 17 +++++++++++++++++ test/unit/tool_util/test_parsing.py | 18 ++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/unit/tool_util/invalid_citation.xml create mode 100644 test/unit/tool_util/invalid_citation_24.2.xml diff --git a/lib/galaxy/tool_util/parser/xml.py b/lib/galaxy/tool_util/parser/xml.py index aba5a687424..2d18724f1bd 100644 --- a/lib/galaxy/tool_util/parser/xml.py +++ b/lib/galaxy/tool_util/parser/xml.py @@ -708,7 +708,13 @@ class XmlToolSource(ToolSource): return citations for citation_elem in citations_elem: - citation = parse_citation_elem(citation_elem) + try: + citation = parse_citation_elem(citation_elem) + except Exception: + if Version(self.parse_profile()) < Version("24.2"): + continue + else: + raise if citation: citations.append(citation) diff --git a/test/unit/tool_util/invalid_citation.xml b/test/unit/tool_util/invalid_citation.xml new file mode 100644 index 00000000000..684209fb3b8 --- /dev/null +++ b/test/unit/tool_util/invalid_citation.xml @@ -0,0 +1,17 @@ + + + cat $input1 > $out_file1 + + + + + + + + + + Ronald A. Fisher in the 1930s + + + + diff --git a/test/unit/tool_util/invalid_citation_24.2.xml b/test/unit/tool_util/invalid_citation_24.2.xml new file mode 100644 index 00000000000..9971329a90b --- /dev/null +++ b/test/unit/tool_util/invalid_citation_24.2.xml @@ -0,0 +1,17 @@ + + + cat $input1 > $out_file1 + + + + + + + + + + Ronald A. Fisher in the 1930s + + + + diff --git a/test/unit/tool_util/test_parsing.py b/test/unit/tool_util/test_parsing.py index 21ec9238769..65af9ce4da0 100644 --- a/test/unit/tool_util/test_parsing.py +++ b/test/unit/tool_util/test_parsing.py @@ -20,6 +20,7 @@ from galaxy.tool_util.parser.output_models import ( ) from galaxy.tool_util.unittest_utils import functional_test_tool_path from galaxy.util import galaxy_directory +from galaxy.util.resources import resource_path from galaxy.util.unittest import TestCase TOOL_XML_1 = """ @@ -948,6 +949,23 @@ class TestCollectionCatGroupTag(FunctionalTestToolTestCase): assert output_dataset_model.metadata_source == "input1" +def test_old_invalid_citation_dont_cause_failure_to_load(): + tool_path = resource_path(__name__, "invalid_citation.xml") + tool_source = get_tool_source(tool_path) + assert tool_source.parse_citations() == [] + + +def test_invalid_citation_not_allowed_in_modern_tools(): + tool_path = resource_path(__name__, "invalid_citation_24.2.xml") + tool_source = get_tool_source(tool_path) + exc = None + try: + tool_source.parse_citations() + except Exception as e: + exc = e + assert exc is not None + + class TestToolProvidedMetadata2(FunctionalTestToolTestCase): test_path = "tool_provided_metadata_2.xml" From 18feca9589f5e09bdd7f9463de849cc7b3444c7e Mon Sep 17 00:00:00 2001 From: Nicola Soranzo Date: Wed, 26 Mar 2025 15:14:42 +0000 Subject: [PATCH 2/3] Add support for ``PathLike`` in ``ToolLocationFetcher.to_tool_path()`` --- lib/galaxy/tool_util/fetcher.py | 6 ++++-- lib/galaxy/tool_util/parser/factory.py | 3 +-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/galaxy/tool_util/fetcher.py b/lib/galaxy/tool_util/fetcher.py index 3c9bedaaaf9..9e5ed42aeba 100644 --- a/lib/galaxy/tool_util/fetcher.py +++ b/lib/galaxy/tool_util/fetcher.py @@ -1,3 +1,4 @@ +import os from typing import ( Dict, Type, @@ -8,6 +9,7 @@ from galaxy.util import plugin_config if TYPE_CHECKING: from galaxy.tool_util.locations import ToolLocationResolver + from galaxy.util.path import StrPath class ToolLocationFetcher: @@ -19,8 +21,8 @@ class ToolLocationFetcher: return plugin_config.plugins_dict(galaxy.tool_util.locations, "scheme") - def to_tool_path(self, path_or_uri_like: str, **kwds) -> str: - if "://" not in path_or_uri_like: + def to_tool_path(self, path_or_uri_like: "StrPath", **kwds) -> "StrPath": + if isinstance(path_or_uri_like, os.PathLike) or "://" not in path_or_uri_like: path = path_or_uri_like else: uri_like = path_or_uri_like diff --git a/lib/galaxy/tool_util/parser/factory.py b/lib/galaxy/tool_util/parser/factory.py index ce403638f7f..5c9e46a3100 100644 --- a/lib/galaxy/tool_util/parser/factory.py +++ b/lib/galaxy/tool_util/parser/factory.py @@ -86,9 +86,8 @@ def get_tool_source( tool_location_fetcher = ToolLocationFetcher() assert config_file - config_file = str(config_file) - config_file = tool_location_fetcher.to_tool_path(config_file) + config_file = str(tool_location_fetcher.to_tool_path(config_file)) if not enable_beta_formats: tree, macro_paths = load_tool_with_refereces(config_file) return XmlToolSource(tree, source_path=config_file, macro_paths=macro_paths) From 1c8fbbb95853dd3998d05dd1c66df0d493d39812 Mon Sep 17 00:00:00 2001 From: Nicola Soranzo Date: Wed, 26 Mar 2025 15:18:23 +0000 Subject: [PATCH 3/3] Fix mypy issues ``` test/unit/tool_util/test_parsing.py:954: error: Argument 1 to "get_tool_source" has incompatible type "Traversable"; expected "str | PathLike[str] | None" [arg-type] tool_source = get_tool_source(tool_path) ^~~~~~~~~ test/unit/tool_util/test_parsing.py:960: error: Argument 1 to "get_tool_source" has incompatible type "Traversable"; expected "str | PathLike[str] | None" [arg-type] tool_source = get_tool_source(tool_path) ^~~~~~~~~ ``` --- test/unit/tool_util/test_parsing.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/unit/tool_util/test_parsing.py b/test/unit/tool_util/test_parsing.py index 65af9ce4da0..8aa46cbb356 100644 --- a/test/unit/tool_util/test_parsing.py +++ b/test/unit/tool_util/test_parsing.py @@ -20,7 +20,10 @@ from galaxy.tool_util.parser.output_models import ( ) from galaxy.tool_util.unittest_utils import functional_test_tool_path from galaxy.util import galaxy_directory -from galaxy.util.resources import resource_path +from galaxy.util.resources import ( + as_file, + resource_path, +) from galaxy.util.unittest import TestCase TOOL_XML_1 = """ @@ -950,14 +953,14 @@ class TestCollectionCatGroupTag(FunctionalTestToolTestCase): def test_old_invalid_citation_dont_cause_failure_to_load(): - tool_path = resource_path(__name__, "invalid_citation.xml") - tool_source = get_tool_source(tool_path) + with as_file(resource_path(__name__, "invalid_citation.xml")) as tool_path: + tool_source = get_tool_source(tool_path) assert tool_source.parse_citations() == [] def test_invalid_citation_not_allowed_in_modern_tools(): - tool_path = resource_path(__name__, "invalid_citation_24.2.xml") - tool_source = get_tool_source(tool_path) + with as_file(resource_path(__name__, "invalid_citation_24.2.xml")) as tool_path: + tool_source = get_tool_source(tool_path) exc = None try: tool_source.parse_citations()