Scout24 has moved away from using this application. Therefor this application is deprecated and the repository will be archived.
Merge YAML data from a directory, a list of files or a file glob. With a directory, the YAML files (*.yaml) are sorted alphabetically. The YAML files are expected to contain a complex key-value structure and merged with the following rules:
- lists get appended
- hashes get merged by key
- scalars (numbers, strings) are overwritten
- everything else will fail
The purpose is to allow several YAML files instead of a single YAML file. We use it to help our software read configuration data from an arbitrary amount of YAML files instead of a single YAML file.
Read the unit test to see some examples.
yamlreader is available with pip
:
pip install yamlreader
If you want to make changes or use e.g. fpm
for packaging this, you need to
prepare the development environment to make further steps.
git clone https://github.com/ImmobilienScout24/yamlreader.git cd yamlreader virtualenv venv source venv/bin/activate pip install pybuilder pyb install_dependencies
pyb verify
pyb cd target/dist/yamlreader-<VERSION> ./setup.py <whatever you want>
The package installs a command line script yamlreader
that can be used to
read one or many YAML files and dump the merge result as a YAML document.
Wherever you had been using the safe_load
function of
PyYAML to read a single YAML file you can use
the yamlreader.yaml_load
function as a replacement to read all *.yaml
files in a directory:
from yamlreader import yaml_load defaultconfig = { "loglevel" : "error", "some" : "value" } config = yaml_load("/etc/myapp", defaultconfig)
def yaml_load(source,defaultdata=None): """merge YAML data from files found in source Always returns a dict. The YAML files are expected to contain some kind of key:value structures, possibly deeply nested. When merging, lists are appended and dict keys are replaced. The YAML files are read with the yaml.safe_load function. source can be a file, a dir, a list/tuple of files or a string containing a glob expression (with ?*[]). For a dir all *.yaml files will be read in alphabetical order. defaultdata can be used to initialize the data. """