Skip to content

Commit 1d7b5c3

Browse files
committed
2X faster startup, defer galaxy-* imports to when needed
From 1.84user 0.18system 0:02.03elapsed to 0.71user 0.11system 0:00.83elapsed
1 parent 380143e commit 1d7b5c3

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

cwltool/builder.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
from .errors import WorkflowException
2424
from .loghandler import _logger
2525
from .mutation import MutationManager
26-
from .software_requirements import DependenciesConfiguration
2726
from .stdfsaccess import StdFsAccess
2827
from .utils import (
2928
CONTENT_LIMIT,
@@ -42,6 +41,7 @@
4241
ProvenanceProfile, # pylint: disable=unused-import
4342
)
4443
from .pathmapper import PathMapper
44+
from .software_requirements import DependenciesConfiguration
4545

4646
INPUT_OBJ_VOCAB: dict[str, str] = {
4747
"Any": "https://w3id.org/cwl/salad#Any",
@@ -106,7 +106,7 @@ def __init__(
106106
formatgraph: Optional[Graph],
107107
make_fs_access: type[StdFsAccess],
108108
fs_access: StdFsAccess,
109-
job_script_provider: Optional[DependenciesConfiguration],
109+
job_script_provider: Optional["DependenciesConfiguration"],
110110
timeout: float,
111111
debug: bool,
112112
js_console: bool,

cwltool/main.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,6 @@
8484
from .procgenerator import ProcessGenerator
8585
from .resolver import ga4gh_tool_registries, tool_resolver
8686
from .secrets import SecretStore
87-
from .software_requirements import (
88-
DependenciesConfiguration,
89-
get_container_from_software_requirements,
90-
)
9187
from .stdfsaccess import StdFsAccess
9288
from .subgraph import get_process, get_step, get_subgraph
9389
from .update import ALLUPDATES, UPDATES
@@ -1301,6 +1297,8 @@ def main(
13011297
use_conda_dependencies = getattr(args, "beta_conda_dependencies", None) # str
13021298

13031299
if conf_file or use_conda_dependencies:
1300+
from .software_requirements import DependenciesConfiguration
1301+
13041302
runtimeContext.job_script_provider = DependenciesConfiguration(args)
13051303
else:
13061304
runtimeContext.find_default_container = functools.partial(
@@ -1438,6 +1436,8 @@ def find_default_container(
14381436
) -> Optional[str]:
14391437
"""Find a container."""
14401438
if not default_container and use_biocontainers:
1439+
from .software_requirements import get_container_from_software_requirements
1440+
14411441
default_container = get_container_from_software_requirements(
14421442
use_biocontainers, builder, container_image_cache_path
14431443
)

cwltool/software_requirements.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"""
99

1010
import argparse
11+
import importlib.metadata
1112
import os
1213
import string
1314
from collections.abc import MutableMapping, MutableSequence
@@ -16,18 +17,15 @@
1617
from .utils import HasReqsHints
1718

1819
if TYPE_CHECKING:
20+
from galaxy.tool_util.deps.requirements import ToolRequirements
21+
1922
from .builder import Builder
2023

2124
try:
22-
from galaxy.tool_util import deps
23-
from galaxy.tool_util.deps.requirements import ToolRequirement, ToolRequirements
24-
except ImportError:
25-
ToolRequirement = None # type: ignore
26-
ToolRequirements = None # type: ignore
27-
deps = None # type: ignore
28-
29-
30-
SOFTWARE_REQUIREMENTS_ENABLED = deps is not None
25+
importlib.metadata.Distribution.from_name("galaxy-tool-util")
26+
SOFTWARE_REQUIREMENTS_ENABLED = True
27+
except ModuleNotFoundError:
28+
SOFTWARE_REQUIREMENTS_ENABLED = False
3129

3230
COMMAND_WITH_DEPENDENCIES_TEMPLATE = string.Template(
3331
"""#!/bin/bash
@@ -74,6 +72,8 @@ def __init__(self, args: argparse.Namespace) -> None:
7472

7573
def build_job_script(self, builder: "Builder", command: list[str]) -> str:
7674
"""Use the galaxy-tool-util library to construct a build script."""
75+
from galaxy.tool_util import deps
76+
7777
ensure_galaxy_lib_available()
7878
resolution_config_dict = {
7979
"use": self.use_tool_dependencies,
@@ -102,8 +102,12 @@ def build_job_script(self, builder: "Builder", command: list[str]) -> str:
102102
return job_script
103103

104104

105-
def get_dependencies(builder: HasReqsHints) -> ToolRequirements:
105+
def get_dependencies(
106+
builder: HasReqsHints,
107+
) -> "ToolRequirements":
106108
(software_requirement, _) = builder.get_requirement("SoftwareRequirement")
109+
from galaxy.tool_util.deps.requirements import ToolRequirement, ToolRequirements
110+
107111
dependencies: list[Union["ToolRequirement", dict[str, Any]]] = []
108112
if software_requirement and software_requirement.get("packages"):
109113
packages = cast(

0 commit comments

Comments
 (0)