Yamlenv
=======

|Build Status| |PyPi package|

Interpolate YaML files with environmental variables and other YaML
files.

Given a YaML string like:

.. code-block:: yaml

    a: ${A}
    b: 2

and an environmental variable ``$A`` with value ``hello``,
``yamlenv.load`` would return:

.. code-block:: python

    {
        a: 'hello',
        b: 2
    }

Including YAML literals as environment variables is also
supported - so if the environment variable ``$A`` was set to
``false``, ``yamlenv.load`` would return:

.. code-block:: python

    {
        a: False,
        b: 2
    }


Default values are supported:

.. code-block:: python

    yamlenv.load('''
        a: ${A:-hello}
        b: 2
    ''') == {
        'a': 'hello',
        'b': 2
    }

As in Bash, defaulting can be done with either `:-` (to not allow empty
defaults) or with `-` to allow empty values.

The environmental variable can be embedded in a larger string, too:

.. code-block:: python

    yamlenv.load('''
        a: foo ${A:-bar} baz
        b: 2
    ''') == {
        'a': 'foo bar baz',
        'b': 2
    }

More than one environmental variable can appear in a string:

.. code-block:: python

    yamlenv.load('''
        a: foo ${A:-bar} ${B:-baz}
        b: 2
    ''') == {
        'a': 'foo bar baz',
        'b': 2
    }

YaML files can include other YaML files, too. E.g. if ``b.yaml``
contains "2", then:

.. code-block:: python

    yamlenv.load('''
        a: 1
        b: !include b.yaml
    ''') == {
        'a': 1
        'b': 2
    }

The included YaML file can be as complex as necessary.

More examples are available in the tests.

.. |Build Status| image:: https://travis-ci.org/lbolla/yamlenv.svg?branch=master
   :target: https://travis-ci.org/lbolla/yamlenv

.. |PyPi package| image:: https://badge.fury.io/py/yamlenv.svg
    :target: https://badge.fury.io/py/yamlenv
