Move this config prep code into voussoirkit as configlayers.
This commit is contained in:
parent
9c96522cfc
commit
930960e22a
2 changed files with 6 additions and 63 deletions
|
@ -341,50 +341,6 @@ def read_filebytes(filepath, range_min=0, range_max=None, chunk_size=bytestring.
|
||||||
yield chunk
|
yield chunk
|
||||||
sent_amount += len(chunk)
|
sent_amount += len(chunk)
|
||||||
|
|
||||||
def recursive_dict_update(target, supply):
|
|
||||||
'''
|
|
||||||
Update target using supply, but when the value is a dictionary update the
|
|
||||||
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():
|
|
||||||
if isinstance(value, dict):
|
|
||||||
existing = target.get(key, None)
|
|
||||||
if existing is None:
|
|
||||||
target[key] = value
|
|
||||||
else:
|
|
||||||
recursive_dict_update(target=existing, supply=value)
|
|
||||||
else:
|
|
||||||
target[key] = value
|
|
||||||
|
|
||||||
def recursive_dict_keys(d):
|
|
||||||
'''
|
|
||||||
Given a dictionary, return a set containing all of its keys and the keys of
|
|
||||||
all other dictionaries that appear as values within. The subkeys will use \\
|
|
||||||
to indicate their lineage.
|
|
||||||
|
|
||||||
{'hi': {'ho': 'neighbor'}}
|
|
||||||
|
|
||||||
returns
|
|
||||||
|
|
||||||
{'hi', 'hi\\ho'}
|
|
||||||
'''
|
|
||||||
keys = set(d.keys())
|
|
||||||
for (key, value) in d.items():
|
|
||||||
if isinstance(value, dict):
|
|
||||||
subkeys = {f'{key}\\{subkey}' for subkey in recursive_dict_keys(value)}
|
|
||||||
keys.update(subkeys)
|
|
||||||
return keys
|
|
||||||
|
|
||||||
def remove_characters(text, characters):
|
def remove_characters(text, characters):
|
||||||
translator = {ord(c): None for c in characters}
|
translator = {ord(c): None for c in characters}
|
||||||
text = text.translate(translator)
|
text = text.translate(translator)
|
||||||
|
|
|
@ -10,6 +10,7 @@ import tempfile
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from voussoirkit import cacheclass
|
from voussoirkit import cacheclass
|
||||||
|
from voussoirkit import configlayers
|
||||||
from voussoirkit import expressionmatch
|
from voussoirkit import expressionmatch
|
||||||
from voussoirkit import pathclass
|
from voussoirkit import pathclass
|
||||||
from voussoirkit import ratelimiter
|
from voussoirkit import ratelimiter
|
||||||
|
@ -1621,27 +1622,13 @@ class PhotoDB(
|
||||||
yield thing
|
yield thing
|
||||||
|
|
||||||
def load_config(self):
|
def load_config(self):
|
||||||
config = copy.deepcopy(constants.DEFAULT_CONFIGURATION)
|
(config, needs_rewrite) = configlayers.load_file(
|
||||||
user_config_exists = self.config_filepath.is_file
|
filepath=self.config_filepath,
|
||||||
needs_dump = False
|
defaults=constants.DEFAULT_CONFIGURATION,
|
||||||
if user_config_exists:
|
)
|
||||||
with open(self.config_filepath.absolute_path, 'r', encoding='utf-8') as handle:
|
|
||||||
user_config = json.load(handle)
|
|
||||||
|
|
||||||
# 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)
|
|
||||||
needs_dump = default_keys > stored_keys
|
|
||||||
|
|
||||||
helpers.recursive_dict_update(target=config, supply=user_config)
|
|
||||||
else:
|
|
||||||
needs_dump = True
|
|
||||||
|
|
||||||
self.config = config
|
self.config = config
|
||||||
|
|
||||||
if needs_dump:
|
if needs_rewrite:
|
||||||
self.save_config()
|
self.save_config()
|
||||||
|
|
||||||
def save_config(self):
|
def save_config(self):
|
||||||
|
|
Loading…
Reference in a new issue