@@ -359,6 +359,24 @@ def check_required_modules(required_modules, verbose=True):
359
359
else :
360
360
return True
361
361
362
+
363
+ def _ordered_dict_collapse_dups (pair_list ):
364
+ to_ret = OrderedDict ()
365
+ for key , value in pair_list :
366
+ if key in to_ret :
367
+ if isinstance (to_ret [key ], dict ):
368
+ to_ret [key ].update (value )
369
+ elif isinstance (to_ret [key ], list ):
370
+ to_ret [key ].extend (value )
371
+ else :
372
+ raise ValueError (
373
+ "Key %s found twice and is not mergeable" % key
374
+ )
375
+ else :
376
+ to_ret [key ] = value
377
+ return to_ret
378
+
379
+
362
380
def json_file_to_dict (fname ):
363
381
""" Read a JSON file and return its Python representation, transforming all
364
382
the strings from Unicode to ASCII. The order of keys in the JSON file is
@@ -368,11 +386,13 @@ def json_file_to_dict(fname):
368
386
fname - the name of the file to parse
369
387
"""
370
388
try :
371
- with io .open (fname , encoding = 'ascii' ,
372
- errors = 'ignore' ) as file_obj :
373
- return json .load (file_obj , object_pairs_hook = OrderedDict )
374
- except (ValueError , IOError ):
375
- sys .stderr .write ("Error parsing '%s':\n " % fname )
389
+ with io .open (fname , encoding = 'ascii' ,
390
+ errors = 'ignore' ) as file_obj :
391
+ return json .load (
392
+ file_obj , object_pairs_hook = _ordered_dict_collapse_dups
393
+ )
394
+ except (ValueError , IOError ) as e :
395
+ sys .stderr .write ("Error parsing '%s': %s\n " % (fname , e ))
376
396
raise
377
397
378
398
# Wowza, double closure
0 commit comments