Simple hierarchical configuration for Python packages.
Branch: master
Clone or download
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
birch read-non-existent-files bugfix Jun 26, 2018
tests
.coveragerc full test coverage Feb 9, 2018
.gitattributes first commit Feb 8, 2018
.gitignore gitignore added and indexed cleaned Feb 11, 2018
.travis.yml upgrading pip and pytest to solve pytest3.6 version conflicts in travis Jan 29, 2019
LICENSE first commit Feb 8, 2018
MANIFEST.in first commit Feb 8, 2018
Pipfile
README.rst updated README 5 Oct 17, 2018
birch.png Add files via upload Feb 11, 2018
mit_license_badge.svg Add files via upload Jun 8, 2018
pytest.ini
setup.cfg removed incurrent bdist flag from setup.cfg Dec 7, 2018
setup.py added python 3.7 trove classifier to setup.py Oct 17, 2018
versioneer.py first commit Feb 8, 2018

README.rst

birch birch_icon

PyPI-Status PyPI-Versions Build-Status Codecov LICENCE

Simple hierarchical configuration for Python packages.

from birch import Birch
cfg = Birch('mypackage')
# read using a single API both the MYPACKAGE_SERVER_HOSTNAME environment variable
# and ~/.mypackage/cfg.json containing {'server': {'port': 55}}
connect(cfg['SERVER__HOSTNAME'], cfg['server']['port'])

1   Installation

pip install birch

2   Features

3   Use

3.1   Basic use

birch provides an easy way to read simple hierarchical configurations for your Python package or application from both environment variables and configuration files.

birch uses namespaces to manage configuration values. The access to each namespace is done via a Birch object initialized with that namespace. Though written with a specific use case in mind, where a single package uses a single namespace to manage its configuration, any number of namespaces can be used in a single context. For example:

from birch import Birch
zubat_cfg = Birch('zubat')
golbat_cfg = Birch('golbat')

Each namespace encompasses all values set by either environment variables starting with <uppercase_namespace>_, or defined within cfg files (of a supported format) located in a set of pre-configured directories; this set defaults to the ~/.config/<namespace> (as par the XDG Base Directory Specification) and the ~/.<namespace> directories.

For example, the zubat namespace encompasses environment variables such as ZUBAT_HOSTNAME and ZUBAT__PORT, and all mappings in one of the files ~/.config/.zubat/cfg.json or ~/.zubat/cfg.json (if such a file exists).

Once defined in such a way, the Birch object can be used to access the values of mappings of both types (with or without the namespace suffix; casing is also ignored). For example:

>>> os.environ['ZUBAT_SERVER_HOST'] = 'www.zubat.com'
>>> os.environ['ZUBAT_SERVER_PORT'] = '87'
>>> from birch import Birch
>>> zubat_cfg = Birch('zubat')
>>>> zubat_cfg['ZUBAT_SERVER_HOST']
'www.zubat.com'
>>> zubat_cfg['SERVER_PORT']
'87'
>>> zubat_cfg['server_port']
'87'

3.2   Hierarchical configuration

birch supports a simple hierarchy between configuration mappings. Hierarchy is either expressed explicitly in configuration files as nested object/entries (in the case of json and YAML files), or using __ (two underscore characters) in the configuration key - both in configuration files and environment variables. Thus, the ZUBAT__SERVER__PORT environment variable is equivalent to both {'server': {'port': 55}} and {'server__PORT': 55} mappings given in a ~/.zubat/cfg.json file, for example. Casing is ignored on all levels.

As such, hierarchical mappings can be accessed either using __ to indicate a hierarchical path, or using dict-like item access:

>>> os.environ['ZUBAT__SERVER__HOST'] = 'www.zubat.com'
>>> from birch import Birch
>>> zubat_cfg = Birch('zubat')
>>>> zubat_cfg['SERVER__HOST']
'www.zubat.com'
>>>> zubat_cfg['server']['HOST']
'www.zubat.com'
>>>> zubat_cfg['SERVER']['host']
'www.zubat.com'

Note that this is also true for non-hierarchical configuration file mappings, so {'server__port': 55}, even when given in this form in a configuration file, can be accessed using both zubat_cfg['SERVER__PORT'] and zubat_cfg['SERVER']['PORT'] (casing is still ignored on all levels).

3.3   Resolution order

A namespace is always loaded with matching environment variables after the configuration file has been loaded, and corresponding mappings will thus override their file-originating counterparts; e.g. the ZUBAT__SERVER__PORT environment variable will overwrite the value of the mapping {'server': {'port': 55}} given in a ~/.zubat/cfg.json file.

The lookup order of different files, while deterministic, is undefined and not part of the API. Thus, even with the load_all option set (see the Configuring birch section), cfg files with different file extensions can not be relied upon to provide private-vs-shared configuration functionality, or other such configuration modes.

3.4   Configuring birch

3.4.1   Configuration directories

By default birch looks for files only in the ~/.config/<namespace> and ~/.<namespace> directories. You can set a different set of directories to read by populating the directories constructor parameter with a different directory path, or a list of paths.

Similarly, be default birch reads into the configuration tree only the first compliant file encountered during a lookup in all pre-configured directories; to instead load hierarchical configurations from all such files instead, the load_all constructor parameter can be set to True. Again, load order is undefined, and thus so is the resulting hierarchical configuration.

3.4.2   File formats

By default, birch will only try to read cfg.json files. To dictate a different set of supported formats, populate the supported_formats constructor parameter with the desired formats.

For example, Birch('zubat', supported_formats=['json', 'yaml']) will read both cfg.json and cfg.yaml files, while Birch('golbat', supported_formats='yaml') will ony read cfg.yaml (and cfg.yml) files.

Currently supported formats are:

  • JSON - Looks for cfg.json files.
  • YAML - Looks for cfg.yaml and cfg.yml files.

4   Contributing

Package author and current maintainer is Shay Palachy (shay.palachy@gmail.com); You are more than welcome to approach him for help. Contributions are very welcomed.

4.1   Installing for development

Clone:

git clone git@github.com:shaypal5/birch.git

Install in development mode, including test dependencies:

cd birch
pip install -e '.[test]'

4.2   Running the tests

To run the tests use:

cd birch
pytest

4.3   Adding documentation

The project is documented using the numpy docstring conventions, which were chosen as they are perhaps the most widely-spread conventions that are both supported by common tools such as Sphinx and result in human-readable docstrings. When documenting code you add to this project, follow these conventions.

Additionally, if you update this README.rst file, use python setup.py checkdocs to validate it compiles.

5   Credits

Created by Shay Palachy (shay.palachy@gmail.com).