Improve clarity of the recursive_dict_ helper functions & usage.

This commit is contained in:
voussoir 2018-08-11 18:19:55 -07:00
parent 3b3c690ae3
commit 53c86c30a1
2 changed files with 20 additions and 9 deletions

View file

@ -325,7 +325,17 @@ def read_filebytes(filepath, range_min=0, range_max=None, chunk_size=bytestring.
def recursive_dict_update(target, supply): def recursive_dict_update(target, supply):
''' '''
Update target using supply, but when the value is a dictionary update the Update target using supply, but when the value is a dictionary update the
insides instead of replacing the dictionary itself. insides instead of replacing the dictionary itself. This prevents keys that
exist in the target but don't exist in the supply from being erased.
Note that we are modifying target in place.
eg:
target = {'hi': 'ho', 'neighbor': {'name': 'Wilson'}}
supply = {'neighbor': {'behind': 'fence'}}
result: {'hi': 'ho', 'neighbor': {'name': 'Wilson', 'behind': 'fence'}}
whereas a regular dict.update would have produced:
{'hi': 'ho', 'neighbor': {'behind': 'fence'}}
''' '''
for (key, value) in supply.items(): for (key, value) in supply.items():
if isinstance(value, dict): if isinstance(value, dict):
@ -333,7 +343,7 @@ def recursive_dict_update(target, supply):
if existing is None: if existing is None:
target[key] = value target[key] = value
else: else:
recursive_dict_update(existing, value) recursive_dict_update(target=existing, supply=value)
else: else:
target[key] = value target[key] = value
@ -343,11 +353,7 @@ def recursive_dict_keys(d):
all other dictionaries that appear as values within. The subkeys will use \\ all other dictionaries that appear as values within. The subkeys will use \\
to indicate their lineage. to indicate their lineage.
{ {'hi': {'ho': 'neighbor'}}
'hi': {
'ho': 'neighbor'
}
}
returns returns

View file

@ -1530,9 +1530,14 @@ class PhotoDB(
if user_config_exists: if user_config_exists:
with open(self.config_filepath.absolute_path, 'r', encoding='utf-8') as handle: with open(self.config_filepath.absolute_path, 'r', encoding='utf-8') as handle:
user_config = json.load(handle) user_config = json.load(handle)
my_keys = helpers.recursive_dict_keys(config)
# If the default config has been updated and contains new keys,
# then they will not yet exist in the user's config, and we should
# save the file after giving it those default values.
default_keys = helpers.recursive_dict_keys(config)
stored_keys = helpers.recursive_dict_keys(user_config) stored_keys = helpers.recursive_dict_keys(user_config)
needs_dump = not my_keys.issubset(stored_keys) needs_dump = default_keys > stored_keys
helpers.recursive_dict_update(target=config, supply=user_config) helpers.recursive_dict_update(target=config, supply=user_config)
else: else:
needs_dump = True needs_dump = True