##// END OF EJS Templates
mercurial: implement diff and join for dicts...
Siddharth Agarwal -
r18820:a45e44d7 default
parent child Browse files
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