Skip to content

from_overrides

flattenConfig(configjson_path, new_config_name='config.json', use_full_out_path=False)

Historically called 'flattening' but really a function that takes a parameter override json config that includes a Default_Config_Path and produces a config.json from the two.

Source code in emod_api/config/from_overrides.py
def flattenConfig(configjson_path, new_config_name="config.json", use_full_out_path=False):
    """
    Historically called 'flattening' but really a function that takes a parameter override
    json config that includes a Default_Config_Path and produces a config.json from the two.
    """
    if not os.path.exists(configjson_path):
        raise

    configjson_flat = {}
    configjson = _load_json(configjson_path)

    _recursive_json_overrider(configjson, configjson_flat)

    # get defaults from config.json and synthesize output from default and overrides
    if "Default_Config_Path" in configjson_flat:
        default_config_path = configjson_flat["Default_Config_Path"]
        stripped_path = default_config_path.strip()
        if stripped_path != default_config_path:
            print("Warning: config parameter 'Default_Config_Path' has leading or trailing whitespace in value \"{0}\"."
                  " Trimming whitespace and continuing.".format(default_config_path))
            default_config_path = stripped_path

        try:
            # This code has always worked by treating the default_configpath as relative the Regression directory.
            # No longer doing that, but preserving that capability for back-compat. Going forward, relative to the
            # configjson_path.
            simdir = Path(configjson_path).parent
            default_config_json = None
            if Path(os.path.join(str(simdir), default_config_path)).exists():
                default_config_json = _load_json(os.path.join(str(simdir), default_config_path))
            else:
                default_config_json = _load_json(os.path.join('.', default_config_path))
            _recursive_json_overrider(default_config_json, configjson_flat)
        except Exception as ex:
            print(f"Exception opening default config {default_config_path}: {ex}.")
            raise ex

    else:
        print("Didn't find 'Default_Config_Path' in '{0}'".format(configjson_path))
        raise RuntimeError("Bad Default_Config_Path!!!")

    # still need that parameter top level node
    configjson = {}
    configjson["parameters"] = configjson_flat

    # don't need backslashes in the default config path
    # messing with anything else downstream now that it is flattened
    if "Default_Config_Path" in configjson["parameters"]:
        configjson["parameters"].pop("Default_Config_Path")

    # let's write out a flat version in case someone wants
    # to use regression examples as configs for debug mode
    outfile = new_config_name
    if not use_full_out_path:
        outfile = configjson_path.replace(os.path.basename(configjson_path), new_config_name)

    with open(outfile, 'w') as fid01:
        json.dump(configjson, fid01, sort_keys=True, indent=4)

    return configjson