diff options
author | Devaev Maxim <[email protected]> | 2018-11-14 20:34:46 +0300 |
---|---|---|
committer | Devaev Maxim <[email protected]> | 2018-11-14 20:34:46 +0300 |
commit | b690dbce4447665db5b4ce0b11f14dc796ca917b (patch) | |
tree | 62d4961002e09fa79886cdd076283c1c45f8bdd0 /kvmd/application.py | |
parent | e97975fc15d3688a121cfdf18126a16c957838bd (diff) |
common logging.yaml
Diffstat (limited to 'kvmd/application.py')
-rw-r--r-- | kvmd/application.py | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/kvmd/application.py b/kvmd/application.py index a78c1047..31a57925 100644 --- a/kvmd/application.py +++ b/kvmd/application.py @@ -1,10 +1,15 @@ +import os import argparse import logging import logging.config from typing import Dict +from typing import IO +from typing import Any import yaml +import yaml.loader +import yaml.nodes # ===== @@ -13,10 +18,32 @@ def init() -> Dict: parser.add_argument("-c", "--config", required=True, metavar="<path>") options = parser.parse_args() - with open(options.config) as config_file: - config = yaml.load(config_file) + config: Dict = _load_yaml_file(options.config) logging.captureWarnings(True) logging.config.dictConfig(config["logging"]) - return config["kvmd"] + return config + + +# ===== +def _load_yaml_file(path: str) -> Any: + with open(path) as yaml_file: + try: + return yaml.load(yaml_file, _YamlLoader) + except Exception: + # Reraise internal exception as standard ValueError and show the incorrect file + raise ValueError("Incorrect YAML syntax in file '{}'".format(path)) + + +class _YamlLoader(yaml.loader.Loader): # pylint: disable=too-many-ancestors + def __init__(self, yaml_file: IO) -> None: + yaml.loader.Loader.__init__(self, yaml_file) + self.__root = os.path.dirname(yaml_file.name) + + def include(self, node: yaml.nodes.Node) -> str: + path = os.path.join(self.__root, self.construct_scalar(node)) # pylint: disable=no-member + return _load_yaml_file(path) + + +_YamlLoader.add_constructor("!include", _YamlLoader.include) # pylint: disable=no-member |