diff --git a/cwltool/builder.py b/cwltool/builder.py index e1de5b857..6b933c03a 100644 --- a/cwltool/builder.py +++ b/cwltool/builder.py @@ -23,7 +23,6 @@ from .errors import WorkflowException from .loghandler import _logger from .mutation import MutationManager -from .software_requirements import DependenciesConfiguration from .stdfsaccess import StdFsAccess from .utils import ( CONTENT_LIMIT, @@ -42,6 +41,7 @@ ProvenanceProfile, # pylint: disable=unused-import ) from .pathmapper import PathMapper + from .software_requirements import DependenciesConfiguration INPUT_OBJ_VOCAB: dict[str, str] = { "Any": "https://w3id.org/cwl/salad#Any", @@ -106,7 +106,7 @@ def __init__( formatgraph: Optional[Graph], make_fs_access: type[StdFsAccess], fs_access: StdFsAccess, - job_script_provider: Optional[DependenciesConfiguration], + job_script_provider: Optional["DependenciesConfiguration"], timeout: float, debug: bool, js_console: bool, diff --git a/cwltool/main.py b/cwltool/main.py index f68d05052..41a5b03f6 100755 --- a/cwltool/main.py +++ b/cwltool/main.py @@ -84,10 +84,6 @@ from .procgenerator import ProcessGenerator from .resolver import ga4gh_tool_registries, tool_resolver from .secrets import SecretStore -from .software_requirements import ( - DependenciesConfiguration, - get_container_from_software_requirements, -) from .stdfsaccess import StdFsAccess from .subgraph import get_process, get_step, get_subgraph from .update import ALLUPDATES, UPDATES @@ -1301,6 +1297,8 @@ def main( use_conda_dependencies = getattr(args, "beta_conda_dependencies", None) # str if conf_file or use_conda_dependencies: + from .software_requirements import DependenciesConfiguration + runtimeContext.job_script_provider = DependenciesConfiguration(args) else: runtimeContext.find_default_container = functools.partial( @@ -1438,6 +1436,8 @@ def find_default_container( ) -> Optional[str]: """Find a container.""" if not default_container and use_biocontainers: + from .software_requirements import get_container_from_software_requirements + default_container = get_container_from_software_requirements( use_biocontainers, builder, container_image_cache_path ) diff --git a/cwltool/software_requirements.py b/cwltool/software_requirements.py index 3d4d48f6b..f66ad353c 100644 --- a/cwltool/software_requirements.py +++ b/cwltool/software_requirements.py @@ -8,6 +8,7 @@ """ import argparse +import importlib.metadata import os import string from collections.abc import MutableMapping, MutableSequence @@ -16,18 +17,15 @@ from .utils import HasReqsHints if TYPE_CHECKING: + from galaxy.tool_util.deps.requirements import ToolRequirements + from .builder import Builder try: - from galaxy.tool_util import deps - from galaxy.tool_util.deps.requirements import ToolRequirement, ToolRequirements -except ImportError: - ToolRequirement = None # type: ignore - ToolRequirements = None # type: ignore - deps = None # type: ignore - - -SOFTWARE_REQUIREMENTS_ENABLED = deps is not None + importlib.metadata.Distribution.from_name("galaxy-tool-util") + SOFTWARE_REQUIREMENTS_ENABLED = True +except ModuleNotFoundError: + SOFTWARE_REQUIREMENTS_ENABLED = False COMMAND_WITH_DEPENDENCIES_TEMPLATE = string.Template( """#!/bin/bash @@ -74,6 +72,8 @@ def __init__(self, args: argparse.Namespace) -> None: def build_job_script(self, builder: "Builder", command: list[str]) -> str: """Use the galaxy-tool-util library to construct a build script.""" + from galaxy.tool_util import deps + ensure_galaxy_lib_available() resolution_config_dict = { "use": self.use_tool_dependencies, @@ -102,8 +102,12 @@ def build_job_script(self, builder: "Builder", command: list[str]) -> str: return job_script -def get_dependencies(builder: HasReqsHints) -> ToolRequirements: +def get_dependencies( + builder: HasReqsHints, +) -> "ToolRequirements": (software_requirement, _) = builder.get_requirement("SoftwareRequirement") + from galaxy.tool_util.deps.requirements import ToolRequirement, ToolRequirements + dependencies: list[Union["ToolRequirement", dict[str, Any]]] = [] if software_requirement and software_requirement.get("packages"): packages = cast(