Compare commits
No commits in common. "b71bd5b24bc19e925db239612b46683aa951ca59" and "c87b0b7d1631931f08d94c4ca58797f5a4b37136" have entirely different histories.
b71bd5b24b
...
c87b0b7d16
@ -1,19 +0,0 @@
|
|||||||
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
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
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)
|
|
||||||
@ -2,25 +2,20 @@ import os
|
|||||||
import shutil
|
import shutil
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from typing import Type, Optional
|
from typing import Type
|
||||||
|
|
||||||
from kissconfig.config import ConfigClass
|
from kissconfig.config import ConfigClass
|
||||||
from kissconfig.loader import Loader, YamlLoader
|
from kissconfig.loader import Loader, YamlLoader
|
||||||
|
|
||||||
|
|
||||||
def load_config(class_: Type[ConfigClass],
|
def load_config(main_config: Type[ConfigClass], loader: Loader = YamlLoader()):
|
||||||
path: str,
|
if not os.path.exists(config_path):
|
||||||
loader: Loader = YamlLoader(),
|
logging.warning(f"Unable to locate app config ({config_path})!")
|
||||||
example_path: Optional[str] = None):
|
if not os.path.exists(example_config_path):
|
||||||
if os.path.exists(path):
|
logging.critical(f"Unable to locate example config ({example_config_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!",
|
|
||||||
path, example_path)
|
|
||||||
else:
|
|
||||||
logging.critical(f"Unable to locate example config ({example_path})")
|
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
else:
|
||||||
|
shutil.copy2(example_config_path, config_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)
|
||||||
|
|||||||
@ -34,3 +34,13 @@ class ConfigClass:
|
|||||||
raise ValueError(f"{cls.__name__}.{f.name} is not configured!")
|
raise ValueError(f"{cls.__name__}.{f.name} is not configured!")
|
||||||
kwargs[f.name] = ConfigClass.parse(data[f.name], hints[f.name])
|
kwargs[f.name] = ConfigClass.parse(data[f.name], hints[f.name])
|
||||||
return cls(**kwargs)
|
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)
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
from abc import ABCMeta, abstractmethod
|
from abc import ABCMeta, abstractmethod
|
||||||
from typing import Type, Optional
|
from typing import Type
|
||||||
|
|
||||||
import yaml
|
from yaml import safe_load
|
||||||
|
|
||||||
from kissconfig.config import ConfigClass
|
from kissconfig.config import ConfigClass
|
||||||
|
|
||||||
@ -11,8 +11,10 @@ class EmptyConfig (ValueError):
|
|||||||
|
|
||||||
|
|
||||||
class Loader (metaclass=ABCMeta):
|
class Loader (metaclass=ABCMeta):
|
||||||
def __init__(self, namespace: Optional[str] = None):
|
def __init__(self, path: str = None,
|
||||||
self.namespace = namespace
|
example_path: str = None):
|
||||||
|
self.path = path
|
||||||
|
self.example_path = example_path
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def parse_file(self, path: str) -> dict:
|
def parse_file(self, path: str) -> dict:
|
||||||
@ -29,5 +31,4 @@ class Loader (metaclass=ABCMeta):
|
|||||||
|
|
||||||
class YamlLoader (Loader):
|
class YamlLoader (Loader):
|
||||||
def parse_file(self, path: str) -> dict:
|
def parse_file(self, path: str) -> dict:
|
||||||
with open(path) as f:
|
return safe_load(path)
|
||||||
return yaml.safe_load(f)
|
|
||||||
|
|||||||
@ -1,16 +0,0 @@
|
|||||||
[build-system]
|
|
||||||
requires = ["hatchling"]
|
|
||||||
build-backend = "hatchling.build"
|
|
||||||
|
|
||||||
[project]
|
|
||||||
name = "kissconfig"
|
|
||||||
version = "0.1.0"
|
|
||||||
authors = [{name="Ilya Bezrukov", email="bezrukoff888@gmail.com" }]
|
|
||||||
description = "Config with dataclasses and KISS"
|
|
||||||
readme = "README.md"
|
|
||||||
dependencies = ["pyyaml"]
|
|
||||||
requires-python = ">=3.10"
|
|
||||||
|
|
||||||
[project.urls]
|
|
||||||
"Homepage" = "https://git.ilbz.ru/brinza/kissconfig"
|
|
||||||
"Bug Tracker" = "https://git.ilbz.ru/brinza/kissconfig/issues"
|
|
||||||
Loading…
x
Reference in New Issue
Block a user