mercurial/dicthelpers.py
author Siddharth Agarwal <sid0@fb.com>
Fri, 29 Mar 2013 15:23:19 -0700
changeset 18846 860d36b763ae
parent 18820 a45e44d76c81
child 18847 40c679748fa9
permissions -rw-r--r--
dicthelpers: add docstrings for diff and join
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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)