37
37
]
38
38
39
39
Node = typing .TypedDict ('Node' , {
40
- 'map' : typing . NotRequired [ str | list [str ] ],
40
+ 'map' : str | list [str ],
41
41
'type' : AcceptedType ,
42
- 'array' : typing . NotRequired [ bool ] ,
43
- 'default' : typing .NotRequired [ typing . Any ] ,
44
- 'modifiers' : typing . NotRequired [ list [Modifier ] ],
45
- 'trim_start' : typing . NotRequired [ int ] ,
46
- 'trim_end' : typing . NotRequired [ int ] ,
47
- 'pick_until' : typing . NotRequired [ str ] ,
48
- '__fields' : typing . NotRequired [ dict [str , 'Node' ] ]
49
- })
42
+ 'array' : bool ,
43
+ 'default' : typing .Any ,
44
+ 'modifiers' : list [Modifier ],
45
+ 'trim_start' : int ,
46
+ 'trim_end' : int ,
47
+ 'pick_until' : str ,
48
+ '__fields' : dict [str , 'Node' ]
49
+ }, total = False )
50
50
51
51
Mapping = typing .TypedDict ('Mapping' , {
52
52
'array' : typing .NotRequired [bool ],
@@ -106,7 +106,7 @@ def check_types(node: Node, value: typing.Any, modifiers: list[Modifier]):
106
106
if node .get ('array' ) \
107
107
else value .__class__ .__name__
108
108
109
- vexpected = TYPE_MAPPING .get (node [ 'type' ] )
109
+ vexpected = TYPE_MAPPING .get (node . get ( 'type' , 'string' ) )
110
110
if actual == vexpected \
111
111
or (actual == 'int' and vexpected in ['number' , 'float' ]) \
112
112
or (actual == 'NoneType' and 'default_null' in modifiers ):
@@ -156,7 +156,13 @@ def get_initial_value(target: typing.Any, mapped_name: str, flat_obj: RawObject)
156
156
return initial_value
157
157
158
158
159
- def translate (target : T | tuple [T , int ], mapping : Mapping , acc : RawObject = {}, inherited_modifiers : list [Modifier ] | None = None , inherited_flat_obj : tuple [RawObject , RawObject ] | None = None ) -> T :
159
+ def translate (
160
+ target : T | tuple [T , int ],
161
+ mapping : Mapping , acc : RawObject = {},
162
+ inherited_modifiers : list [Modifier ] | None = None ,
163
+ inherited_flat_obj : tuple [RawObject , RawObject ] | None = None ,
164
+ substitute : dict [str , typing .Any ] = {}
165
+ ) -> T :
160
166
ret : RawObject = {}
161
167
flat_obj , flat_obj_arr = inherited_flat_obj or (
162
168
flatten (typing .cast (RawObject , target )),
@@ -178,6 +184,8 @@ def translate(target: T | tuple[T, int], mapping: Mapping, acc: RawObject = {},
178
184
mapped_name = node .get ('map' , original_name )
179
185
initial_value : typing .Any = None
180
186
187
+ var_name : str | None = None
188
+
181
189
modifiers = node .get ('modifiers' , root_modifiers )
182
190
if 'reverse' in modifiers :
183
191
mapped_name , original_name = original_name , mapped_name
@@ -198,16 +206,23 @@ def translate(target: T | tuple[T, int], mapping: Mapping, acc: RawObject = {},
198
206
elif mapped_name in flat_obj_arr and flat_obj_arr [mapped_name ] != None :
199
207
initial_value = flat_obj_arr .get (mapped_name )
200
208
break
209
+ elif mapped_name [:2 ] == "{{" :
210
+ var_name = mapped_name [2 :].replace (' ' , '' )[:- 2 ]
211
+ break
201
212
202
213
mapped_name = typing .cast (str , mapped_name )
203
214
original_name = typing .cast (str , original_name )
204
215
216
+ if var_name :
217
+ ret [original_name ] = substitute .get (var_name )
218
+ continue
219
+
205
220
if '__fields' in node :
206
221
if not node .get ('map' ):
207
- value = translate (typing .cast (typing .Any , target ), node , acc , modifiers )
222
+ value = translate (typing .cast (typing .Any , target ), node , acc , modifiers , substitute = substitute )
208
223
else :
209
224
child : typing .Any = initial_value or target [original_name ]
210
- value = translate (child , node , acc , modifiers , (flat_obj , flat_obj_arr ))
225
+ value = translate (child , node , acc , modifiers , (flat_obj , flat_obj_arr ), substitute = substitute )
211
226
if node .get ('array' ) and not isinstance (value , list ):
212
227
value = [value ]
213
228
@@ -231,7 +246,7 @@ def translate(target: T | tuple[T, int], mapping: Mapping, acc: RawObject = {},
231
246
raise ValueError ('illegal array' )
232
247
233
248
result = [
234
- translate ((e , idx ), mapping , acc , inherited_modifiers , (flat_obj , flat_obj_arr ))
249
+ translate ((e , idx ), mapping , acc , inherited_modifiers , (flat_obj , flat_obj_arr ), substitute = substitute )
235
250
for idx , e in enumerate (typing .cast (list [typing .Any ], target ))
236
251
]
237
252
0 commit comments