# -*- coding: utf-8 -*- # Copyright 2020 ArctosLabs Scandinavia AB # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or # implied. # See the License for the specific language governing permissions and # limitations under the License. """Global configuration managed by environment variables.""" import logging import os import pkg_resources import yaml logger = logging.getLogger(__name__) class Config: def __init__(self, config_file: str = ""): self.conf = {} self._read_config_file(config_file) self._read_env() def _read_config_file(self, config_file): if not config_file: path = "pla.yaml" config_file = pkg_resources.resource_filename(__name__, path) with open(config_file) as f: self.conf = yaml.safe_load(f) def _read_env(self): for env in os.environ: if not env.startswith("OSMPLA_"): continue elements = env.lower().split("_") if len(elements) < 3: logger.warning( "Environment variable %s=%s does not comply with required format. Section and/or field missing.", env, os.getenv(env), ) continue section = elements[1] field = "_".join(elements[2:]) value = os.getenv(env) if section not in self.conf: self.conf[section] = {} self.conf[section][field] = value def get(self, section, field=None): if not field: return self.conf[section] return self.conf[section][field] def set(self, section, field, value): if section not in self.conf: self.conf[section] = {} self.conf[section][field] = value