Skip to content

Commit 7eeaa9a

Browse files
authored
Fixes to --pack behavior: (#577)
* Fixes to --pack behavior * Create a subloader with an empty index. Ensures that all cross references (especially $imports) will be discovered and resolved for packing. * Move pack to happen after tool loading (ensures everything has passed validation before packing) * Fix idempotent packing.
1 parent 4834529 commit 7eeaa9a

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

cwltool/main.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -790,7 +790,8 @@ def main(argsl=None, # type: List[str]
790790
'enable_ga4gh_tool_registry': False,
791791
'ga4gh_tool_registries': [],
792792
'find_default_container': None,
793-
'make_template': False
793+
'make_template': False,
794+
'overrides': None
794795
}):
795796
if not hasattr(args, k):
796797
setattr(args, k, v)
@@ -869,10 +870,6 @@ def main(argsl=None, # type: List[str]
869870
skip_schemas=args.skip_schemas,
870871
overrides=overrides)
871872

872-
if args.pack:
873-
stdout.write(print_pack(document_loader, processobj, uri, metadata))
874-
return 0
875-
876873
if args.print_pre:
877874
stdout.write(json.dumps(processobj, indent=4))
878875
return 0
@@ -903,6 +900,10 @@ def main(argsl=None, # type: List[str]
903900
if args.validate:
904901
return 0
905902

903+
if args.pack:
904+
stdout.write(print_pack(document_loader, processobj, uri, metadata))
905+
return 0
906+
906907
if args.print_rdf:
907908
stdout.write(printrdf(tool, document_loader.ctx, args.rdf_serializer))
908909
return 0

cwltool/pack.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import re
44
from typing import Any, Callable, Dict, List, Set, Text, Union, cast
55

6-
from schema_salad.ref_resolver import Loader
6+
from schema_salad.ref_resolver import Loader, SubLoader
77
from six.moves import urllib
88
from ruamel.yaml.comments import CommentedSeq, CommentedMap
99

@@ -91,12 +91,25 @@ def import_embed(d, seen):
9191
seen.add(this)
9292
break
9393

94-
for v in d.values():
95-
import_embed(v, seen)
94+
for k in sorted(d.keys()):
95+
import_embed(d[k], seen)
9696

9797

9898
def pack(document_loader, processobj, uri, metadata):
9999
# type: (Loader, Union[Dict[Text, Any], List[Dict[Text, Any]]], Text, Dict[Text, Text]) -> Dict[Text, Any]
100+
101+
document_loader = SubLoader(document_loader)
102+
document_loader.idx = {}
103+
if isinstance(processobj, dict):
104+
document_loader.idx[processobj["id"]] = CommentedMap(six.iteritems(processobj))
105+
elif isinstance(processobj, list):
106+
path, frag = urllib.parse.urldefrag(uri)
107+
for po in processobj:
108+
if not frag:
109+
if po["id"].endswith("#main"):
110+
uri = po["id"]
111+
document_loader.idx[po["id"]] = CommentedMap(six.iteritems(po))
112+
100113
def loadref(b, u):
101114
# type: (Text, Text) -> Union[Dict, List, Text]
102115
return document_loader.resolve_ref(u, base_url=b)[0]
@@ -113,16 +126,13 @@ def loadref(b, u):
113126

114127
mainpath, _ = urllib.parse.urldefrag(uri)
115128

116-
def rewrite_id(r, mainuri, document_packed=False):
117-
# type: (Text, Text, bool) -> None
129+
def rewrite_id(r, mainuri):
130+
# type: (Text, Text) -> None
118131
if r == mainuri:
119132
rewrite[r] = "#main"
120133
elif r.startswith(mainuri) and r[len(mainuri)] in ("#", "/"):
121-
if document_packed:
122-
# rewrite tool and mainuri ids in a packed document
123-
tool_id = re.search("#[^/]*$", r)
124-
if tool_id:
125-
rewrite[r] = tool_id.group()
134+
path, frag = urllib.parse.urldefrag(r)
135+
rewrite[r] = "#"+frag
126136
else:
127137
path, frag = urllib.parse.urldefrag(r)
128138
if path == mainpath:
@@ -133,10 +143,9 @@ def rewrite_id(r, mainuri, document_packed=False):
133143

134144
sortedids = sorted(ids)
135145

136-
is_document_packed = all(id.startswith(uri) for id in sortedids)
137146
for r in sortedids:
138147
if r in document_loader.idx:
139-
rewrite_id(r, uri, is_document_packed)
148+
rewrite_id(r, uri)
140149

141150
packed = {"$graph": [], "cwlVersion": metadata["cwlVersion"]
142151
} # type: Dict[Text, Any]
@@ -156,7 +165,7 @@ def rewrite_id(r, mainuri, document_packed=False):
156165
if dcr.get("class") not in ("Workflow", "CommandLineTool", "ExpressionTool"):
157166
continue
158167
dc = cast(Dict[Text, Any], copy.deepcopy(dcr))
159-
v = rewrite.get(r, r + "#main")
168+
v = rewrite[r]
160169
dc["id"] = v
161170
for n in ("name", "cwlVersion", "$namespaces", "$schemas"):
162171
if n in dc:

0 commit comments

Comments
 (0)