Skip to content

Commit 53fc656

Browse files
Added a utility to merge objectFilters, #1459 1461
1 parent 2ba40f9 commit 53fc656

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

SoftLayer/utils.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
:license: MIT, see LICENSE for more details.
77
"""
8+
import collections
89
import datetime
910
import re
1011
import time
@@ -57,6 +58,21 @@ def to_dict(self):
5758
for key, val in self.items()}
5859

5960

61+
def dict_merge(dct1, dct2):
62+
"""Recursively merges dct2 into dct1, ideal for merging objectFilter together.
63+
64+
:param dct1: dict onto which the merge is executed
65+
:param dct2: dct merged into dct
66+
:return: None
67+
"""
68+
69+
for k, v in dct2.items():
70+
if (k in dct1 and isinstance(dct1[k], dict) and isinstance(dct2[k], collections.Mapping)):
71+
dict_merge(dct1[k], dct2[k])
72+
else:
73+
dct1[k] = dct2[k]
74+
75+
6076
def query_filter(query):
6177
"""Translate a query-style string to a 'filter'.
6278

tests/basic_tests.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,16 @@ 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+
SoftLayer.utils.dict_merge(filter1, filter2)
86+
87+
self.assertEqual(filter1['virtualGuests']['id']['operation'], 'orderBy')
88+
self.assertEqual(filter1['virtualGuests']['hostname']['operation'], 'etst')
89+
90+
91+
8292

8393
class TestNestedDict(testing.TestCase):
8494

0 commit comments

Comments
 (0)