@@ -132,6 +132,94 @@ def test_expression_interpolate(pattern: str, expected: Any) -> None:
132
132
assert expr .interpolate (pattern , interpolate_input ) == expected
133
133
134
134
135
+ parameter_to_expressions = [
136
+ (
137
+ "-$(foo)" ,
138
+ r"""-{"bar":{"baz":"zab1"},"b ar":{"baz":2},"b'ar":{"baz":true},"b\"ar":{"baz":null}}""" ,
139
+ ),
140
+ ("-$(foo.bar)" , """-{"baz":"zab1"}""" ),
141
+ ("-$(foo['bar'])" , """-{"baz":"zab1"}""" ),
142
+ ('-$(foo["bar"])' , """-{"baz":"zab1"}""" ),
143
+ ("-$(foo.bar.baz)" , "-zab1" ),
144
+ ("-$(foo['bar'].baz)" , "-zab1" ),
145
+ ("-$(foo['bar'][\" baz\" ])" , "-zab1" ),
146
+ ("-$(foo.bar['baz'])" , "-zab1" ),
147
+ ("-$(foo['b ar'].baz)" , "-2" ),
148
+ ("-$(foo['b\\ 'ar'].baz)" , "-true" ),
149
+ ('-$(foo["b\\ \' ar"].baz)' , "-true" ),
150
+ ("-$(foo['b\\ \" ar'].baz)" , "-null" ),
151
+ ("$(foo.bar) $(foo.bar)" , """{"baz":"zab1"} {"baz":"zab1"}""" ),
152
+ ("$(foo['bar']) $(foo['bar'])" , """{"baz":"zab1"} {"baz":"zab1"}""" ),
153
+ ('$(foo["bar"]) $(foo["bar"])' , """{"baz":"zab1"} {"baz":"zab1"}""" ),
154
+ ("$(foo.bar.baz) $(foo.bar.baz)" , "zab1 zab1" ),
155
+ ("$(foo['bar'].baz) $(foo['bar'].baz)" , "zab1 zab1" ),
156
+ ("$(foo['bar'][\" baz\" ]) $(foo['bar'][\" baz\" ])" , "zab1 zab1" ),
157
+ ("$(foo.bar['baz']) $(foo.bar['baz'])" , "zab1 zab1" ),
158
+ ("$(foo['b ar'].baz) $(foo['b ar'].baz)" , "2 2" ),
159
+ ("$(foo['b\\ 'ar'].baz) $(foo['b\\ 'ar'].baz)" , "true true" ),
160
+ ('$(foo["b\\ \' ar"].baz) $(foo["b\\ \' ar"].baz)' , "true true" ),
161
+ ("$(foo['b\\ \" ar'].baz) $(foo['b\\ \" ar'].baz)" , "null null" ),
162
+ ]
163
+
164
+
165
+ @pytest .mark .parametrize ("pattern,expected" , parameter_to_expressions ) # type: ignore
166
+ def test_parameter_to_expression (pattern : str , expected : Any ) -> None :
167
+ """Test the interpolate convert_to_expression feature."""
168
+ assert (
169
+ expr .interpolate (
170
+ expr .interpolate (pattern , {}, convert_to_expression = True ),
171
+ None ,
172
+ jslib = expr .jshead ([], interpolate_input ),
173
+ fullJS = True ,
174
+ debug = True ,
175
+ )
176
+ == expected
177
+ )
178
+
179
+
180
+ param_to_expr_interpolate_escapebehavior = (
181
+ ("\\ $(foo.bar.baz)" , "$(foo.bar.baz)" , 1 ),
182
+ ("\\ \\ $(foo.bar.baz)" , "\\ zab1" , 1 ),
183
+ ("\\ \\ \\ $(foo.bar.baz)" , "\\ $(foo.bar.baz)" , 1 ),
184
+ ("\\ \\ \\ \\ $(foo.bar.baz)" , "\\ \\ zab1" , 1 ),
185
+ ("\\ $foo" , "$foo" , 1 ),
186
+ ("\\ foo" , "foo" , 1 ),
187
+ ("\\ x" , "x" , 1 ),
188
+ ("\\ \\ x" , "\\ x" , 1 ),
189
+ ("\\ \\ \\ x" , "\\ x" , 1 ),
190
+ ("\\ \\ \\ \\ x" , "\\ \\ x" , 1 ),
191
+ ("\\ $(foo.bar.baz)" , "$(foo.bar.baz)" , 2 ),
192
+ ("\\ \\ $(foo.bar.baz)" , "\\ zab1" , 2 ),
193
+ ("\\ \\ \\ $(foo.bar.baz)" , "\\ $(foo.bar.baz)" , 2 ),
194
+ ("\\ \\ \\ \\ $(foo.bar.baz)" , "\\ \\ zab1" , 2 ),
195
+ ("\\ $foo" , "\\ $foo" , 2 ),
196
+ ("\\ foo" , "\\ foo" , 2 ),
197
+ ("\\ x" , "\\ x" , 2 ),
198
+ ("\\ \\ x" , "\\ x" , 2 ),
199
+ ("\\ \\ \\ x" , "\\ \\ x" , 2 ),
200
+ ("\\ \\ \\ \\ x" , "\\ \\ x" , 2 ),
201
+ )
202
+
203
+
204
+ @pytest .mark .parametrize ("pattern,expected,behavior" , param_to_expr_interpolate_escapebehavior ) # type: ignore
205
+ def test_parameter_to_expression_interpolate_escapebehavior (
206
+ pattern : str , expected : str , behavior : int
207
+ ) -> None :
208
+ """Test escaping behavior in an convert_to_expression context."""
209
+ assert (
210
+ expr .interpolate (
211
+ expr .interpolate (
212
+ pattern , {}, escaping_behavior = behavior , convert_to_expression = True
213
+ ),
214
+ None ,
215
+ jslib = expr .jshead ([], interpolate_input ),
216
+ fullJS = True ,
217
+ debug = True ,
218
+ )
219
+ == expected
220
+ )
221
+
222
+
135
223
interpolate_bad_parameters = [
136
224
("$(fooz)" ),
137
225
("$(foo.barz)" ),
0 commit comments