def _load_config()

in src/hpc/autoscale/util.py [0:0]


def _load_config(config: Union[str, Dict], path_stack: List[str]) -> Dict:
    if hasattr(config, "keys"):
        return config  # type: ignore

    assert isinstance(config, str)

    config_abs_path = os.path.abspath(config)
    if not path_stack:
        path_stack.append(config_abs_path)

    try:
        assert isinstance(config, str)
        with open(config) as fr:
            base_config = json.load(fr)

        for to_import in base_config.get("include", []):
            child_abs_import: str
            if os.path.isabs(to_import):
                child_abs_import = to_import
            else:
                directory = os.path.dirname(os.path.abspath(config))
                child_abs_import = os.path.join(directory, to_import)

            if child_abs_import in path_stack:
                # append child to complete the circle
                path_stack.append(child_abs_import)
                raise CircularIncludeError(
                    "Circular include found: {}".format(" ---> ".join(path_stack))
                )

            path_stack.append(child_abs_import)
            child_config = _load_config(child_abs_import, path_stack)
            assert child_abs_import == path_stack.pop(-1)
            base_config = _dict_merge(base_config, child_config)
        return base_config

    except ConfigurationException:
        raise

    except Exception as e:
        msg = "Could not parse config {}: {}".format(config, str(e))
        raise ConfigurationException(msg)