from abc import ABCMeta, abstractmethod from typing import Type, Optional import yaml from kissconfig.config import ConfigClass class EmptyConfig (ValueError): pass class Loader (metaclass=ABCMeta): def __init__(self, namespace: Optional[str] = None): self.namespace = namespace @abstractmethod def parse_file(self, path: str) -> dict: pass def from_file(self, config_class: Type[ConfigClass], path: str) -> ConfigClass: data = self.parse_file(path) if not data: raise EmptyConfig("Configuration file seems to be empty") if self.namespace is not None: data = data.get(self.namespace, {}) return config_class.from_dict(data) class YamlLoader (Loader): def parse_file(self, path: str) -> dict: with open(path) as f: return yaml.safe_load(f)