Skip to content

Commit 225a815

Browse files
Merge pull request #1468 from allmightyspiff/mergeFilter
Added a utility to merge objectFilters,
2 parents 2fe44f5 + 554cbbd commit 225a815

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

SoftLayer/utils.py

Lines changed: 18 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,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+
6078
def query_filter(query):
6179
"""Translate a query-style string to a 'filter'.
6280

tests/basic_tests.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff 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

8392
class TestNestedDict(testing.TestCase):
8493

0 commit comments

Comments
 (0)