Source code for pymt.cmd.cmt_config

import importlib
import os
import socket
import sys

import yaml
from model_metadata.find import find_model_data_files


[docs]class redirect: def __init__(self, stdout=None, stderr=None): self._stdout = sys.stdout self._stderr = sys.stderr self._out = stdout or sys.stdout self._err = stderr or sys.stderr def __enter__(self): if isinstance(self._out, str): sys.stdout = open(self._out, "w") else: sys.stdout = self._out if isinstance(self._err, str): sys.stderr = open(self._err, "w") else: sys.stderr = self._err def __exit__(self, type_, value, traceback): if isinstance(self._out, str): sys.stdout.close() if isinstance(self._err, str): sys.stderr.close() sys.stdout = self._stdout sys.stderr = self._stderr
[docs]def read_component_configuration(names, vars=None): # pylint: disable=redefined-builtin module = importlib.import_module(".".join(["pymt", "models"])) names = names or module.__all__ vars_ = vars or ("uses", "provides", "info", "parameters", "files", "api") configs = {} for name in names: model = module.__dict__[name]() config = {} if "uses" in vars_: config["uses"] = list(model.get_input_var_names()) if "provides" in vars_: config["provides"] = list(model.get_output_var_names()) if "info" in vars_: with open(os.path.join(model.datadir, "info.yaml")) as fp: config["info"] = yaml.safe_load(fp) if "parameters" in vars_: with open(os.path.join(model.datadir, "parameters.yaml")) as fp: config["parameters"] = yaml.safe_load(fp) if "files" in vars_: config["files"] = find_model_data_files(model.datadir) if "api" in vars_: with open(os.path.join(model.datadir, "api.yaml")) as fp: api = yaml.safe_load(fp) config["api"] = { "module": module.__name__, "class": name, "initialize_args": api.get("initialize_args", ""), } configs[name] = config return configs
[docs]def main(): import argparse parser = argparse.ArgumentParser() parser.add_argument("name", nargs="*", help="Name of model") parser.add_argument("--vars", default=None, help="List of variables to get") parser.add_argument("--output", type=argparse.FileType("w"), help="Output file") args = parser.parse_args() vars_ = args.vars if vars_ is not None: vars_ = args.vars.split(",") with redirect(stdout=sys.stderr): config = read_component_configuration(args.name, vars=vars_) host = { "hostname": socket.gethostname(), "os_name": os.uname()[0], "os_release": os.uname()[2], "os_version": os.uname()[3], "platform": os.uname()[4], "prefix": sys.exec_prefix, "environ": { "PATH": os.pathsep.join( [os.path.join(sys.exec_prefix, "bin"), "/usr/bin", "/bin"] ) }, "python_version": ".".join( [ str(sys.version_info.major), str(sys.version_info.minor), str(sys.version_info.micro), ] ), } print( yaml.dump({"host": host, "components": config}, default_flow_style=False), file=args.output, )
if __name__ == "__main__": main()