Fixed an earlier merge error

This commit is contained in:
Gina Häußge 2015-10-26 09:11:44 +01:00
parent b4cb0dec87
commit 33306b6787
2 changed files with 22 additions and 22 deletions

View file

@ -825,7 +825,7 @@ class SettingsPlugin(OctoPrintPlugin):
# determine diff dict that contains minimal set of changes against the
# default settings - we only want to persist that, not everything
diff = octoprint.util.dict_diff(self.get_settings_defaults(), new_current)
diff = octoprint.util.dict_minimal_mergediff(self.get_settings_defaults(), new_current)
version = self.get_settings_version()
@ -955,7 +955,7 @@ class SettingsPlugin(OctoPrintPlugin):
# anything already in the settings will be removed from the persisted
# config, no need to duplicate it
defaults = self.get_settings_defaults()
diff = octoprint.util.dict_diff(defaults, config)
diff = octoprint.util.dict_minimal_mergediff(defaults, config)
if not diff:
# no diff to defaults, no need to have anything persisted

View file

@ -447,7 +447,7 @@ dict_clean = deprecated("dict_clean has been renamed to dict_sanitize",
includedoc="Replaced by :func:`dict_sanitize`")(dict_sanitize)
def dict_diff(a, b):
def dict_minimal_mergediff(source, target):
"""
Recursively calculates the minimal dict that would be needed to be deep merged with
a in order to produce the same result as deep merging a and b.
@ -456,55 +456,55 @@ def dict_diff(a, b):
>>> a = dict(foo=dict(a=1, b=2), bar=dict(c=3, d=4))
>>> b = dict(bar=dict(c=3, d=5), fnord=None)
>>> c = dict_diff(a, b)
>>> c = dict_minimal_mergediff(a, b)
>>> c == dict(bar=dict(d=5), fnord=None)
True
>>> dict_merge(a, c) == dict_merge(a, b)
True
Arguments:
a (dict): Source dictionary
b (dict): Dictionary to compare to source dictionary and derive diff for
source (dict): Source dictionary
target (dict): Dictionary to compare to source dictionary and derive diff for
Returns:
dict: The minimal dictionary to deep merge on a to get the same result
as deep merging b on a.
dict: The minimal dictionary to deep merge on ``source`` to get the same result
as deep merging ``target`` on ``source``.
"""
if not isinstance(a, dict) or not isinstance(b, dict):
raise ValueError("a and b must be dictionaries")
if not isinstance(source, dict) or not isinstance(target, dict):
raise ValueError("source and target must be dictionaries")
if a == b:
if source == target:
# shortcut: if both are equal, we return an empty dict as result
return dict()
from copy import deepcopy
all_keys = set(a.keys() + b.keys())
all_keys = set(source.keys() + target.keys())
result = dict()
for k in all_keys:
if k not in b:
# key not contained in b => not contained in result
if k not in target:
# key not contained in target => not contained in result
continue
if k in a:
if k in source:
# key is present in both dicts, we have to take a look at the value
value_a = a[k]
value_b = b[k]
value_source = source[k]
value_target = target[k]
if value_a != value_b:
if value_source != value_target:
# we only need to look further if the values are not equal
if isinstance(value_a, dict) and isinstance(value_b, dict):
if isinstance(value_source, dict) and isinstance(value_target, dict):
# both are dicts => deeper down it goes into the rabbit hole
result[k] = dict_diff(value_a, value_b)
result[k] = dict_minimal_mergediff(value_source, value_target)
else:
# new b wins over old a
result[k] = deepcopy(value_b)
result[k] = deepcopy(value_target)
else:
# key is new, add it
result[k] = deepcopy(b[k])
result[k] = deepcopy(target[k])
return result