-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdictdiffer.py
40 lines (34 loc) · 1.45 KB
/
dictdiffer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class DictDiffer(object):
"""
Copyright (c) 2013, Hugh Brown.
https://github.com/hughdbrown/dictdiffer
MIT LICENSE
Calculate the difference between two dictionaries as:
(1) items added
(2) items removed
(3) keys same in both but changed values
(4) keys same in both and unchanged values
"""
def __init__(self, current_dict, past_dict):
self.current_dict, self.past_dict = current_dict, past_dict
self.current_keys, self.past_keys = set(current_dict.keys()), set(past_dict.keys())
self.intersect = self.current_keys.intersection(self.past_keys)
def added(self):
""" Find keys that have been added """
return self.current_keys - self.intersect
def removed(self):
""" Find keys that have been removed """
return self.past_keys - self.intersect
def changed(self):
""" Find keys that have been changed """
return set(o for o in self.intersect
if self.past_dict[o] != self.current_dict[o])
def unchanged(self):
""" Find keys that are unchanged """
return set(o for o in self.intersect
if self.past_dict[o] == self.current_dict[o])
def new_or_changed(self):
""" Find keys that are new or changed """
# return set(k for k, v in self.current_dict.items()
# if k not in self.past_keys or v != self.past_dict[k])
return self.added().union(self.changed())