Clean up config merging

This commit is contained in:
Kovid Goyal 2017-07-23 22:45:57 +05:30
parent e427fd1233
commit b36c3f3425
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C

View File

@ -274,32 +274,36 @@ defaults = Options(**defaults)
actions = frozenset(defaults.keymap.values()) actions = frozenset(defaults.keymap.values())
def update_dict(a, b): def merge_keymaps(defaults, newvals):
a.update(b) ans = defaults.copy()
return a for k, v in newvals.items():
if v in {'noop', 'no-op', 'no_op'}:
ans.pop(k, None)
continue
if v in actions:
ans[k] = v
return ans
def merge_dicts(vals, defaults): def merge_dicts(defaults, newvals):
return { ans = defaults.copy()
k: update_dict(v, vals.get(k, {})) ans.update(newvals)
if isinstance(v, dict) else vals.get(k, v) return ans
for k, v in defaults.items()
}
def merge_configs(ans, vals): def merge_configs(defaults, vals):
vals['keymap'] = { ans = {}
k: v for k, v in defaults.items():
for k, v in vals.get('keymap', {}).items() if v in actions if isinstance(v, dict):
} newvals = vals.get(k, {})
remove_keys = { if k == 'keymap':
k ans['keymap'] = merge_keymaps(v, newvals)
for k, v in vals.get('keymap', {}).items() elif k == 'send_text_map':
if v in ('noop', 'no-op', 'no_op') ans[k] = {m: merge_dicts(mm, newvals.get(m, {})) for m, mm in v.items()}
} else:
ans = merge_dicts(vals, ans) ans[k] = merge_dicts(v, newvals)
for k in remove_keys: else:
ans['keymap'].pop(k, None) ans[k] = vals.get(k, v)
return ans return ans