from __future__ import annotations import yaml from pathlib import Path from typing import List, Union from specs import Spec, DirectorySpec, VolumeSpec import skeleton def read_specs_file(path: Union[str, Path]) -> List[Spec]: with open(path, "r") as yaml_file: data = yaml.safe_load(yaml_file) categories = [("directories", DirectorySpec), ("volumes", VolumeSpec)] specs = [] for key, class_name in categories: if not data["specs"].get(key): continue # Check what defaults are present defaults = {} if data.get("defaults"): if data["defaults"].get("all"): defaults = skeleton.merge(defaults, data["defaults"]["all"]) if data["defaults"].get(key): defaults = skeleton.merge(defaults, data["defaults"][key]) specs.extend( [ class_name.from_dict(name, spec, defaults) for name, spec in data["specs"][key].items() ] ) return specs