Show More
@@ -0,0 +1,35 b'' | |||||
|
1 | # dicthelpers.py - helper routines for Python dicts | |||
|
2 | # | |||
|
3 | # Copyright 2013 Facebook | |||
|
4 | # | |||
|
5 | # This software may be used and distributed according to the terms of the | |||
|
6 | # GNU General Public License version 2 or any later version. | |||
|
7 | ||||
|
8 | def _diffjoin(d1, d2, default, compare): | |||
|
9 | res = {} | |||
|
10 | if d1 is d2 and compare: | |||
|
11 | # same dict, so diff is empty | |||
|
12 | return res | |||
|
13 | ||||
|
14 | for k1, v1 in d1.iteritems(): | |||
|
15 | if k1 in d2: | |||
|
16 | v2 = d2[k1] | |||
|
17 | if not compare or v1 != v2: | |||
|
18 | res[k1] = (v1, v2) | |||
|
19 | else: | |||
|
20 | res[k1] = (v1, default) | |||
|
21 | ||||
|
22 | if d1 is d2: | |||
|
23 | return res | |||
|
24 | ||||
|
25 | for k2 in d2: | |||
|
26 | if k2 not in d1: | |||
|
27 | res[k2] = (default, d2[k2]) | |||
|
28 | ||||
|
29 | return res | |||
|
30 | ||||
|
31 | def diff(d1, d2, default=None): | |||
|
32 | return _diffjoin(d1, d2, default, True) | |||
|
33 | ||||
|
34 | def join(d1, d2, default=None): | |||
|
35 | return _diffjoin(d1, d2, default, False) |
@@ -0,0 +1,53 b'' | |||||
|
1 | from mercurial.dicthelpers import diff, join | |||
|
2 | import unittest | |||
|
3 | import silenttestrunner | |||
|
4 | ||||
|
5 | class testdicthelpers(unittest.TestCase): | |||
|
6 | def test_dicthelpers(self): | |||
|
7 | # empty dicts | |||
|
8 | self.assertEqual(diff({}, {}), {}) | |||
|
9 | self.assertEqual(join({}, {}), {}) | |||
|
10 | ||||
|
11 | d1 = {} | |||
|
12 | d1['a'] = 'foo' | |||
|
13 | d1['b'] = 'bar' | |||
|
14 | d1['c'] = 'baz' | |||
|
15 | ||||
|
16 | # same identity | |||
|
17 | self.assertEqual(diff(d1, d1), {}) | |||
|
18 | self.assertEqual(join(d1, d1), {'a': ('foo', 'foo'), | |||
|
19 | 'b': ('bar', 'bar'), | |||
|
20 | 'c': ('baz', 'baz')}) | |||
|
21 | ||||
|
22 | # vs empty | |||
|
23 | self.assertEqual(diff(d1, {}), {'a': ('foo', None), | |||
|
24 | 'b': ('bar', None), | |||
|
25 | 'c': ('baz', None)}) | |||
|
26 | self.assertEqual(diff(d1, {}), {'a': ('foo', None), | |||
|
27 | 'b': ('bar', None), | |||
|
28 | 'c': ('baz', None)}) | |||
|
29 | ||||
|
30 | d2 = {} | |||
|
31 | d2['a'] = 'foo2' | |||
|
32 | d2['b'] = 'bar' | |||
|
33 | d2['d'] = 'quux' | |||
|
34 | ||||
|
35 | self.assertEqual(diff(d1, d2), {'a': ('foo', 'foo2'), | |||
|
36 | 'c': ('baz', None), | |||
|
37 | 'd': (None, 'quux')}) | |||
|
38 | self.assertEqual(join(d1, d2), {'a': ('foo', 'foo2'), | |||
|
39 | 'b': ('bar', 'bar'), | |||
|
40 | 'c': ('baz', None), | |||
|
41 | 'd': (None, 'quux')}) | |||
|
42 | ||||
|
43 | # with default argument | |||
|
44 | self.assertEqual(diff(d1, d2, 123), {'a': ('foo', 'foo2'), | |||
|
45 | 'c': ('baz', 123), | |||
|
46 | 'd': (123, 'quux')}) | |||
|
47 | self.assertEqual(join(d1, d2, 456), {'a': ('foo', 'foo2'), | |||
|
48 | 'b': ('bar', 'bar'), | |||
|
49 | 'c': ('baz', 456), | |||
|
50 | 'd': (456, 'quux')}) | |||
|
51 | ||||
|
52 | if __name__ == '__main__': | |||
|
53 | silenttestrunner.main(__name__) |
General Comments 0
You need to be logged in to leave comments.
Login now