Simple dataclasses configuration management for Python with hocon/json/yaml/properties/env-vars/dict support.
Project description
Dataconf
Simple dataclasses configuration management for Python with hocon/json/yaml/properties/env-vars/dict/cli support.
Getting started
Requires at least Python 3.9.
# pypi
pip install dataconf
poetry add dataconf
# remote master
pip install --upgrade git+https://github.com/zifeo/dataconf.git
poetry add git+https://github.com/zifeo/dataconf.git
# local repo/dev
poetry install
pre-commit install
Usage
import os
from dataclasses import dataclass, field
from typing import List, Dict, Text, Union, Tuple
from dateutil.relativedelta import relativedelta
from datetime import datetime, timedelta
import dataconf
conf = """
str_name = test
str_name = ${?HOME}
dash-to-underscore = true
float_num = 2.2
iso_datetime = "2000-01-01T20:00:00"
iso_duration = "P123DT4H5M6S"
variable_length_tuple_data = [
1
2
3
]
tuple_data = [
a
P1D
]
# this is a comment
list_data = [
a
b
]
nested {
a = test
b : 1
}
nested_list = [
{
a = test1
b : 2.5
}
]
duration = 2s
union = 1
people {
name = Thailand
}
zone {
area_code = 42
}
"""
class AbstractBaseClass:
pass
@dataclass
class Person(AbstractBaseClass):
name: Text
@dataclass
class Zone(AbstractBaseClass):
area_code: int
@dataclass
class Nested:
a: Text
b: float
@dataclass
class Config:
str_name: Text
dash_to_underscore: bool
float_num: float
iso_datetime: datetime
iso_duration: timedelta
variable_length_tuple_data: Tuple[int, ...]
tuple_data: Tuple[Text, timedelta]
list_data: List[Text]
nested: Nested
nested_list: List[Nested]
duration: relativedelta
union: Union[Text, int]
people: AbstractBaseClass
zone: AbstractBaseClass
default: Text = 'hello'
default_factory: Dict[Text, Text] = field(default_factory=dict)
print(dataconf.string(conf, Config))
# Config(
# str_name='/users/root/',
# dash_to_underscore=True,
# float_num=2.2,
# iso_datetime=datetime.datetime(2000, 1, 1, 20, 0),
# iso_duration=datetime.timedelta(days=123, seconds=14706),
# variable_length_tuple_data=(1,2,3),
# tuple_data=('a', datetime.timedelta(days=1)),
# list_data=['a', 'b'],
# nested=Nested(a='test', b=1),
# nested_list=[Nested(a='test1', b=2.5)],
# duration=relativedelta(seconds=+2),
# union=1,
# people=Person(name='Thailand'),
# zone=Zone(area_code=42),
# default='hello',
# default_factory={}
# )
@dataclass
class Example:
hello: str
world: str
foo: List[str]
os.environ['DC_WORLD'] = 'monde'
print(
dataconf
.multi
.url('https://raw.githubusercontent.com/zifeo/dataconf/main/confs/simple.hocon')
.env('DC')
.on(Example)
)
# Example(hello='bonjour',world='monde')
API
import dataconf
conf = dataconf.string('{ name: Test }', Config)
conf = dataconf.string('name:\n\tvalue: Test', Config, loader=dataconf.YAML) # dataconf.HOCON by default
conf = dataconf.env('PREFIX_', Config)
conf = dataconf.dict({'name': 'Test'}, Config)
conf = dataconf.url('https://raw.githubusercontent.com/zifeo/dataconf/master/confs/test.hocon', Config) # hocon, json, yaml, properties
conf = dataconf.file('confs/test.hocon', Config) # hocon, json, yaml, properties
conf = dataconf.cli(sys.argv, Config)
# Aggregation
conf = dataconf.multi.string(...).env(...).url(...).file(...).dict(...).cli(...).on(Config)
# Same api as Python json/yaml packages (e.g. `load`, `loads`, `dump`, `dumps`)
conf = dataconf.load('confs/test.hocon', Config) # hocon, json, yaml, properties
conf = dataconf.load('confs/test.yaml', Config, loader=dataconf.YAML) # dataconf.HOCON by default
dataconf.dump('confs/test.hocon', conf, out='hocon')
dataconf.dump('confs/test.json', conf, out='json')
dataconf.dump('confs/test.yaml', conf, out='yaml')
dataconf.dump('confs/test.properties', conf, out='properties')
For full HOCON capabilities see here.
Parse env vars
PREFIX_VAR=a
PREFIX_VAR_NAME=b
PREFIX_TEST__NAME=c
PREFIX_LS_0=d
PREFIX_LS_1=e
PREFIX_LSLS_0_0=f
PREFIX_LSOB_0__NAME=g
PREFIX_NESTED_="{ name: Test }"
PREFIX_SUB_="{ value: ${PREFIX_VAR} }"
is equivalent to
{
var = a
var_name = b
test {
name = c
}
ls = [
d
e
]
lsls = [
[
f
]
]
lsob = [
{
name = g
}
]
nested {
# parse nested config by suffixing env var with `_`
name: Test
}
sub {
# will have value "a" at parsing, useful for aliases
value = ${PREFIX_VAR}
}
}
Note that when using .env
source, the strict mode is disabled and value might
be casted.
Parse CLI arguments
Same as env vars parse (dashes are converted to underscore, e.g. TEST_A
→
--test-a
).
CLI usage
Can be used for validation or converting between supported file formats (-o
).
dataconf -c confs/test.hocon -m tests.configs -d TestConf -o hocon
# dataconf.exceptions.TypeConfigException: expected type <class 'datetime.timedelta'> at .duration, got <class 'int'>
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 dataconf-3.3.0.tar.gz
.
File metadata
- Download URL: dataconf-3.3.0.tar.gz
- Upload date:
- Size: 15.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.5 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | da656c5e45bae9071a380d991183db98024c13a861e3d8fd225629bd9a76dd6f |
|
MD5 | 1fc0e391dfba792f5b0541fcf580e829 |
|
BLAKE2b-256 | c1b6a41874c4ebf4e2bb0c49e6b03563cf2503258235fa4affec464db4e7d00e |
File details
Details for the file dataconf-3.3.0-py3-none-any.whl
.
File metadata
- Download URL: dataconf-3.3.0-py3-none-any.whl
- Upload date:
- Size: 16.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.8.3 CPython/3.12.5 Linux/6.5.0-1025-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5f80bc6f5c130f2c3e463ea8cbc57221cf5e789c580e3880e19b284bee25db41 |
|
MD5 | b4676dfc728421ed233fe18e461a41d2 |
|
BLAKE2b-256 | cf4780a04c27f9bb66f7d46a8cd9a49cbb48a894328da47420cc592e2f252d9c |