Skip to content

Commit d6e5545

Browse files
author
Peter Amstutz
committed
Override identifiers are relative to workflow, other identifiers are relative
to job document.
1 parent 0815a40 commit d6e5545

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

cwltool/load_tool.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,8 @@
3838
u"id": u"@id"
3939
}
4040

41-
_cwldl = get_schema("v1.0")[0]
42-
overrides_ctx = copy.copy(_cwldl.ctx)
43-
overrides_ctx.update({
41+
42+
overrides_ctx = {
4443
u"overrideTarget": {u"@type": u"@id"},
4544
u"cwltool": "http://commonwl.org/cwltool#",
4645
u"overrides": {
@@ -52,10 +51,13 @@
5251
"@id": "cwltool:override",
5352
"mapSubject": "class"
5453
}
55-
})
54+
}
5655

5756
def resolve_tool_uri(argsworkflow, # type: Union[Text, Dict[Text, Any]]
58-
resolver=None, # type: Callable[[Loader, Union[Text, Dict[Text, Any]]], Text]
57+
resolver=None, # type: Callable[[Loader, Union[Text, Dict[Text, Any]]], Text]
58+
fetcher_constructor=None,
59+
# type: Callable[[Dict[Text, Text], requests.sessions.Session], Fetcher]
60+
document_loader=None # type: Loader
5961
):
6062
# type: (...) -> Tuple[Text, Text]
6163

@@ -67,6 +69,8 @@ def resolve_tool_uri(argsworkflow, # type: Union[Text, Dict[Text, Any]]
6769
elif os.path.exists(os.path.abspath(argsworkflow)):
6870
uri = file_uri(str(os.path.abspath(argsworkflow)))
6971
elif resolver:
72+
if document_loader is None:
73+
document_loader = Loader(jobloaderctx, fetcher_constructor=fetcher_constructor) # type: ignore
7074
uri = resolver(document_loader, argsworkflow)
7175

7276
if uri is None:
@@ -76,7 +80,7 @@ def resolve_tool_uri(argsworkflow, # type: Union[Text, Dict[Text, Any]]
7680
_logger.info("Resolved '%s' to '%s'", argsworkflow, uri)
7781

7882
fileuri = urllib.parse.urldefrag(uri)[0]
79-
return (uri, fileuri)
83+
return uri, fileuri
8084

8185

8286
def fetch_document(argsworkflow, # type: Union[Text, Dict[Text, Any]]
@@ -92,7 +96,7 @@ def fetch_document(argsworkflow, # type: Union[Text, Dict[Text, Any]]
9296
uri = None # type: Text
9397
workflowobj = None # type: CommentedMap
9498
if isinstance(argsworkflow, string_types):
95-
uri, fileuri = resolve_tool_uri(argsworkflow, resolver)
99+
uri, fileuri = resolve_tool_uri(argsworkflow, resolver=resolver, document_loader=document_loader)
96100
workflowobj = document_loader.fetch(fileuri)
97101
elif isinstance(argsworkflow, dict):
98102
uri = "#" + Text(id(argsworkflow))
@@ -190,7 +194,7 @@ def validate_document(document_loader, # type: Loader
190194
del cast(dict, jobobj)["https://w3id.org/cwl/cwl#tool"]
191195

192196
if "http://commonwl.org/cwltool#overrides" in jobobj:
193-
overrides.extend(resolve_overrides(jobobj, uri))
197+
overrides.extend(resolve_overrides(jobobj, uri, uri))
194198
del jobobj["http://commonwl.org/cwltool#overrides"]
195199

196200
workflowobj = fetch_document(uri, fetcher_constructor=fetcher_constructor)[1]
@@ -329,15 +333,15 @@ def load_tool(argsworkflow, # type: Union[Text, Dict[Text, Any]]
329333
return make_tool(document_loader, avsc_names, metadata, uri,
330334
makeTool, kwargs if kwargs else {})
331335

332-
def resolve_overrides(ov, baseurl): # type: (CommentedMap, Text) -> List[Dict[Text, Any]]
336+
def resolve_overrides(ov, ov_uri, baseurl): # type: (CommentedMap, Text) -> List[Dict[Text, Any]]
333337
ovloader = Loader(overrides_ctx)
334-
del ov["id"]
335-
del ov["name"]
336338
ret, _ = ovloader.resolve_all(ov, baseurl)
337339
if not isinstance(ret, CommentedMap):
338340
raise Exception("Expected CommentedMap, got %s" % type(ret))
341+
cwl_docloader = get_schema("v1.0")[0]
342+
cwl_docloader.resolve_all(ret, ov_uri)
339343
return ret["overrides"]
340344

341345
def load_overrides(ov, base_url): # type: (Text, Text) -> List[Dict[Text, Any]]
342346
ovloader = Loader(overrides_ctx)
343-
return resolve_overrides(ovloader.fetch(ov), base_url)
347+
return resolve_overrides(ovloader.fetch(ov), ov, base_url)

cwltool/main.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ def load_job_order(args, # type: argparse.Namespace
544544
job_order_object, _ = loader.resolve_ref(job_order_file, checklinks=False)
545545

546546
if job_order_object and "http://commonwl.org/cwltool#overrides" in job_order_object:
547-
overrides.extend(resolve_overrides(job_order_object, tool_file_uri))
547+
overrides.extend(resolve_overrides(job_order_object, file_uri(job_order_file), tool_file_uri))
548548
del job_order_object["http://commonwl.org/cwltool#overrides"]
549549

550550
if not job_order_object:
@@ -835,7 +835,9 @@ def main(argsl=None, # type: List[str]
835835
else:
836836
use_standard_schema("v1.0")
837837

838-
uri, tool_file_uri = resolve_tool_uri(args.workflow, resolver)
838+
uri, tool_file_uri = resolve_tool_uri(args.workflow,
839+
resolver=resolver,
840+
fetcher_constructor=fetcher_constructor)
839841

840842
overrides = [] # type: List[Dict[Text, Any]]
841843

tests/test_fetch.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def fetch_text(self, url): # type: (unicode) -> unicode
2727
outputs: []
2828
"""
2929
else:
30-
raise RuntimeError("Not foo.cwl")
30+
raise RuntimeError("Not foo.cwl, was %s" % url)
3131

3232
def check_exists(self, url): # type: (unicode) -> bool
3333
if url == "baz:bar/foo.cwl":
@@ -46,7 +46,11 @@ def urljoin(self, base, url):
4646
return urllib.parse.urljoin(base, url)
4747

4848
def test_resolver(d, a):
49-
return "baz:bar/" + a
49+
if a.startswith("baz:bar/"):
50+
return a
51+
else:
52+
return "baz:bar/" + a
53+
5054

5155
load_tool("foo.cwl", defaultMakeTool, resolver=test_resolver, fetcher_constructor=TestFetcher)
5256

0 commit comments

Comments
 (0)