implemented basic functionality

This commit is contained in:
Hellow 2024-02-21 21:31:14 +01:00
parent d147958c7b
commit 5d6060cba0
4 changed files with 60 additions and 4 deletions

View File

@ -1,3 +1,4 @@
from __future__ import annotations
from pathlib import Path from pathlib import Path
import toml import toml
@ -12,16 +13,38 @@ I need a config directory, where I can store all config files.
""" """
CONFIG_DIR = Path.home() / ".config" / "configparser_toml" class ConfigItem(dict):
"""
recursive config
"""
def __init__(self, data: dict):
self._data: dict = {}
self._default = data.get("DEFAULT", {})
for key, value in data.items():
self[key] = value
def __missing__(self, key):
return self._default.get(key, None)
def __setitem__(self, key, value):
if isinstance(value, dict):
self._data[key] = ConfigItem(value)
else:
self._data[key] = value
class Config:
class Config(ConfigItem):
def __init__(self, appname: str, profile: str = None, config_dir: str = None): def __init__(self, appname: str, profile: str = None, config_dir: str = None):
self._config: dict = {} self.is_root: bool = is_root
self._config: ConfigItem = ConfigItem({})
self.appname: str = appname self.appname: str = appname
self.config_dir: Path = Path(config_dir or platformdirs.user_config_path(appname=appname)) self.config_dir: Path = Path(config_dir or platformdirs.user_config_path(appname=appname))
self.config_file: Path = self.load_profile(profile) self.config_file: Path = self.load_profile(profile)
@ -31,13 +54,24 @@ class Config:
self.config_dir.mkdir(parents=True, exist_ok=True) self.config_dir.mkdir(parents=True, exist_ok=True)
self.config_file = self.config_dir / f"{profile}.toml" self.config_file = self.config_dir / f"{profile}.toml"
self.read()
return self.config_file return self.config_file
def read(self): def read(self):
pass _raw = {}
with self.config_file.open("r", encoding=ENCODING) as f:
self._config = ConfigItem(toml.load(f))
def write(self): def write(self):
with self.config_file.open("w", encoding=ENCODING) as f: with self.config_file.open("w", encoding=ENCODING) as f:
toml.dump(self._config, f) toml.dump(self._config, f)
def __setitem__(self, key, value):
self._config.__setitem__(key, value)
def __getitem__(self, key):
return self._config.__getitem__(key)

View File

@ -0,0 +1,11 @@
class ConfigParserError(Exception):
"""Base class for exceptions in this module."""
def __init__(self, msg=''):
self.message = msg
Exception.__init__(self, msg)
def __repr__(self):
return self.message
__str__ = __repr__

View File

@ -0,0 +1 @@
ENCODING = "utf-8"

10
example.toml Normal file
View File

@ -0,0 +1,10 @@
[foo_bar.DEFAULT]
msg = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet."
number = 3.1416
[foo_bar.foo]
msg = "ustry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
number = 42
[foo_bar.bar]
msg = "Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their."