@@ -281,13 +281,15 @@ def get_working_commands():
281
281
while line :
282
282
string = string + include_file (line .strip (), entry ['input_dir' ])
283
283
line = fp .readline ()
284
-
284
+
285
285
try :
286
286
xml = ET .parse (BytesIO (bytes (string , 'utf-8' )))
287
287
except Exception as e :
288
288
print ("Failed to load interface definition file {0}" .format (f ))
289
289
print (e )
290
290
sys .exit (1 )
291
+
292
+ override_defaults (xml )
291
293
292
294
try :
293
295
relaxng_xml = ET .parse (entry ['schema_file' ])
@@ -343,9 +345,38 @@ def get_working_commands():
343
345
cmd ['cmd' ] = " " .join (cmd ['name' ])
344
346
return result
345
347
348
+ def override_defaults (xml ):
349
+ root = xml .getroot ()
350
+ defv = {}
351
+
352
+ xpath_str = f'//defaultValue'
353
+ xp = xml .xpath (xpath_str )
354
+
355
+ for element in xp :
356
+ ap = element .xpath ('ancestor::*[@name]' )
357
+ defv .setdefault ((ap [- 1 ].get ("name" ), str (ap [:- 1 ])), []).append (element )
358
+
359
+ for k , v in defv .items ():
360
+ if len (v ) > 1 :
361
+ override_element (v )
362
+
363
+ def override_element (l : list ):
364
+ if len (l ) < 2 :
365
+ return
366
+
367
+ # assemble list of leafNodes of overriding defaultValues, for later removal
368
+ parents = []
369
+ for el in l [1 :]:
370
+ parents .append (el .getparent ())
371
+
372
+ # replace element with final override
373
+ l [0 ].getparent ().replace (l [0 ], l [- 1 ])
346
374
375
+ # remove all but overridden element
376
+ for el in parents :
377
+ el .getparent ().remove (el )
347
378
348
379
if __name__ == "__main__" :
349
380
res = get_working_commands ()
350
381
print (json .dumps (res ))
351
- #print(res['cfgcmd'][0])
382
+ #print(res['cfgcmd'][0])
0 commit comments