Skip to content

from_overrides

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

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
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
def flattenConfig(configjson_path, new_config_name="config.json"):
    """
    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
    with open(configjson_path.replace(os.path.basename(configjson_path), new_config_name), 'w', newline='\r\n') as handle:
        handle.write(json.dumps(configjson, sort_keys=True, indent=4))

    return configjson