51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
|
"""An implementation of a simple key=value configuration."""
|
||
|
|
||
|
from os import getenv
|
||
|
from os.path import exists, join
|
||
|
from platform import system
|
||
|
from typing import Union
|
||
|
|
||
|
__all__ = ["Configuration", "get_configuration_path"]
|
||
|
|
||
|
|
||
|
DEFAULT_CONFIGURATION = {
|
||
|
"default-currency": "SRUB"
|
||
|
}
|
||
|
DEFAULT_CONFIGURATION_FILE = join(get_configuration_path(), "piggybank.conf")
|
||
|
|
||
|
|
||
|
def get_configuration_path():
|
||
|
if system() == "Linux":
|
||
|
return getenv("XDG_CONFIG_HOME") or f"{getenv('HOME')}/.config"
|
||
|
elif system() == "Windows":
|
||
|
return getenv("APPDATA")
|
||
|
|
||
|
|
||
|
class Configuration:
|
||
|
def __init__(self, configuration_file: str = DEFAULT_CONFIGURATION_FILE,
|
||
|
default_configuration: dict = DEFAULT_CONFIGURATION) -> None:
|
||
|
self._configuration_file = configuration_file
|
||
|
self._configuration = dict()
|
||
|
|
||
|
if exists(self._configuration_file):
|
||
|
self.load()
|
||
|
elif not default_configuration is None:
|
||
|
self._configuration = default_configuration
|
||
|
self.save()
|
||
|
|
||
|
def load(self) -> None:
|
||
|
for line in open(self._configuration_file, 'r'):
|
||
|
key, value = line.split(" = ")
|
||
|
self._configuration[key] = value
|
||
|
|
||
|
def save(self) -> None:
|
||
|
with open(self._configuration_file, 'w') as cf:
|
||
|
for key, value in self._configuration.items():
|
||
|
cf.write(f"{key} = {value}\n")
|
||
|
|
||
|
def __getitem__(self, key: str) -> Union[int, str, bool]:
|
||
|
return self._configuration[key]
|
||
|
|
||
|
def __setitem__(self, key: str, value: Union[int, str, bool]) -> None:
|
||
|
self._configuration[key] = value
|