annotate mercurial/dicthelpers.py @ 18846:860d36b763ae

dicthelpers: add docstrings for diff and join
author Siddharth Agarwal <sid0@fb.com>
date Fri, 29 Mar 2013 15:23:19 -0700
parents a45e44d76c81
children 40c679748fa9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18820
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
1 # dicthelpers.py - helper routines for Python dicts
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
2 #
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
3 # Copyright 2013 Facebook
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
4 #
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
5 # This software may be used and distributed according to the terms of the
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
6 # GNU General Public License version 2 or any later version.
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
7
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
8 def _diffjoin(d1, d2, default, compare):
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
9 res = {}
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
10 if d1 is d2 and compare:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
11 # same dict, so diff is empty
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
12 return res
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
13
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
14 for k1, v1 in d1.iteritems():
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
15 if k1 in d2:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
16 v2 = d2[k1]
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
17 if not compare or v1 != v2:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
18 res[k1] = (v1, v2)
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
19 else:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
20 res[k1] = (v1, default)
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
21
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
22 if d1 is d2:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
23 return res
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
24
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
25 for k2 in d2:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
26 if k2 not in d1:
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
27 res[k2] = (default, d2[k2])
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
28
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
29 return res
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
30
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
31 def diff(d1, d2, default=None):
18846
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
32 '''Return all key-value pairs that are different between d1 and d2.
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
33
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
34 This includes keys that are present in one dict but not the other, and
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
35 keys whose values are different. The return value is a dict with values
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
36 being pairs of values from d1 and d2 respectively, and missing values
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
37 represented as default.'''
18820
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
38 return _diffjoin(d1, d2, default, True)
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
39
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
40 def join(d1, d2, default=None):
18846
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
41 '''Return all key-value pairs from both d1 and d2.
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
42
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
43 This is akin to an outer join in relational algebra. The return value is a
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
44 dict with values being pairs of values from d1 and d2 respectively, and
860d36b763ae dicthelpers: add docstrings for diff and join
Siddharth Agarwal <sid0@fb.com>
parents: 18820
diff changeset
45 missing values represented as default.'''
18820
a45e44d76c81 mercurial: implement diff and join for dicts
Siddharth Agarwal <sid0@fb.com>
parents:
diff changeset
46 return _diffjoin(d1, d2, default, False)