~smoser/ubuntu/vivid/cloud-init/2to3

« back to all changes in this revision

Viewing changes to cloudinit/mergers/m_dict.py

  • Committer: Package Import Robot
  • Author(s): Scott Moser
  • Date: 2013-05-10 17:53:49 UTC
  • Revision ID: package-import@ubuntu.com-20130510175349-okyom2ee5kguk4xb
* New upstream snapshot.
  * catch up with upstream, which is hopefully 0.7.2
  * straighten out the merging routines
  * fix a bug in Maas datasource

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# vi: ts=4 expandtab
 
2
#
 
3
#    Copyright (C) 2012 Yahoo! Inc.
 
4
#
 
5
#    Author: Joshua Harlow <harlowja@yahoo-inc.com>
 
6
#
 
7
#    This program is free software: you can redistribute it and/or modify
 
8
#    it under the terms of the GNU General Public License version 3, as
 
9
#    published by the Free Software Foundation.
 
10
#
 
11
#    This program is distributed in the hope that it will be useful,
 
12
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
13
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
14
#    GNU General Public License for more details.
 
15
#
 
16
#    You should have received a copy of the GNU General Public License
 
17
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
18
 
 
19
 
 
20
class Merger(object):
 
21
    def __init__(self, merger, opts):
 
22
        self._merger = merger
 
23
        self._overwrite = 'overwrite' in opts
 
24
 
 
25
    # This merging algorithm will attempt to merge with
 
26
    # another dictionary, on encountering any other type of object
 
27
    # it will not merge with said object, but will instead return
 
28
    # the original value
 
29
    #
 
30
    # On encountering a dictionary, it will create a new dictionary
 
31
    # composed of the original and the one to merge with, if 'overwrite'
 
32
    # is enabled then keys that exist in the original will be overwritten
 
33
    # by keys in the one to merge with (and associated values). Otherwise
 
34
    # if not in overwrite mode the 2 conflicting keys themselves will
 
35
    # be merged.
 
36
    def _on_dict(self, value, merge_with):
 
37
        if not isinstance(merge_with, (dict)):
 
38
            return value
 
39
        merged = dict(value)
 
40
        for (k, v) in merge_with.items():
 
41
            if k in merged:
 
42
                if not self._overwrite:
 
43
                    merged[k] = self._merger.merge(merged[k], v)
 
44
                else:
 
45
                    merged[k] = v
 
46
            else:
 
47
                merged[k] = v
 
48
        return merged