2020-04-14 02:31:36 +02:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
import typing
|
2020-04-14 02:31:36 +02:00
|
|
|
|
|
|
|
import toml
|
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
BaseType = typing.TypeVar("BaseType")
|
2020-04-14 02:31:36 +02:00
|
|
|
|
|
|
|
|
|
|
|
class Config:
|
2020-04-21 02:59:08 +02:00
|
|
|
#: :class:`str`: Path of config file
|
2020-04-14 02:31:36 +02:00
|
|
|
path: str
|
2020-04-21 02:59:08 +02:00
|
|
|
|
|
|
|
#: :class:`typing.Type` [:class:`BaseType`]: Current fields
|
|
|
|
fields: typing.Dict[str, BaseType]
|
2020-04-14 02:31:36 +02:00
|
|
|
|
|
|
|
def __init__(self, path: str) -> None:
|
|
|
|
"""
|
|
|
|
Create config object
|
|
|
|
|
|
|
|
Basic usage:
|
|
|
|
|
|
|
|
>>> config = Config("doctest_config.toml")
|
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
:param str path: Path of config file
|
2020-04-14 02:31:36 +02:00
|
|
|
"""
|
|
|
|
self.fields = {}
|
|
|
|
self.path = path
|
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
def register(self, name: str, type_: typing.Type[BaseType]) -> None:
|
2020-04-14 02:31:36 +02:00
|
|
|
"""
|
|
|
|
Register option
|
|
|
|
|
|
|
|
Basic usage:
|
|
|
|
|
|
|
|
>>> from config.config_types import factory, Int
|
|
|
|
>>> config = Config("doctest_config.toml")
|
|
|
|
>>> config.register("my_parameter", factory(Int))
|
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
:param str name: Name of config parameter
|
|
|
|
:param typing.Type[BaseType] type_: Type of config parameter
|
2020-04-14 02:31:36 +02:00
|
|
|
"""
|
|
|
|
self.fields.update({
|
|
|
|
name: type_()
|
|
|
|
})
|
|
|
|
|
|
|
|
def set(self, values: dict) -> None:
|
|
|
|
"""
|
|
|
|
Set all parameters with values (and override old ones)
|
|
|
|
|
|
|
|
Basic usage:
|
|
|
|
|
|
|
|
>>> from config.config_types import factory, Int
|
|
|
|
>>> config = Config("doctest_config.toml")
|
|
|
|
>>> config.register("my_parameter", factory(Int))
|
|
|
|
>>> config.set({"my_parameter": 3})
|
|
|
|
|
|
|
|
:type values: dict
|
|
|
|
:param values: dict of parameters
|
|
|
|
"""
|
|
|
|
for k, v in values.items():
|
2020-04-21 02:59:08 +02:00
|
|
|
try:
|
|
|
|
self.fields[k].set(v)
|
|
|
|
except KeyError:
|
|
|
|
# TODO: trouver un moyen de warn
|
|
|
|
pass
|
2020-04-14 02:31:36 +02:00
|
|
|
|
|
|
|
def save(self) -> None:
|
|
|
|
"""
|
|
|
|
Save config to ``self.file``
|
|
|
|
|
|
|
|
Basic usage:
|
|
|
|
|
|
|
|
>>> from config.config_types import factory, Int
|
|
|
|
>>> config = Config("doctest_config.toml")
|
|
|
|
>>> config.register("my_parameter", factory(Int))
|
|
|
|
>>> config.set({"my_parameter": 3})
|
|
|
|
>>> config.save()
|
|
|
|
"""
|
|
|
|
with open(self.path, 'w') as file:
|
|
|
|
toml.dump({k: v.to_save() for k, v in self.fields.items()}, file)
|
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
def load(self) -> None:
|
2020-04-14 02:31:36 +02:00
|
|
|
"""
|
|
|
|
Load config from ``self.file``
|
|
|
|
|
|
|
|
Basic usage:
|
|
|
|
|
|
|
|
>>> from config.config_types import factory, Int
|
|
|
|
>>> config = Config("doctest_config.toml")
|
|
|
|
>>> config.register("my_parameter", factory(Int))
|
|
|
|
>>> config.set({"my_parameter": 3})
|
|
|
|
>>> config.save()
|
|
|
|
>>> new_config = Config("doctest_config.toml")
|
|
|
|
>>> new_config.register("my_parameter", factory(Int))
|
|
|
|
>>> new_config.load()
|
|
|
|
>>> new_config["my_parameter"]
|
|
|
|
3
|
|
|
|
|
|
|
|
:return: None
|
|
|
|
"""
|
2020-04-20 19:54:03 +02:00
|
|
|
try:
|
|
|
|
with open(self.path, 'r') as file:
|
|
|
|
self.set(toml.load(file))
|
|
|
|
except FileNotFoundError:
|
|
|
|
self.save()
|
2020-04-14 02:31:36 +02:00
|
|
|
|
2020-04-21 02:59:08 +02:00
|
|
|
def __getitem__(self, item: str) -> typing.Any:
|
2020-04-14 02:31:36 +02:00
|
|
|
"""
|
2020-04-21 02:59:08 +02:00
|
|
|
Get field from config
|
|
|
|
|
|
|
|
:param str item: Config field to get
|
2020-04-14 02:31:36 +02:00
|
|
|
|
|
|
|
Basic usage:
|
|
|
|
|
|
|
|
>>> from config.config_types import factory, Int
|
|
|
|
>>> config = Config("doctest_config.toml")
|
|
|
|
>>> config.register("my_parameter", factory(Int))
|
|
|
|
>>> config.set({"my_parameter": 3})
|
|
|
|
>>> print(config["my_parameter"])
|
|
|
|
3
|
|
|
|
"""
|
|
|
|
return self.fields[item].get()
|