Implementation of key-value pair based configuration for Python applications.
Project description
Python configuration utilities
Implementation of key-value pair based configuration for Python applications.
Features:
- support for most common sources of application settings
- support for overriding settings in sequence
- support for nested structures and lists, using attribute notation
- strategy to use environment specific settings
This library is freely inspired by .NET Core Microsoft.Extensions.Configuration
namespace and its pleasant design (ref. MSDN documentation, Microsoft Extensions Configuration Deep Dive).
The main class is influenced by Luciano Ramalho`s example of JSON structure explorer using attribute notation, in his book Fluent Python.
Supported sources:
- yaml files
- json files
- ini files
- environmental variables
- dictionaries
- keys and values
Installation
pip install roconfiguration
Examples
YAML file and environmental variables
In this example, configuration will be comprised of anything inside a file
settings.yaml
and environmental variables. Settings are applied in order, so
environmental variables with matching name override values from the yaml
file.
from roconfiguration import Configuration
config = Configuration()
config.add_yaml_file("settings.yaml")
config.add_environmental_variables()
YAML file, optional file by environment
In this example, if an environmental variable with name APP_ENVIRONMENT
and
value dev
exists, and a configuration file with name settings.dev.yaml
is
present, it is read to override values configured in settings.yaml
file.
import os
from roconfiguration import Configuration
environment_name = os.environ["APP_ENVIRONMENT"]
config = Configuration()
config.add_yaml_file("settings.yaml")
config.add_yaml_file(f"settings.{environment_name}.yaml", optional=True)
config.add_environmental_variables()
Filtering environmental variables by prefix
import os
from roconfiguration import Configuration
config = Configuration()
# will read only environmental variables
# starting with "APP_", case insensitively
config.add_environmental_variables("APP_")
Ini files
Ini files are parsed using the built-in configparser
module, therefore
support [DEFAULT]
section; all values are kept as strings.
from roconfiguration import Configuration
config = Configuration()
config.add_ini_file("settings.ini")
JSON files
JSON files are parsed using the built-in json
module.
from roconfiguration import Configuration
config = Configuration()
config.add_json_file("settings.json")
Dictionaries
from roconfiguration import Configuration
config = Configuration({"host": "localhost", "port": 8080})
config.add_map({"hello": "world", "example": [{"id": 1}, {"id": 2}]})
assert config.host == "localhost"
assert config.port == 8080
assert config.hello == "world"
assert config.example[0].id == 1
assert config.example[1].id == 2
Keys and values
from roconfiguration import Configuration
config = Configuration({"host": "localhost", "port": 8080})
config.add_value("port", 44555)
assert config.host == "localhost"
assert config.port == 44555
Overriding nested values
config = Configuration(
{
"a": {
"b": 1,
"c": 2,
"d": {
"e": 3,
"f": 4,
},
}
}
)
assert config.a.b == 1
assert config.a.d.e == 3
assert config.a.d.f == 4
config.add_value("a:d:e", 5)
assert config.a.d.e == 5
assert config.a.d.f == 4
Overriding nested values using env variables
config = Configuration(
{
"a": {
"b": 1,
"c": 2,
"d": {
"e": 3,
"f": 4,
},
}
}
)
assert config.a.b == 1
assert config.a.d.e == 3
assert config.a.d.f == 4
# NB: if an env variable such as:
# a:d:e=5
# or...
# a__d__e=5
#
# is defined, it overrides the value from the dictionary
config.add_environmental_variables()
assert config.a.d.e == 5
Overriding values in list items using env variables
config = Configuration(
{
"b2c": [
{"tenant": "1"},
{"tenant": "2"},
{"tenant": "3"},
]
}
)
config.add_value("b2c:1:tenant", "4")
assert config.b2c[0].tenant == "1"
assert config.b2c[1].tenant == "4"
assert config.b2c[2].tenant == "3"
Develop and run tests locally
pip install -r requirements.txt
# run tests using automatic discovery:
pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file roconfiguration-1.0.9.tar.gz
.
File metadata
- Download URL: roconfiguration-1.0.9.tar.gz
- Upload date:
- Size: 6.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 14c12a4ef90710d6b19bd13d79dab6f32516479380246469548f3eb297970136 |
|
MD5 | 0d701f86fa19253fa146b295c1fc7ec0 |
|
BLAKE2b-256 | f8f7e313b8b19061b8f2932a774a1b83252631e998080ad222c545e8afa75226 |
File details
Details for the file roconfiguration-1.0.9-py3-none-any.whl
.
File metadata
- Download URL: roconfiguration-1.0.9-py3-none-any.whl
- Upload date:
- Size: 6.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 8831f983437def35ecf0ee8c865c5822e7c980687043c6fc4ade896611539df4 |
|
MD5 | 9785ba5ecf50264a225dcb9dcf72f000 |
|
BLAKE2b-256 | 38de647adcf75a1b57290d02d204306a4a6e7f7209edfc752e50df4d73927b00 |