# Copyright 2021 Collate # 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. import io import json import os import pathlib from abc import ABC, abstractmethod from typing import IO, Any, Optional from pydantic import BaseModel class ConfigModel(BaseModel): class Config: extra = "forbid" class DynamicTypedConfig(ConfigModel): type: str config: Optional[Any] class WorkflowExecutionError(Exception): """An error occurred when executing the workflow""" class ConfigurationError(Exception): """A configuration error has happened""" class ConfigurationMechanism(ABC): @abstractmethod def load_config(self, config_fp: IO) -> dict: pass def load_config_file(config_file: pathlib.Path) -> dict: if not config_file.is_file(): raise ConfigurationError(f"Cannot open config file {config_file}") if config_file.suffix not in [".json"]: raise ConfigurationError( "Only json are supported. Cannot process file type {}".format( config_file.suffix ) ) with config_file.open() as raw_config_file: raw_config = raw_config_file.read() expanded_config_file = os.path.expandvars(raw_config) config_fp = io.StringIO(expanded_config_file) config = json.load(config_fp) return config