34 lines
865 B
Python
34 lines
865 B
Python
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)
|