Skip to content

dizzy.libconfig_loader

dizzy.libconfig_loader

LibConfig loader — YAML ingestion, Pydantic validation, and cross-reference checks.

load_libconfig(path)

Load a libconfig.yaml file, validate it, and return a LibConfig.

Source code in dizzy/src/dizzy/libconfig_loader.py
38
39
40
41
42
43
44
45
def load_libconfig(path: str | Path) -> LibConfig:
    """Load a ``libconfig.yaml`` file, validate it, and return a LibConfig."""
    raw = yaml.safe_load(Path(path).read_text())
    logger.debug("loaded libconfig", extra={"path": str(path)})
    if raw is None:
        raw = {}
    normalised = _normalize(raw)
    return LibConfig.model_validate(normalised)

validate_libconfig(config, feat)

Validate that all element names in config exist in feat.

Returns a list of error strings; empty list means the config is valid.

Source code in dizzy/src/dizzy/libconfig_loader.py
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
def validate_libconfig(config: LibConfig, feat: FeatureDefinition) -> list[str]:
    """Validate that all element names in config exist in feat.

    Returns a list of error strings; empty list means the config is valid.
    """
    errors: list[str] = []

    proc_names = {p.name for p in feat.procedures or []}
    policy_names = {p.name for p in feat.policies or []}
    query_names = {q.name for q in feat.queries or []}
    proj_names = {p.name for p in feat.projections or []}

    for binding in config.procedures or []:
        if binding.name not in proc_names:
            errors.append(f"libconfig procedure '{binding.name}' not declared in feat")
    for binding in config.policies or []:
        if binding.name not in policy_names:
            errors.append(f"libconfig policy '{binding.name}' not declared in feat")
    for binding in config.queries or []:
        if binding.name not in query_names:
            errors.append(f"libconfig query '{binding.name}' not declared in feat")
    for binding in config.projections or []:
        if binding.name not in proj_names:
            errors.append(f"libconfig projection '{binding.name}' not declared in feat")

    logger.debug("validated libconfig", extra={"errors": len(errors)})
    return errors