Fix issues

This commit is contained in:
Ilya Bezrukov 2024-03-02 01:24:43 +03:00
parent d6a01702b7
commit c48319c5da
5 changed files with 69 additions and 28 deletions

19
example/config.yaml Normal file
View File

@ -0,0 +1,19 @@
db:
host: 127.0.0.1
username: test
password: 123456
groups:
- name: admin
priority: 100
permissions:
- ban_user
- ro_user
- invite_user
- promote_user
- name: moderator
priority: 50
permissions:
- invite_user
- ro_user

28
example/simple.py Normal file
View File

@ -0,0 +1,28 @@
from dataclasses import dataclass
from kissconfig import load_config, ConfigClass
@dataclass
class Database (ConfigClass):
host: str
username: str
password: str
@dataclass
class Group (ConfigClass):
name: str
priority: int
permissions: list[str]
@dataclass
class Config (ConfigClass):
db: Database
groups: list[Group]
if __name__ == "__main__":
config = load_config(Config, "config.yaml")
print(config)

View File

@ -2,20 +2,25 @@ import os
import shutil
import logging
import sys
from typing import Type
from typing import Type, Optional
from kissconfig.config import ConfigClass
from kissconfig.loader import Loader, YamlLoader
def load_config(main_config: Type[ConfigClass], loader: Loader = YamlLoader()):
if not os.path.exists(config_path):
logging.warning(f"Unable to locate app config ({config_path})!")
if not os.path.exists(example_config_path):
logging.critical(f"Unable to locate example config ({example_config_path})")
sys.exit(1)
else:
shutil.copy2(example_config_path, config_path)
def load_config(class_: Type[ConfigClass],
path: str,
loader: Loader = YamlLoader(),
example_path: Optional[str] = None):
if os.path.exists(path):
return loader.from_file(class_, path)
logging.warning(f"Unable to locate app config ({path})!")
if example_path:
if os.path.exists(example_path):
shutil.copy2(example_path, path)
logging.warning(f"Actual app config (%s) created from example (%s), don't forget to update it!",
config_path, example_config_path)
return main_config.from_file(config_path, config_namespace)
path, example_path)
else:
logging.critical(f"Unable to locate example config ({example_path})")
sys.exit(1)

View File

@ -34,13 +34,3 @@ class ConfigClass:
raise ValueError(f"{cls.__name__}.{f.name} is not configured!")
kwargs[f.name] = ConfigClass.parse(data[f.name], hints[f.name])
return cls(**kwargs)
@classmethod
def from_file(cls, filepath: str, config_namespace: str = ""):
with open(filepath) as f:
data = safe_load(f)
if data is None:
raise ValueError("")
if config_namespace:
data = data.get(config_namespace, {})
return cls.from_dict(data)

View File

@ -1,7 +1,7 @@
from abc import ABCMeta, abstractmethod
from typing import Type
from typing import Type, Optional
from yaml import safe_load
import yaml
from kissconfig.config import ConfigClass
@ -11,10 +11,8 @@ class EmptyConfig (ValueError):
class Loader (metaclass=ABCMeta):
def __init__(self, path: str = None,
example_path: str = None):
self.path = path
self.example_path = example_path
def __init__(self, namespace: Optional[str] = None):
self.namespace = namespace
@abstractmethod
def parse_file(self, path: str) -> dict:
@ -31,4 +29,5 @@ class Loader (metaclass=ABCMeta):
class YamlLoader (Loader):
def parse_file(self, path: str) -> dict:
return safe_load(path)
with open(path) as f:
return yaml.safe_load(f)