diff --git a/lib/galaxy/tool_util/deps/requirements.py b/lib/galaxy/tool_util/deps/requirements.py index 351190bf67b..79669bc9941 100644 --- a/lib/galaxy/tool_util/deps/requirements.py +++ b/lib/galaxy/tool_util/deps/requirements.py @@ -1,4 +1,5 @@ import copy +import os from typing import ( Any, Callable, @@ -186,8 +187,14 @@ class ContainerDescription: resolve_dependencies: bool = DEFAULT_CONTAINER_RESOLVE_DEPENDENCIES, shell: str = DEFAULT_CONTAINER_SHELL, ) -> None: - # Force to lowercase because container image names must be lowercase - self.identifier = identifier.lower() if identifier else None + # Force to lowercase because container image names must be lowercase. + # Cached singularity images include the path on disk, so only lowercase + # the image identifier portion. + self.identifier = None + if identifier: + parts = identifier.rsplit(os.sep, 1) + parts[-1] = parts[-1].lower() + self.identifier = os.sep.join(parts) self.type = type self.resolve_dependencies = resolve_dependencies self.shell = shell diff --git a/test/unit/tool_util/test_container_description.py b/test/unit/tool_util/test_container_description.py new file mode 100644 index 00000000000..9251069818d --- /dev/null +++ b/test/unit/tool_util/test_container_description.py @@ -0,0 +1,24 @@ +import pytest + +from galaxy.tool_util.deps.requirements import ContainerDescription + + +@pytest.mark.parametrize( + "identifier,expected_identifier", + [ + ("mulled-abc", "mulled-abc"), + ("docker://mulled-abc", "docker://mulled-abc"), + ("/Cache/mulled-abc", "/Cache/mulled-abc"), + ("/Cache/mUlled-abc", "/Cache/mulled-abc"), + ("", None), + (None, None), + ], +) +def test_container_description(identifier, expected_identifier): + assert ContainerDescription(identifier=identifier).identifier == expected_identifier + + +def test_to_from_dict(): + container_description_dict = ContainerDescription("mulled-abc").to_dict() + container_description = ContainerDescription.from_dict(container_description_dict) + assert container_description_dict == container_description.to_dict()