def _print_config(self, cli_obj, config, paths): """Log end result of parsing package settings. This is only for the user's benefit; a machine-readable version which is usable for provenance/reproducibility is saved by the OutputManager as ``config_save.jsonc``. """ d = dict() for n, case in enumerate(self.iter_children()): key = 'case_list({})'.format(n) d[key] = case d['paths'] = paths.toDict() d['paths'].pop('_unittest', None) d['settings'] = dict() all_groups = set(arg_gp.title for arg_gp in \ cli_obj.iter_arg_groups(subcommand=None)) settings_gps = all_groups.difference( ('parser', 'PATHS', 'MODEL', 'DIAGNOSTICS')) for group in settings_gps: d['settings'] = self._populate_from_cli(cli_obj, group, d['settings']) d['settings'] = {k:v for k,v in d['settings'].items() \ if k not in d['paths']} d['env_vars'] = config.global_env_vars _log.info('PACKAGE SETTINGS:') _log.info(util.pretty_print_json(d))
def print_config(self): _tmp = {'settings': dict(), 'defaults to assign': dict()} for key, val in iter(self.config.items()): if key in self.settings.cli_defaults['default_keys']: _tmp['defaults to assign'][key] = val else: _tmp['settings'][key] = val print(util.pretty_print_json(_tmp, sort_keys=True))
def _framework_init(self, code_root, defaults_rel_path): # set up CLI and parse arguments # print('\tDEBUG: argv = {}'.format(sys.argv[1:])) cli_obj = cli.FrameworkCLIHandler(code_root, defaults_rel_path) self._cli_pre_parse_hook(cli_obj) cli_obj.parse_cli() self._cli_post_parse_hook(cli_obj) # load pod data pod_info_tuple = cli.load_pod_settings(code_root) # do nontrivial parsing config = util_mdtf.ConfigManager(cli_obj, pod_info_tuple) print(util.pretty_print_json(config.paths)) self.parse_mdtf_args(cli_obj, config) # config should be read-only from here on self._post_parse_hook(cli_obj, config) self._print_config(cli_obj, config)
def framework_verify(code_root, run_output): print("Checking linked output files") try: html_root = os.path.join(run_output, 'index.html') if not os.path.exists(html_root): raise IOError( "Can't find framework html output in {}".format(html_root)) link_verifier = LinkVerifier(html_root, verbose=False) missing_dict = link_verifier.verify_all_links() except Exception as exc: fatal_exception_handler(exc, "ERROR in link verification.") if missing_dict: print("ERROR: the following files are missing:") print(util.pretty_print_json(missing_dict)) util.exit_handler(code=1) print("SUCCESS: no missing links found.") print("Finished: framework test run successful!")
def _print_config(self, cli_obj, config): # make config nested dict for backwards compatibility # this is all temporary d = dict() for n, case in enumerate(self.case_list): key = 'case_list({})'.format(n) d[key] = case d['pod_list'] = self.pod_list d['paths'] = config.paths d['paths'].pop('_unittest', None) d['settings'] = dict() settings_gps = set(cli_obj.parser_groups).difference( set(['parser', 'PATHS', 'MODEL', 'DIAGNOSTICS'])) for group in settings_gps: d['settings'] = self._populate_from_cli(cli_obj, group, d['settings']) d['settings'] = {k:v for k,v in iter(d['settings'].items()) \ if k not in d['paths']} d['envvars'] = config.global_envvars print('DEBUG: SETTINGS:') print(util.pretty_print_json(d))
if __name__ == '__main__': # Wrap input/output if we're called as a standalone script parser = argparse.ArgumentParser() parser.add_argument("-v", "--verbose", action="store_true", help="increase output verbosity") parser.add_argument( "path_or_url", help="URL or filesystem path to the MDTF framework output directory.") args = parser.parse_args() # instead of print(), use root logger log = logging.getLogger() handler = logging.StreamHandler(stream=sys.stdout) formatter = logging.Formatter(fmt='%(message)s', datefmt='%H:%M:%S') handler.setFormatter(formatter) log.addHandler(handler) link_verifier = LinkVerifier(args.path_or_url, verbose=args.verbose) missing_dict = link_verifier.verify_all_links() if missing_dict: print("ERROR: the following files are missing:") print(util.pretty_print_json(missing_dict)) sys.exit(1) else: print("SUCCESS: no missing links found.") sys.exit(0)
if 'CASE_ROOT_DIR' not in cli_d and cli_obj.config.get( 'root_dir', None): # CASE_ROOT was set positionally cli_d['CASE_ROOT_DIR'] = cli_obj.config['root_dir'] if not case_list_in: case_list_in = [cli_d] case_list = [] for case_tup in enumerate(case_list_in): case_list.append(self.parse_case(case_tup, cli_d, cli_obj, config)) self.case_list = [case for case in case_list if case is not None] if not self.case_list: print( "ERROR: no valid entries in case_list. Please specify model run information." ) print('Received:') print(util.pretty_print_json(case_list_in)) exit(1) def parse_case(self, case_tup, cli_d, cli_obj, config): n, d = case_tup if 'CASE_ROOT_DIR' not in d and 'root_dir' in d: d['CASE_ROOT_DIR'] = d.pop('root_dir') case_convention = d.get('convention', '') d.update(cli_d) if case_convention: d['convention'] = case_convention if not ('CASENAME' in d or ('model' in d and 'experiment' in d)): print(( "WARNING: Need to specify either CASENAME or model/experiment " "in caselist entry {}, skipping.").format(n + 1))