Skip to content

Multi-file Configurations for Python Applications

License

Notifications You must be signed in to change notification settings

chomechome/granula

Repository files navigation

Granula: Multi-file Configurations for Python Applications

Package version Package license Python versions TravisCI status Code coverage

Granula is a tool that aims to help maintain multi-file configurations for Python applications (with environments and more).

Installation

$ pipenv install granula

or just use pip (though you should definitely take a look at pipenv)

🌈🌈🌈

Features

  • Gathers configurations from multiple files or directories.
  • Supports widely used file formats (YAML, JSON).
  • Offers a small DSL that allows to load environment variables into config files.
  • Manages different configuration environments (e.g. testing, production).

Usage

Create a config object from a directory with multiple configuration files:

>> import granula
>> config = granula.from_directory('examples/multi-file/settings')
>> config
Config({'name': 'Darth Vader', ...})
>> config.name
'Darth Vader'
>> config.family
Config({'fiancee': 'Padme Amidala', 'children': ['Luke Skywalker', 'Leia Organa']})

Files are parsed in lexicographic order. The values specified in the preceding files can be overwritten in the succeeding files.

Do the same in a recursive manner:

>> config = granula.from_directory(..., recursive=True)

Match YAML files using filename pattern:

>> config = granula.from_directory(..., pattern=granula.Extension('yaml'))

Do the same with a shell-style wildcard pattern:

>> config = granula.from_directory(..., pattern=granula.Wildcard('*.yaml'))

Match configuration files for different environments:

>> directory = 'examples/environments/settings'
>> testing = granula.from_directory(directory, pattern=granula.Environment('testing'))
>> production = granula.from_directory(directory, pattern=granula.Environment('production'))

Combine patterns in arbitrary ways:

>> pattern = granula.All(granula.Environment('testing'), granula.Extension('yaml'))
>> config = granula.from_directory(..., pattern=pattern)

Load environment variables into config files using a DSL, for example, in YAML:

variable: ${env VARIABLE}

Do the same with a default value:

variable: ${env VARIABLE | val 10}