File tree Expand file tree Collapse file tree 2 files changed +27
-0
lines changed
Expand file tree Collapse file tree 2 files changed +27
-0
lines changed Original file line number Diff line number Diff line change 55
66 :license: MIT, see LICENSE for more details.
77"""
8+ import collections
89import datetime
910import re
1011import time
@@ -57,6 +58,23 @@ def to_dict(self):
5758 for key , val in self .items ()}
5859
5960
61+ def dict_merge (dct1 , dct2 ):
62+ """Recursively merges dct2 and dct1, ideal for merging objectFilter together.
63+
64+ :param dct1: A dictionary
65+ :param dct2: A dictionary
66+ :return: dct1 + dct2
67+ """
68+
69+ dct = dct1 .copy ()
70+ for k , _ in dct2 .items ():
71+ if (k in dct1 and isinstance (dct1 [k ], dict ) and isinstance (dct2 [k ], collections .Mapping )):
72+ dct [k ] = dict_merge (dct1 [k ], dct2 [k ])
73+ else :
74+ dct [k ] = dct2 [k ]
75+ return dct
76+
77+
6078def query_filter (query ):
6179 """Translate a query-style string to a 'filter'.
6280
Original file line number Diff line number Diff line change @@ -79,6 +79,15 @@ def test_timezone(self):
7979 self .assertEqual (datetime .timedelta (0 ), time .dst ())
8080 self .assertEqual (datetime .timedelta (0 ), time .utcoffset ())
8181
82+ def test_dict_merge (self ):
83+ filter1 = {"virtualGuests" : {"hostname" : {"operation" : "etst" }}}
84+ filter2 = {"virtualGuests" : {"id" : {"operation" : "orderBy" , "options" : [{"name" : "sort" , "value" : ["DESC" ]}]}}}
85+ result = SoftLayer .utils .dict_merge (filter1 , filter2 )
86+
87+ self .assertEqual (result ['virtualGuests' ]['id' ]['operation' ], 'orderBy' )
88+ self .assertNotIn ('id' , filter1 ['virtualGuests' ])
89+ self .assertEqual (result ['virtualGuests' ]['hostname' ]['operation' ], 'etst' )
90+
8291
8392class TestNestedDict (testing .TestCase ):
8493
You can’t perform that action at this time.
0 commit comments