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)