def get_cli_opts_node(opts=None, srcdir=None): """Create a ConfigNode representing options set on the command line. Args: opts (CylcOptionParser object): Object with values from the command line. Returns: Rose ConfigNode. Example: >>> from types import SimpleNamespace >>> opts = SimpleNamespace( ... opt_conf_keys='A B', ... defines=["[env]FOO=BAR"], ... rose_template_vars=["QUX=BAZ"] ... ) >>> node = get_cli_opts_node(opts) >>> node['opts'] {'value': 'A B', 'state': '!', 'comments': []} >>> node['env']['FOO'] {'value': 'BAR', 'state': '', 'comments': []} >>> node['template variables']['QUX'] {'value': 'BAZ', 'state': '', 'comments': []} """ # Unpack info we want from opts: opt_conf_keys = [] defines = [] rose_template_vars = [] if opts and 'opt_conf_keys' in dir(opts): opt_conf_keys = opts.opt_conf_keys if opts and 'defines' in dir(opts): defines = opts.defines if opts and 'rose_template_vars' in dir(opts): rose_template_vars = opts.rose_template_vars rose_orig_host = get_host() defines.append(f'[env]ROSE_ORIG_HOST={rose_orig_host}') rose_template_vars.append(f'ROSE_ORIG_HOST={rose_orig_host}') # Construct new ouput based on optional Configs: newconfig = ConfigNode() # For each __define__ determine whether it is an env or template define. for define in defines: match = re.match((r'^\[(?P<key1>.*)\](?P<state>!{0,2})' r'(?P<key2>.*)\s*=\s*(?P<value>.*)'), define).groupdict() if match['key1'] == '' and match['state'] in ['!', '!!']: LOG.warning( 'CLI opts set to ignored or trigger-ignored will be ignored.') else: newconfig.set(keys=[match['key1'], match['key2']], value=match['value'], state=match['state']) # For each __suite define__ add define. if srcdir is not None: config_node = rose_config_tree_loader(srcdir, opts).node templating = identify_templating_section(config_node) else: templating = 'template variables' for define in rose_template_vars: match = re.match(r'(?P<state>!{0,2})(?P<key>.*)\s*=\s*(?P<value>.*)', define).groupdict() # Guess templating type? newconfig.set(keys=[templating, match['key']], value=match['value'], state=match['state']) # Specialised treatement of optional configs. if 'opts' not in newconfig: newconfig['opts'] = ConfigNode() newconfig['opts'].value = '' newconfig['opts'].value = merge_opts(newconfig, opt_conf_keys) newconfig['opts'].state = '!' return newconfig
def get_cli_opts_node(opts=None): """Create a ConfigNode representing options set on the command line. Args: opts (CylcOptionParser object): Object with values from the command line. Returns: Rose ConfigNode. Example: >>> from types import SimpleNamespace >>> opts = SimpleNamespace( ... opt_conf_keys='A B', ... defines=["[env]FOO=BAR"], ... define_suites=["QUX=BAZ"] ... ) >>> node = get_cli_opts_node(opts) >>> node['opts'] {'value': 'A B', 'state': '!', 'comments': []} >>> node['env']['FOO'] {'value': 'BAR', 'state': '', 'comments': []} >>> node['jinja2:suite.rc']['QUX'] {'value': 'BAZ', 'state': '', 'comments': []} """ # Unpack info we want from opts: opt_conf_keys = [] defines = [] suite_defines = [] if opts and 'opt_conf_keys' in dir(opts): opt_conf_keys = opts.opt_conf_keys if opts and 'defines' in dir(opts): defines = opts.defines if opts and 'define_suites' in dir(opts): suite_defines = opts.define_suites # Construct new ouput based on optional Configs: newconfig = ConfigNode() # For each __define__ determine whether it is an env or template define. for define in defines: match = re.match((r'^\[(?P<key1>.*)\](?P<state>!{0,2})' r'(?P<key2>.*)\s*=\s*(?P<value>.*)'), define).groupdict() if match['key1'] == '' and match['state'] in ['!', '!!']: LOG.warning( 'CLI opts set to ignored or trigger-ignored will be ignored.') else: newconfig.set(keys=[match['key1'], match['key2']], value=match['value'], state=match['state']) # For each __suite define__ add define. for define in suite_defines: # For now just assuming that we just support Jinja2 - after I've # Implemented the fully template-engine neutral template variables # section this should be a moot point. match = re.match(r'(?P<state>!{0,2})(?P<key>.*)\s*=\s*(?P<value>.*)', define).groupdict() newconfig.set(keys=['jinja2:suite.rc', match['key']], value=match['value'], state=match['state']) # Specialised treatement of optional configs. if 'opts' not in newconfig: newconfig['opts'] = ConfigNode() newconfig['opts'].value = '' newconfig['opts'].value = merge_opts(newconfig, opt_conf_keys) newconfig['opts'].state = '!' return newconfig