3
3
import re
4
4
from typing import Any , Callable , Dict , List , Set , Text , Union , cast
5
5
6
- from schema_salad .ref_resolver import Loader
6
+ from schema_salad .ref_resolver import Loader , SubLoader
7
7
from six .moves import urllib
8
8
from ruamel .yaml .comments import CommentedSeq , CommentedMap
9
9
@@ -91,12 +91,25 @@ def import_embed(d, seen):
91
91
seen .add (this )
92
92
break
93
93
94
- for v in d . values ( ):
95
- import_embed (v , seen )
94
+ for k in sorted ( d . keys () ):
95
+ import_embed (d [ k ] , seen )
96
96
97
97
98
98
def pack (document_loader , processobj , uri , metadata ):
99
99
# 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
+
100
113
def loadref (b , u ):
101
114
# type: (Text, Text) -> Union[Dict, List, Text]
102
115
return document_loader .resolve_ref (u , base_url = b )[0 ]
@@ -113,16 +126,13 @@ def loadref(b, u):
113
126
114
127
mainpath , _ = urllib .parse .urldefrag (uri )
115
128
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
118
131
if r == mainuri :
119
132
rewrite [r ] = "#main"
120
133
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
126
136
else :
127
137
path , frag = urllib .parse .urldefrag (r )
128
138
if path == mainpath :
@@ -133,10 +143,9 @@ def rewrite_id(r, mainuri, document_packed=False):
133
143
134
144
sortedids = sorted (ids )
135
145
136
- is_document_packed = all (id .startswith (uri ) for id in sortedids )
137
146
for r in sortedids :
138
147
if r in document_loader .idx :
139
- rewrite_id (r , uri , is_document_packed )
148
+ rewrite_id (r , uri )
140
149
141
150
packed = {"$graph" : [], "cwlVersion" : metadata ["cwlVersion" ]
142
151
} # type: Dict[Text, Any]
@@ -156,7 +165,7 @@ def rewrite_id(r, mainuri, document_packed=False):
156
165
if dcr .get ("class" ) not in ("Workflow" , "CommandLineTool" , "ExpressionTool" ):
157
166
continue
158
167
dc = cast (Dict [Text , Any ], copy .deepcopy (dcr ))
159
- v = rewrite . get ( r , r + "#main" )
168
+ v = rewrite [ r ]
160
169
dc ["id" ] = v
161
170
for n in ("name" , "cwlVersion" , "$namespaces" , "$schemas" ):
162
171
if n in dc :
0 commit comments