Mercurial > public > mercurial-scm > hg-stable
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 |
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) |