Source code for cleopy.editconfigfile
"""
Copyright (c) 2025 MPI-M, Clara Bayley
----- CLEO -----
File: editconfigfile.py
Project: cleopy
Created Date: Wednesday 17th January 2024
Author: Clara Bayley (CB)
Additional Contributors:
-----
License: BSD 3-Clause "New" or "Revised" License
https://opensource.org/licenses/BSD-3-Clause
-----
File Description:
"""
from ruamel.yaml import YAML
[docs]
def update_param(node, param, new_value):
"""Function to recursively searches for 'param' key in YAML node
and updates it's value to with 'new_value' when found"""
if isinstance(node, dict):
if param in node:
node[param] = new_value # update value
return True
else:
for key, val in node.items():
is_success = update_param(val, param, new_value)
if is_success:
return True
elif isinstance(node, list):
for item in node:
is_success = update_param(item, param, new_value)
if is_success:
return True
return False
[docs]
def edit_config_params(filename, params2change):
"""rewrites config YAML file with key,value pairs listed in params2change updated to new values
whilst preserving original YAML file's formatting and comments etc."""
yaml = YAML()
# Load the YAML file
with open(filename, "r") as file:
data = yaml.load(file)
# Update the parameters from the YAML file
for param, new_value in params2change.items():
is_success = update_param(data, param, new_value)
if not is_success:
errmsg = param + " could not be updated to new value: " + str(new_value)
raise ValueError(errmsg)
# Overwrite the YAML file
with open(filename, "w") as file:
yaml.dump(data, file)