Load YAML nested with Jinja2 in Python

computed-properties, dry, jinja2, python, pyyaml

Solution

First define an `Undefined` class and load yaml to get known values. Then load it again and render with known values.

#!/usr/bin/env python

import yaml
from jinja2 import Template, Undefined

str1 = '''var1: val1
var2: val2
var3: {{var1}}-{{var2}}.txt
'''

class NullUndefined(Undefined):
  def __getattr__(self, key):
    return ''

t = Template(str1, undefined=NullUndefined)
c = yaml.safe_load(t.render())

print t.render(c)

Run it:

$ ./test.py
var1: val1
var2: val2
var3: val1-val2.txt

Problem

I have a YAML file (`all.yaml`) that looks like: ``` ... var1: val1 var2: val2 var3: {{var1}}-{{var2}}.txt ... ``` If I load it in Python like this: ``` import yaml f = open('all.yaml') dataMap = yaml.safe_load(f) f.close() print(dataMap["var3"]) ``` the output is `{{var1}}-{{var2}}.txt` and not `val1-val2.txt`. Is it possible to replace the nested vars with the value? I tried to load it with: ``` import jinja2 templateLoader = jinja2.FileSystemLoader( searchpath="/path/to/dir" ) templateEnv = jinja2.Environment( loader=templateLoader ) TEMPLATE_FILE = "all.yaml" template = templateEnv.get_template( TEMPLATE_FILE ) ``` The exception is no longer thrown, now I am stuck and have to research how to proceed.

Original source

Related problems