There’s definitely a case to be made for automatically and efficiently applying environment variables or another set of replacements into a YAML-based config or set of instructions on load. This example uses PyYAML. We’ll use Python’s built-in string templating to replace tokens like “$NAME” with values from a dictionary. It will fail, as it should, if the name is not in the given dictionary.
import string
import yaml
def load_yaml(f, context):
def string_constructor(loader, node):
t = string.Template(node.value)
value = t.substitute(context)
return value
l = yaml.SafeLoader
l.add_constructor('tag:yaml.org,2002:str', string_constructor)
token_re = string.Template.pattern
l.add_implicit_resolver('tag:yaml.org,2002:str', token_re, None)
x = yaml.load(f, Loader=l)
return x
y = """\
aa: bb
cc: dd $EE ff
"""
context = {
'EE': '123',
}
d = waw.utility.load_yaml(y, context)
print(d)
Output:
{'aa': 'bb', 'cc': 'dd 123 ff'}