33from copy import deepcopy
44
55
6- def merge_config (template , config , list_identifiers = None ):
6+ def merge_config (
7+ template , config , list_identifiers = None , list_handling = 'append_at_end'
8+ ):
79 """
810 Merges ``config`` on top of ``template``.
911
@@ -24,15 +26,17 @@ def merge_config(template, config, list_identifiers=None):
2426 for key , value in config .items ():
2527 if isinstance (value , dict ):
2628 node = result .get (key , OrderedDict ())
27- result [key ] = merge_config (node , value )
29+ result [key ] = merge_config (node , value , list_handling = list_handling )
2830 elif isinstance (value , list ) and isinstance (result .get (key ), list ):
29- result [key ] = merge_list (result [key ], value , list_identifiers )
31+ result [key ] = merge_list (
32+ result [key ], value , list_identifiers , list_handling
33+ )
3034 else :
3135 result [key ] = value
3236 return result
3337
3438
35- def merge_list (list1 , list2 , identifiers = None ):
39+ def merge_list (list1 , list2 , identifiers = None , list_handling = 'append_at_end' ):
3640 """
3741 Merges ``list2`` on top of ``list1``.
3842
@@ -47,6 +51,8 @@ def merge_list(list1, list2, identifiers=None):
4751 :param identifiers: ``list`` or ``None``
4852 :returns: merged ``list``
4953 """
54+ if list_handling == 'override' :
55+ return list2
5056 identifiers = identifiers or []
5157 dict_map = {'list1' : OrderedDict (), 'list2' : OrderedDict ()}
5258 counter = 1
@@ -74,7 +80,14 @@ def merge_list(list1, list2, identifiers=None):
7480 key = tuple (key )
7581 container [key ] = deepcopy (el )
7682 counter += 1
77- merged = merge_config (dict_map ['list1' ], dict_map ['list2' ])
83+ if list_handling == 'insert_at_beginning' :
84+ merged = merge_config (
85+ dict_map ['list2' ], dict_map ['list1' ], list_handling = list_handling
86+ )
87+ else :
88+ merged = merge_config (
89+ dict_map ['list1' ], dict_map ['list2' ], list_handling = list_handling
90+ )
7891 return list (merged .values ())
7992
8093
0 commit comments