49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
# vi: ts=4 expandtab
|
|
#
|
|
# Copyright (C) 2012 Yahoo! Inc.
|
|
#
|
|
# Author: Joshua Harlow <harlowja@yahoo-inc.com>
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License version 3, as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
class Merger(object):
|
|
def __init__(self, merger, opts):
|
|
self._merger = merger
|
|
self._overwrite = 'overwrite' in opts
|
|
|
|
# This merging algorithm will attempt to merge with
|
|
# another dictionary, on encountering any other type of object
|
|
# it will not merge with said object, but will instead return
|
|
# the original value
|
|
#
|
|
# On encountering a dictionary, it will create a new dictionary
|
|
# composed of the original and the one to merge with, if 'overwrite'
|
|
# is enabled then keys that exist in the original will be overwritten
|
|
# by keys in the one to merge with (and associated values). Otherwise
|
|
# if not in overwrite mode the 2 conflicting keys themselves will
|
|
# be merged.
|
|
def _on_dict(self, value, merge_with):
|
|
if not isinstance(merge_with, (dict)):
|
|
return value
|
|
merged = dict(value)
|
|
for (k, v) in merge_with.items():
|
|
if k in merged:
|
|
if not self._overwrite:
|
|
merged[k] = self._merger.merge(merged[k], v)
|
|
else:
|
|
merged[k] = v
|
|
else:
|
|
merged[k] = v
|
|
return merged
|