comparison env/lib/python3.9/site-packages/cwltool/context.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 """Shared context objects that replace use of kwargs."""
2 import copy
3 import os
4 import tempfile
5 import threading
6 from typing import IO, Any, Callable, Dict, Iterable, List, Optional, TextIO, Union
7
8 # move to a regular typing import when Python 3.3-3.6 is no longer supported
9 from ruamel.yaml.comments import CommentedMap
10 from schema_salad.avro.schema import Names
11 from schema_salad.ref_resolver import Loader
12 from schema_salad.utils import FetcherCallableType
13 from typing_extensions import TYPE_CHECKING
14
15 from .builder import Builder, HasReqsHints
16 from .mpi import MpiConfig
17 from .mutation import MutationManager
18 from .pathmapper import PathMapper
19 from .secrets import SecretStore
20 from .software_requirements import DependenciesConfiguration
21 from .stdfsaccess import StdFsAccess
22 from .utils import DEFAULT_TMP_PREFIX, CWLObjectType, ResolverType
23
24 if TYPE_CHECKING:
25 from .process import Process
26 from .provenance import ResearchObject # pylint: disable=unused-import
27 from .provenance_profile import ProvenanceProfile
28
29
30 class ContextBase:
31 """Shared kwargs based initilizer for {Runtime,Loading}Context."""
32
33 def __init__(self, kwargs: Optional[Dict[str, Any]] = None) -> None:
34 """Initialize."""
35 if kwargs:
36 for k, v in kwargs.items():
37 if hasattr(self, k):
38 setattr(self, k, v)
39
40
41 def make_tool_notimpl(
42 toolpath_object: CommentedMap, loadingContext: "LoadingContext"
43 ) -> "Process":
44 raise NotImplementedError()
45
46
47 default_make_tool = make_tool_notimpl
48
49
50 class LoadingContext(ContextBase):
51 def __init__(self, kwargs: Optional[Dict[str, Any]] = None) -> None:
52 """Initialize the LoadingContext from the kwargs."""
53 self.debug = False # type: bool
54 self.metadata = {} # type: CWLObjectType
55 self.requirements = None # type: Optional[List[CWLObjectType]]
56 self.hints = None # type: Optional[List[CWLObjectType]]
57 self.overrides_list = [] # type: List[CWLObjectType]
58 self.loader = None # type: Optional[Loader]
59 self.avsc_names = None # type: Optional[Names]
60 self.disable_js_validation = False # type: bool
61 self.js_hint_options_file = None
62 self.do_validate = True # type: bool
63 self.enable_dev = False # type: bool
64 self.strict = True # type: bool
65 self.resolver = None # type: Optional[ResolverType]
66 self.fetcher_constructor = None # type: Optional[FetcherCallableType]
67 self.construct_tool_object = default_make_tool
68 self.research_obj = None # type: Optional[ResearchObject]
69 self.orcid = "" # type: str
70 self.cwl_full_name = "" # type: str
71 self.host_provenance = False # type: bool
72 self.user_provenance = False # type: bool
73 self.prov_obj = None # type: Optional[ProvenanceProfile]
74 self.do_update = None # type: Optional[bool]
75 self.jobdefaults = None # type: Optional[CommentedMap]
76 self.doc_cache = True # type: bool
77 self.relax_path_checks = False # type: bool
78
79 super().__init__(kwargs)
80
81 def copy(self):
82 # type: () -> LoadingContext
83 return copy.copy(self)
84
85
86 class RuntimeContext(ContextBase):
87 def __init__(self, kwargs: Optional[Dict[str, Any]] = None) -> None:
88 """Initialize the RuntimeContext from the kwargs."""
89 select_resources_callable = Callable[ # pylint: disable=unused-variable
90 [Dict[str, Union[int, float, str]], RuntimeContext],
91 Dict[str, Union[int, float, str]],
92 ]
93 self.user_space_docker_cmd = "" # type: Optional[str]
94 self.secret_store = None # type: Optional[SecretStore]
95 self.no_read_only = False # type: bool
96 self.custom_net = "" # type: Optional[str]
97 self.no_match_user = False # type: bool
98 self.preserve_environment = "" # type: Optional[Iterable[str]]
99 self.preserve_entire_environment = False # type: bool
100 self.use_container = True # type: bool
101 self.force_docker_pull = False # type: bool
102
103 self.tmp_outdir_prefix = "" # type: str
104 self.tmpdir_prefix = DEFAULT_TMP_PREFIX # type: str
105 self.tmpdir = "" # type: str
106 self.rm_tmpdir = True # type: bool
107 self.pull_image = True # type: bool
108 self.rm_container = True # type: bool
109 self.move_outputs = "move" # type: str
110
111 self.singularity = False # type: bool
112 self.disable_net = False # type: bool
113 self.debug = False # type: bool
114 self.compute_checksum = True # type: bool
115 self.name = "" # type: str
116 self.default_container = "" # type: Optional[str]
117 self.find_default_container = (
118 None
119 ) # type: Optional[Callable[[HasReqsHints], Optional[str]]]
120 self.cachedir = None # type: Optional[str]
121 self.outdir = None # type: Optional[str]
122 self.stagedir = "" # type: str
123 self.part_of = "" # type: str
124 self.basedir = "" # type: str
125 self.toplevel = False # type: bool
126 self.mutation_manager = None # type: Optional[MutationManager]
127 self.make_fs_access = StdFsAccess # type: Callable[[str], StdFsAccess]
128 self.path_mapper = PathMapper
129 self.builder = None # type: Optional[Builder]
130 self.docker_outdir = "" # type: str
131 self.docker_tmpdir = "" # type: str
132 self.docker_stagedir = "" # type: str
133 self.js_console = False # type: bool
134 self.job_script_provider = None # type: Optional[DependenciesConfiguration]
135 self.select_resources = None # type: Optional[select_resources_callable]
136 self.eval_timeout = 20 # type: float
137 self.postScatterEval = (
138 None
139 ) # type: Optional[Callable[[CWLObjectType], Optional[CWLObjectType]]]
140 self.on_error = "stop" # type: str
141 self.strict_memory_limit = False # type: bool
142
143 self.cidfile_dir = None # type: Optional[str]
144 self.cidfile_prefix = None # type: Optional[str]
145
146 self.workflow_eval_lock = None # type: Optional[threading.Condition]
147 self.research_obj = None # type: Optional[ResearchObject]
148 self.orcid = "" # type: str
149 self.cwl_full_name = "" # type: str
150 self.process_run_id = None # type: Optional[str]
151 self.prov_obj = None # type: Optional[ProvenanceProfile]
152 self.mpi_config = MpiConfig() # type: MpiConfig
153 self.default_stdout = None # type: Optional[Union[IO[bytes], TextIO]]
154 self.default_stderr = None # type: Optional[Union[IO[bytes], TextIO]]
155 super().__init__(kwargs)
156 if self.tmp_outdir_prefix == "":
157 self.tmp_outdir_prefix = self.tmpdir_prefix
158
159 def get_outdir(self) -> str:
160 """Return self.outdir or create one with self.tmp_outdir_prefix."""
161 if self.outdir:
162 return self.outdir
163 return self.create_outdir()
164
165 def get_tmpdir(self) -> str:
166 """Return self.tmpdir or create one with self.tmpdir_prefix."""
167 if self.tmpdir:
168 return self.tmpdir
169 return self.create_tmpdir()
170
171 def get_stagedir(self) -> str:
172 """Return self.stagedir or create one with self.tmpdir_prefix."""
173 if self.stagedir:
174 return self.stagedir
175 tmp_dir, tmp_prefix = os.path.split(self.tmpdir_prefix)
176 return tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir)
177
178 def create_tmpdir(self) -> str:
179 """Create a temporary directory that respects self.tmpdir_prefix."""
180 tmp_dir, tmp_prefix = os.path.split(self.tmpdir_prefix)
181 return tempfile.mkdtemp(prefix=tmp_prefix, dir=tmp_dir)
182
183 def create_outdir(self) -> str:
184 """Create a temporary directory that respects self.tmp_outdir_prefix."""
185 out_dir, out_prefix = os.path.split(self.tmp_outdir_prefix)
186 return tempfile.mkdtemp(prefix=out_prefix, dir=out_dir)
187
188 def copy(self):
189 # type: () -> RuntimeContext
190 return copy.copy(self)
191
192
193 def getdefault(val, default):
194 # type: (Any, Any) -> Any
195 if val is None:
196 return default
197 else:
198 return val