77import subprocess
88import sys
99import urllib .parse
10+ from collections .abc import MutableMapping
1011from io import StringIO
1112from pathlib import Path
1213from typing import Any , cast
1617import pytest
1718from cwl_utils .errors import JavascriptException
1819from cwl_utils .sandboxjs import param_re
19- from cwl_utils .types import CWLObjectType
20+ from cwl_utils .types import CWLObjectType , CWLOutputType , CWLParameterContext
2021from ruamel .yaml .comments import CommentedMap , CommentedSeq
2122from schema_salad .exceptions import ValidationException
2223
3738sys .argv = ["" ]
3839
3940expression_match = [
40- ("(foo )" , True ),
41- ("(foo .bar)" , True ),
42- ("(foo ['bar'])" , True ),
43- ('(foo ["bar"])' , True ),
44- ("(foo .bar.baz)" , True ),
45- ("(foo ['bar'].baz)" , True ),
46- ("(foo ['bar']['baz'])" , True ),
47- ("(foo ['b\\ 'ar']['baz'])" , True ),
48- ("(foo ['b ar']['baz'])" , True ),
49- ("(foo_bar )" , True ),
50- ('(foo .["bar"])' , False ),
51- ('(.foo ["bar"])' , False ),
52- ('(foo ["bar"])' , False ),
53- ('( foo ["bar"])' , False ),
54- ("(foo [bar].baz)" , False ),
55- ("(foo ['bar\" ].baz)" , False ),
56- ("(foo ['bar].baz)" , False ),
57- ("{foo }" , False ),
58- ("(foo .bar" , False ),
59- ("foo .bar)" , False ),
60- ("foo .b ar)" , False ),
61- ("foo .b'ar)" , False ),
62- ("(foo +bar" , False ),
63- ("(foo bar" , False ),
41+ ("(inputs )" , True ),
42+ ("(inputs .bar)" , True ),
43+ ("(inputs ['bar'])" , True ),
44+ ('(inputs ["bar"])' , True ),
45+ ("(inputs .bar.baz)" , True ),
46+ ("(inputs ['bar'].baz)" , True ),
47+ ("(inputs ['bar']['baz'])" , True ),
48+ ("(inputs ['b\\ 'ar']['baz'])" , True ),
49+ ("(inputs ['b ar']['baz'])" , True ),
50+ ("(inputs_bar )" , True ),
51+ ('(inputs .["bar"])' , False ),
52+ ('(.inputs ["bar"])' , False ),
53+ ('(inputs ["bar"])' , False ),
54+ ('( inputs ["bar"])' , False ),
55+ ("(inputs [bar].baz)" , False ),
56+ ("(inputs ['bar\" ].baz)" , False ),
57+ ("(inputs ['bar].baz)" , False ),
58+ ("{inputs }" , False ),
59+ ("(inputs .bar" , False ),
60+ ("inputs .bar)" , False ),
61+ ("inputs .b ar)" , False ),
62+ ("inputs .b'ar)" , False ),
63+ ("(inputs +bar" , False ),
64+ ("(inputs bar" , False ),
6465]
6566
6667
@@ -70,54 +71,66 @@ def test_expression_match(expression: str, expected: bool) -> None:
7071 assert (match is not None ) == expected
7172
7273
73- interpolate_input : dict [ str , Any ] = {
74- "foo" : {
74+ interpolate_input = CWLParameterContext (
75+ inputs = {
7576 "bar" : {"baz" : "zab1" },
7677 "b ar" : {"baz" : 2 },
7778 "b'ar" : {"baz" : True },
7879 'b"ar' : {"baz" : None },
7980 },
80- "lst" : ["A" , "B" ],
81- }
81+ self = ["A" , "B" ],
82+ )
8283
8384interpolate_parameters = [
84- ("$(foo)" , interpolate_input ["foo" ]),
85- ("$(foo.bar)" , interpolate_input ["foo" ]["bar" ]),
86- ("$(foo['bar'])" , interpolate_input ["foo" ]["bar" ]),
87- ('$(foo["bar"])' , interpolate_input ["foo" ]["bar" ]),
88- ("$(foo.bar.baz)" , interpolate_input ["foo" ]["bar" ]["baz" ]),
89- ("$(foo['bar'].baz)" , interpolate_input ["foo" ]["bar" ]["baz" ]),
90- ("$(foo['bar'][\" baz\" ])" , interpolate_input ["foo" ]["bar" ]["baz" ]),
91- ("$(foo.bar['baz'])" , interpolate_input ["foo" ]["bar" ]["baz" ]),
92- ("$(foo['b\\ 'ar'].baz)" , True ),
93- ('$(foo["b\' ar"].baz)' , True ),
94- ("$(foo['b\\ \" ar'].baz)" , None ),
95- ("$(lst[0])" , "A" ),
96- ("$(lst[1])" , "B" ),
97- ("$(lst.length)" , 2 ),
98- ("$(lst['length'])" , 2 ),
99- ("-$(foo.bar)" , """-{"baz": "zab1"}""" ),
100- ("-$(foo['bar'])" , """-{"baz": "zab1"}""" ),
101- ('-$(foo["bar"])' , """-{"baz": "zab1"}""" ),
102- ("-$(foo.bar.baz)" , "-zab1" ),
103- ("-$(foo['bar'].baz)" , "-zab1" ),
104- ("-$(foo['bar'][\" baz\" ])" , "-zab1" ),
105- ("-$(foo.bar['baz'])" , "-zab1" ),
106- ("-$(foo['b ar'].baz)" , "-2" ),
107- ("-$(foo['b\\ 'ar'].baz)" , "-true" ),
108- ('-$(foo["b\\ \' ar"].baz)' , "-true" ),
109- ("-$(foo['b\\ \" ar'].baz)" , "-null" ),
110- ("$(foo.bar) $(foo.bar)" , """{"baz": "zab1"} {"baz": "zab1"}""" ),
111- ("$(foo['bar']) $(foo['bar'])" , """{"baz": "zab1"} {"baz": "zab1"}""" ),
112- ('$(foo["bar"]) $(foo["bar"])' , """{"baz": "zab1"} {"baz": "zab1"}""" ),
113- ("$(foo.bar.baz) $(foo.bar.baz)" , "zab1 zab1" ),
114- ("$(foo['bar'].baz) $(foo['bar'].baz)" , "zab1 zab1" ),
115- ("$(foo['bar'][\" baz\" ]) $(foo['bar'][\" baz\" ])" , "zab1 zab1" ),
116- ("$(foo.bar['baz']) $(foo.bar['baz'])" , "zab1 zab1" ),
117- ("$(foo['b ar'].baz) $(foo['b ar'].baz)" , "2 2" ),
118- ("$(foo['b\\ 'ar'].baz) $(foo['b\\ 'ar'].baz)" , "true true" ),
119- ('$(foo["b\\ \' ar"].baz) $(foo["b\\ \' ar"].baz)' , "true true" ),
120- ("$(foo['b\\ \" ar'].baz) $(foo['b\\ \" ar'].baz)" , "null null" ),
85+ ("$(inputs)" , interpolate_input ["inputs" ]),
86+ ("$(inputs.bar)" , interpolate_input ["inputs" ]["bar" ]),
87+ ("$(inputs['bar'])" , interpolate_input ["inputs" ]["bar" ]),
88+ ('$(inputs["bar"])' , interpolate_input ["inputs" ]["bar" ]),
89+ (
90+ "$(inputs.bar.baz)" ,
91+ cast (MutableMapping [str , CWLOutputType ], interpolate_input ["inputs" ]["bar" ])["baz" ],
92+ ),
93+ (
94+ "$(inputs['bar'].baz)" ,
95+ cast (MutableMapping [str , CWLOutputType ], interpolate_input ["inputs" ]["bar" ])["baz" ],
96+ ),
97+ (
98+ "$(inputs['bar'][\" baz\" ])" ,
99+ cast (MutableMapping [str , CWLOutputType ], interpolate_input ["inputs" ]["bar" ])["baz" ],
100+ ),
101+ (
102+ "$(inputs.bar['baz'])" ,
103+ cast (MutableMapping [str , CWLOutputType ], interpolate_input ["inputs" ]["bar" ])["baz" ],
104+ ),
105+ ("$(inputs['b\\ 'ar'].baz)" , True ),
106+ ('$(inputs["b\' ar"].baz)' , True ),
107+ ("$(inputs['b\\ \" ar'].baz)" , None ),
108+ ("$(self[0])" , "A" ),
109+ ("$(self[1])" , "B" ),
110+ ("$(self.length)" , 2 ),
111+ ("$(self['length'])" , 2 ),
112+ ("-$(inputs.bar)" , """-{"baz": "zab1"}""" ),
113+ ("-$(inputs['bar'])" , """-{"baz": "zab1"}""" ),
114+ ('-$(inputs["bar"])' , """-{"baz": "zab1"}""" ),
115+ ("-$(inputs.bar.baz)" , "-zab1" ),
116+ ("-$(inputs['bar'].baz)" , "-zab1" ),
117+ ("-$(inputs['bar'][\" baz\" ])" , "-zab1" ),
118+ ("-$(inputs.bar['baz'])" , "-zab1" ),
119+ ("-$(inputs['b ar'].baz)" , "-2" ),
120+ ("-$(inputs['b\\ 'ar'].baz)" , "-true" ),
121+ ('-$(inputs["b\\ \' ar"].baz)' , "-true" ),
122+ ("-$(inputs['b\\ \" ar'].baz)" , "-null" ),
123+ ("$(inputs.bar) $(inputs.bar)" , """{"baz": "zab1"} {"baz": "zab1"}""" ),
124+ ("$(inputs['bar']) $(inputs['bar'])" , """{"baz": "zab1"} {"baz": "zab1"}""" ),
125+ ('$(inputs["bar"]) $(inputs["bar"])' , """{"baz": "zab1"} {"baz": "zab1"}""" ),
126+ ("$(inputs.bar.baz) $(inputs.bar.baz)" , "zab1 zab1" ),
127+ ("$(inputs['bar'].baz) $(inputs['bar'].baz)" , "zab1 zab1" ),
128+ ("$(inputs['bar'][\" baz\" ]) $(inputs['bar'][\" baz\" ])" , "zab1 zab1" ),
129+ ("$(inputs.bar['baz']) $(inputs.bar['baz'])" , "zab1 zab1" ),
130+ ("$(inputs['b ar'].baz) $(inputs['b ar'].baz)" , "2 2" ),
131+ ("$(inputs['b\\ 'ar'].baz) $(inputs['b\\ 'ar'].baz)" , "true true" ),
132+ ('$(inputs["b\\ \' ar"].baz) $(inputs["b\\ \' ar"].baz)' , "true true" ),
133+ ("$(inputs['b\\ \" ar'].baz) $(inputs['b\\ \" ar'].baz)" , "null null" ),
121134]
122135
123136
@@ -128,31 +141,31 @@ def test_expression_interpolate(pattern: str, expected: Any) -> None:
128141
129142parameter_to_expressions = [
130143 (
131- "-$(foo )" ,
144+ "-$(inputs )" ,
132145 r"""-{"bar":{"baz":"zab1"},"b ar":{"baz":2},"b'ar":{"baz":true},"b\"ar":{"baz":null}}""" ,
133146 ),
134- ("-$(foo .bar)" , """-{"baz":"zab1"}""" ),
135- ("-$(foo ['bar'])" , """-{"baz":"zab1"}""" ),
136- ('-$(foo ["bar"])' , """-{"baz":"zab1"}""" ),
137- ("-$(foo .bar.baz)" , "-zab1" ),
138- ("-$(foo ['bar'].baz)" , "-zab1" ),
139- ("-$(foo ['bar'][\" baz\" ])" , "-zab1" ),
140- ("-$(foo .bar['baz'])" , "-zab1" ),
141- ("-$(foo ['b ar'].baz)" , "-2" ),
142- ("-$(foo ['b\\ 'ar'].baz)" , "-true" ),
143- ('-$(foo ["b\\ \' ar"].baz)' , "-true" ),
144- ("-$(foo ['b\\ \" ar'].baz)" , "-null" ),
145- ("$(foo .bar) $(foo .bar)" , """{"baz":"zab1"} {"baz":"zab1"}""" ),
146- ("$(foo ['bar']) $(foo ['bar'])" , """{"baz":"zab1"} {"baz":"zab1"}""" ),
147- ('$(foo ["bar"]) $(foo ["bar"])' , """{"baz":"zab1"} {"baz":"zab1"}""" ),
148- ("$(foo .bar.baz) $(foo .bar.baz)" , "zab1 zab1" ),
149- ("$(foo ['bar'].baz) $(foo ['bar'].baz)" , "zab1 zab1" ),
150- ("$(foo ['bar'][\" baz\" ]) $(foo ['bar'][\" baz\" ])" , "zab1 zab1" ),
151- ("$(foo .bar['baz']) $(foo .bar['baz'])" , "zab1 zab1" ),
152- ("$(foo ['b ar'].baz) $(foo ['b ar'].baz)" , "2 2" ),
153- ("$(foo ['b\\ 'ar'].baz) $(foo ['b\\ 'ar'].baz)" , "true true" ),
154- ('$(foo ["b\\ \' ar"].baz) $(foo ["b\\ \' ar"].baz)' , "true true" ),
155- ("$(foo ['b\\ \" ar'].baz) $(foo ['b\\ \" ar'].baz)" , "null null" ),
147+ ("-$(inputs .bar)" , """-{"baz":"zab1"}""" ),
148+ ("-$(inputs ['bar'])" , """-{"baz":"zab1"}""" ),
149+ ('-$(inputs ["bar"])' , """-{"baz":"zab1"}""" ),
150+ ("-$(inputs .bar.baz)" , "-zab1" ),
151+ ("-$(inputs ['bar'].baz)" , "-zab1" ),
152+ ("-$(inputs ['bar'][\" baz\" ])" , "-zab1" ),
153+ ("-$(inputs .bar['baz'])" , "-zab1" ),
154+ ("-$(inputs ['b ar'].baz)" , "-2" ),
155+ ("-$(inputs ['b\\ 'ar'].baz)" , "-true" ),
156+ ('-$(inputs ["b\\ \' ar"].baz)' , "-true" ),
157+ ("-$(inputs ['b\\ \" ar'].baz)" , "-null" ),
158+ ("$(inputs .bar) $(inputs .bar)" , """{"baz":"zab1"} {"baz":"zab1"}""" ),
159+ ("$(inputs ['bar']) $(inputs ['bar'])" , """{"baz":"zab1"} {"baz":"zab1"}""" ),
160+ ('$(inputs ["bar"]) $(inputs ["bar"])' , """{"baz":"zab1"} {"baz":"zab1"}""" ),
161+ ("$(inputs .bar.baz) $(inputs .bar.baz)" , "zab1 zab1" ),
162+ ("$(inputs ['bar'].baz) $(inputs ['bar'].baz)" , "zab1 zab1" ),
163+ ("$(inputs ['bar'][\" baz\" ]) $(inputs ['bar'][\" baz\" ])" , "zab1 zab1" ),
164+ ("$(inputs .bar['baz']) $(inputs .bar['baz'])" , "zab1 zab1" ),
165+ ("$(inputs ['b ar'].baz) $(inputs ['b ar'].baz)" , "2 2" ),
166+ ("$(inputs ['b\\ 'ar'].baz) $(inputs ['b\\ 'ar'].baz)" , "true true" ),
167+ ('$(inputs ["b\\ \' ar"].baz) $(inputs ["b\\ \' ar"].baz)' , "true true" ),
168+ ("$(inputs ['b\\ \" ar'].baz) $(inputs ['b\\ \" ar'].baz)" , "null null" ),
156169]
157170
158171
@@ -174,22 +187,22 @@ def test_parameter_to_expression(pattern: str, expected: Any) -> None:
174187
175188
176189param_to_expr_interpolate_escapebehavior = (
177- ("\\ $(foo .bar.baz)" , "$(foo .bar.baz)" , 1 ),
178- ("\\ \\ $(foo .bar.baz)" , "\\ zab1" , 1 ),
179- ("\\ \\ \\ $(foo .bar.baz)" , "\\ $(foo .bar.baz)" , 1 ),
180- ("\\ \\ \\ \\ $(foo .bar.baz)" , "\\ \\ zab1" , 1 ),
181- ("\\ $foo " , "$foo " , 1 ),
182- ("\\ foo " , "foo " , 1 ),
190+ ("\\ $(inputs .bar.baz)" , "$(inputs .bar.baz)" , 1 ),
191+ ("\\ \\ $(inputs .bar.baz)" , "\\ zab1" , 1 ),
192+ ("\\ \\ \\ $(inputs .bar.baz)" , "\\ $(inputs .bar.baz)" , 1 ),
193+ ("\\ \\ \\ \\ $(inputs .bar.baz)" , "\\ \\ zab1" , 1 ),
194+ ("\\ $inputs " , "$inputs " , 1 ),
195+ ("\\ inputs " , "inputs " , 1 ),
183196 ("\\ x" , "x" , 1 ),
184197 ("\\ \\ x" , "\\ x" , 1 ),
185198 ("\\ \\ \\ x" , "\\ x" , 1 ),
186199 ("\\ \\ \\ \\ x" , "\\ \\ x" , 1 ),
187- ("\\ $(foo .bar.baz)" , "$(foo .bar.baz)" , 2 ),
188- ("\\ \\ $(foo .bar.baz)" , "\\ zab1" , 2 ),
189- ("\\ \\ \\ $(foo .bar.baz)" , "\\ $(foo .bar.baz)" , 2 ),
190- ("\\ \\ \\ \\ $(foo .bar.baz)" , "\\ \\ zab1" , 2 ),
191- ("\\ $foo " , "\\ $foo " , 2 ),
192- ("\\ foo " , "\\ foo " , 2 ),
200+ ("\\ $(inputs .bar.baz)" , "$(inputs .bar.baz)" , 2 ),
201+ ("\\ \\ $(inputs .bar.baz)" , "\\ zab1" , 2 ),
202+ ("\\ \\ \\ $(inputs .bar.baz)" , "\\ $(inputs .bar.baz)" , 2 ),
203+ ("\\ \\ \\ \\ $(inputs .bar.baz)" , "\\ \\ zab1" , 2 ),
204+ ("\\ $inputs " , "\\ $inputs " , 2 ),
205+ ("\\ inputs " , "\\ inputs " , 2 ),
193206 ("\\ x" , "\\ x" , 2 ),
194207 ("\\ \\ x" , "\\ x" , 2 ),
195208 ("\\ \\ \\ x" , "\\ \\ x" , 2 ),
@@ -219,32 +232,32 @@ def test_parameter_to_expression_interpolate_escapebehavior(
219232
220233
221234interpolate_bad_parameters = [
222- ("$(fooz )" ),
223- ("$(foo .barz)" ),
224- ("$(foo ['barz'])" ),
225- ('$(foo ["barz"])' ),
226- ("$(foo .bar.bazz)" ),
227- ("$(foo ['bar'].bazz)" ),
228- ("$(foo ['bar'][\" bazz\" ])" ),
229- ("$(foo .bar['bazz'])" ),
230- ("$(foo ['b\\ 'ar'].bazz)" ),
231- ('$(foo ["b\' ar"].bazz)' ),
232- ("$(foo ['b\\ \" ar'].bazz)" ),
233- ("$(lst [O])" ), # not "0" the number, but the letter O
234- ("$(lst [2])" ),
235- ("$(lst .lengthz)" ),
236- ("$(lst ['lengthz'])" ),
237- ("-$(foo .barz)" ),
238- ("-$(foo ['barz'])" ),
239- ('-$(foo ["barz"])' ),
240- ("-$(foo .bar.bazz)" ),
241- ("-$(foo ['bar'].bazz)" ),
242- ("-$(foo ['bar'][\" bazz\" ])" ),
243- ("-$(foo .bar['bazz'])" ),
244- ("-$(foo ['b ar'].bazz)" ),
245- ("-$(foo ['b\\ 'ar'].bazz)" ),
246- ('-$(foo ["b\\ \' ar"].bazz)' ),
247- ("-$(foo ['b\\ \" ar'].bazz)" ),
235+ ("$(inputsz )" ),
236+ ("$(inputs .barz)" ),
237+ ("$(inputs ['barz'])" ),
238+ ('$(inputs ["barz"])' ),
239+ ("$(inputs .bar.bazz)" ),
240+ ("$(inputs ['bar'].bazz)" ),
241+ ("$(inputs ['bar'][\" bazz\" ])" ),
242+ ("$(inputs .bar['bazz'])" ),
243+ ("$(inputs ['b\\ 'ar'].bazz)" ),
244+ ('$(inputs ["b\' ar"].bazz)' ),
245+ ("$(inputs ['b\\ \" ar'].bazz)" ),
246+ ("$(self [O])" ), # not "0" the number, but the letter O
247+ ("$(self [2])" ),
248+ ("$(self .lengthz)" ),
249+ ("$(self ['lengthz'])" ),
250+ ("-$(inputs .barz)" ),
251+ ("-$(inputs ['barz'])" ),
252+ ('-$(inputs ["barz"])' ),
253+ ("-$(inputs .bar.bazz)" ),
254+ ("-$(inputs ['bar'].bazz)" ),
255+ ("-$(inputs ['bar'][\" bazz\" ])" ),
256+ ("-$(inputs .bar['bazz'])" ),
257+ ("-$(inputs ['b ar'].bazz)" ),
258+ ("-$(inputs ['b\\ 'ar'].bazz)" ),
259+ ('-$(inputs ["b\\ \' ar"].bazz)' ),
260+ ("-$(inputs ['b\\ \" ar'].bazz)" ),
248261]
249262
250263
@@ -255,22 +268,22 @@ def test_expression_interpolate_failures(pattern: str) -> None:
255268
256269
257270interpolate_escapebehavior = (
258- ("\\ $(foo .bar.baz)" , "$(foo .bar.baz)" , 1 ),
259- ("\\ \\ $(foo .bar.baz)" , "\\ zab1" , 1 ),
260- ("\\ \\ \\ $(foo .bar.baz)" , "\\ $(foo .bar.baz)" , 1 ),
261- ("\\ \\ \\ \\ $(foo .bar.baz)" , "\\ \\ zab1" , 1 ),
262- ("\\ $foo " , "$foo " , 1 ),
263- ("\\ foo " , "foo " , 1 ),
271+ ("\\ $(inputs .bar.baz)" , "$(inputs .bar.baz)" , 1 ),
272+ ("\\ \\ $(inputs .bar.baz)" , "\\ zab1" , 1 ),
273+ ("\\ \\ \\ $(inputs .bar.baz)" , "\\ $(inputs .bar.baz)" , 1 ),
274+ ("\\ \\ \\ \\ $(inputs .bar.baz)" , "\\ \\ zab1" , 1 ),
275+ ("\\ $inputs " , "$inputs " , 1 ),
276+ ("\\ inputs " , "inputs " , 1 ),
264277 ("\\ x" , "x" , 1 ),
265278 ("\\ \\ x" , "\\ x" , 1 ),
266279 ("\\ \\ \\ x" , "\\ x" , 1 ),
267280 ("\\ \\ \\ \\ x" , "\\ \\ x" , 1 ),
268- ("\\ $(foo .bar.baz)" , "$(foo .bar.baz)" , 2 ),
269- ("\\ \\ $(foo .bar.baz)" , "\\ zab1" , 2 ),
270- ("\\ \\ \\ $(foo .bar.baz)" , "\\ $(foo .bar.baz)" , 2 ),
271- ("\\ \\ \\ \\ $(foo .bar.baz)" , "\\ \\ zab1" , 2 ),
272- ("\\ $foo " , "\\ $foo " , 2 ),
273- ("\\ foo " , "\\ foo " , 2 ),
281+ ("\\ $(inputs .bar.baz)" , "$(inputs .bar.baz)" , 2 ),
282+ ("\\ \\ $(inputs .bar.baz)" , "\\ zab1" , 2 ),
283+ ("\\ \\ \\ $(inputs .bar.baz)" , "\\ $(inputs .bar.baz)" , 2 ),
284+ ("\\ \\ \\ \\ $(inputs .bar.baz)" , "\\ \\ zab1" , 2 ),
285+ ("\\ $inputs " , "\\ $inputs " , 2 ),
286+ ("\\ inputs " , "\\ inputs " , 2 ),
274287 ("\\ x" , "\\ x" , 2 ),
275288 ("\\ \\ x" , "\\ x" , 2 ),
276289 ("\\ \\ \\ x" , "\\ \\ x" , 2 ),
0 commit comments