- Notifications
You must be signed in to change notification settings - Fork14
Simple dataclasses configuration management for Python with hocon/json/yaml/properties/env-vars/dict/cli support.
License
NotificationsYou must be signed in to change notification settings
zifeo/dataconf
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Simple dataclasses configuration management for Python withhocon/json/yaml/properties/env-vars/dict/cli support.
Requires at least Python 3.9.
# pypipip install dataconfpoetry add dataconf# remote masterpip install --upgrade git+https://github.com/zifeo/dataconf.gitpoetry add git+https://github.com/zifeo/dataconf.git# local repo/devpoetry installpre-commit install
importosfromdataclassesimportdataclass,fieldfromtypingimportList,Dict,Text,Union,Tuplefromdateutil.relativedeltaimportrelativedeltafromdatetimeimportdatetime,timedeltaimportdataconfconf="""str_name = teststr_name = ${?HOME}dash-to-underscore = truefloat_num = 2.2iso_datetime = "2000-01-01T20:00:00"iso_duration = "P123DT4H5M6S"variable_length_tuple_data = [ 1 2 3]tuple_data = [ a P1D]# this is a commentlist_data = [ a b]nested { a = test b : 1}nested_list = [ { a = test1 b : 2.5 }]duration = 2sunion = 1people { name = Thailand}zone { area_code = 42}"""classAbstractBaseClass:pass@dataclassclassPerson(AbstractBaseClass):name:Text@dataclassclassZone(AbstractBaseClass):area_code:int@dataclassclassNested:a:Textb:float@dataclassclassConfig:str_name:Textdash_to_underscore:boolfloat_num:floatiso_datetime:datetimeiso_duration:timedeltavariable_length_tuple_data:Tuple[int, ...]tuple_data:Tuple[Text,timedelta]list_data:List[Text]nested:Nestednested_list:List[Nested]duration:relativedeltaunion:Union[Text,int]people:AbstractBaseClasszone:AbstractBaseClassdefault: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={}# )@dataclassclassExample:hello:strworld:strfoo: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')
importdataconfconf=dataconf.string('{ name: Test }',Config)conf=dataconf.string('name:\n\tvalue: Test',Config,loader=dataconf.YAML)# dataconf.HOCON by defaultconf=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, propertiesconf=dataconf.file('confs/test.hocon',Config)# hocon, json, yaml, propertiesconf=dataconf.cli(sys.argv,Config)# Aggregationconf=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, propertiesconf=dataconf.load('confs/test.yaml',Config,loader=dataconf.YAML)# dataconf.HOCON by defaultdataconf.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 seehere.
PREFIX_VAR=aPREFIX_VAR_NAME=bPREFIX_TEST__NAME=cPREFIX_LS_0=dPREFIX_LS_1=ePREFIX_LSLS_0_0=fPREFIX_LSOB_0__NAME=gPREFIX_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 mightbe casted.
Same as env vars parse (dashes are converted to underscore, e.g.TEST_A
→--test-a
).
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'>
About
Simple dataclasses configuration management for Python with hocon/json/yaml/properties/env-vars/dict/cli support.