11from __future__ import absolute_import
22import copy
3+ import re
34from typing import Any , Callable , Dict , List , Set , Text , Union , cast
45
56from schema_salad .ref_resolver import Loader
@@ -111,12 +112,16 @@ def loadref(b, u):
111112
112113 mainpath , _ = urllib .parse .urldefrag (uri )
113114
114- def rewrite_id (r , mainuri ):
115- # type: (Text, Text) -> None
115+ def rewrite_id (r , mainuri , document_packed = False ):
116+ # type: (Text, Text, bool ) -> None
116117 if r == mainuri :
117118 rewrite [r ] = "#main"
118119 elif r .startswith (mainuri ) and r [len (mainuri )] in ("#" , "/" ):
119- pass
120+ if document_packed :
121+ # rewrite tool and mainuri ids in a packed document
122+ tool_id = re .search ("#[^/]*$" , r )
123+ if tool_id :
124+ rewrite [r ] = tool_id .group ()
120125 else :
121126 path , frag = urllib .parse .urldefrag (r )
122127 if path == mainpath :
@@ -127,9 +132,10 @@ def rewrite_id(r, mainuri):
127132
128133 sortedids = sorted (ids )
129134
135+ is_document_packed = all (id .startswith (uri ) for id in sortedids )
130136 for r in sortedids :
131137 if r in document_loader .idx :
132- rewrite_id (r , uri )
138+ rewrite_id (r , uri , is_document_packed )
133139
134140 packed = {"$graph" : [], "cwlVersion" : metadata ["cwlVersion" ]
135141 } # type: Dict[Text, Any]
@@ -138,15 +144,15 @@ def rewrite_id(r, mainuri):
138144 for r in sorted (runs ):
139145 dcr , metadata = document_loader .resolve_ref (r )
140146 if not isinstance (dcr , dict ):
141- continue
147+ dcr = dcr [ 0 ]
142148 for doc in (dcr , metadata ):
143149 if "$schemas" in doc :
144150 for s in doc ["$schemas" ]:
145151 schemas .add (s )
146152 if dcr .get ("class" ) not in ("Workflow" , "CommandLineTool" , "ExpressionTool" ):
147153 continue
148154 dc = cast (Dict [Text , Any ], copy .deepcopy (dcr ))
149- v = rewrite [ r ]
155+ v = rewrite . get ( r , r + "#main" )
150156 dc ["id" ] = v
151157 for n in ("name" , "cwlVersion" , "$namespaces" , "$schemas" ):
152158 if n in dc :
0 commit comments