Source code for CIME.XML.files

"""
Interface to the config_files.xml file.  This class inherits from EntryID.py
"""
import re
from CIME.XML.standard_module_setup import *

from CIME.XML.entry_id import EntryID
from CIME.utils import expect, get_cime_root, get_model

logger = logging.getLogger(__name__)

[docs]class Files(EntryID): def __init__(self, comp_interface="mct"): """ initialize an object >>> files = Files() >>> files.get_value('CASEFILE_HEADERS',resolved=False) '$CIMEROOT/config/config_headers.xml' """ cimeroot = get_cime_root() infile = os.path.join(cimeroot, "config", get_model(), "config_files.xml") expect(os.path.isfile(infile), "Could not find or open file {}".format(infile)) schema = os.path.join(cimeroot, "config", "xml_schemas", "entry_id.xsd") EntryID.__init__(self, infile, schema=schema) config_files_override = os.path.join(os.path.dirname(cimeroot),".config_files.xml") # variables COMP_ROOT_DIR_{} are mutable, all other variables are read only self.COMP_ROOT_DIR = {} self._comp_interface = comp_interface self._cpl_comp = {} # .config_file.xml at the top level may overwrite COMP_ROOT_DIR_ nodes in config_files if os.path.isfile(config_files_override): self.read(config_files_override) self.overwrite_existing_entries()
[docs] def get_value(self, vid, attribute=None, resolved=True, subgroup=None): if vid == "COMP_ROOT_DIR_CPL": if self._cpl_comp: attribute = self._cpl_comp elif attribute: self._cpl_comp = attribute else: self._cpl_comp['component'] = 'cpl' if "COMP_ROOT_DIR" in vid: if vid in self.COMP_ROOT_DIR: if attribute is not None: if vid+attribute["component"] in self.COMP_ROOT_DIR: return self.COMP_ROOT_DIR[vid+attribute["component"]] else: return self.COMP_ROOT_DIR[vid] newatt = {"comp_interface":self._comp_interface} if attribute: newatt.update(attribute) value = super(Files, self).get_value(vid, attribute=newatt, resolved=False, subgroup=subgroup) if value is None and attribute is not None: value = super(Files, self).get_value(vid, attribute=attribute, resolved=False, subgroup=subgroup) if value is None: value = super(Files, self).get_value(vid, attribute=None, resolved=False, subgroup=subgroup) if "COMP_ROOT_DIR" not in vid and value is not None and "COMP_ROOT_DIR" in value: m = re.search("(COMP_ROOT_DIR_[^/]+)/", value) comp_root_dir_var_name = m.group(1) newatt = {"comp_interface":self._comp_interface} if attribute: newatt.update(attribute) crd_node = self.scan_optional_child(comp_root_dir_var_name, attributes=newatt) if crd_node: comp_root_dir = self.get_value(comp_root_dir_var_name, attribute=newatt, resolved=False, subgroup=subgroup) else: comp_root_dir = self.get_value(comp_root_dir_var_name, attribute=attribute, resolved=False, subgroup=subgroup) self.set_value(comp_root_dir_var_name, comp_root_dir,subgroup=attribute) if resolved: value = value.replace("$"+comp_root_dir_var_name, comp_root_dir) if resolved and value is not None: value = value.replace("$COMP_INTERFACE", self._comp_interface) value = self.get_resolved_value(value) return value
[docs] def set_value(self, vid, value,subgroup=None,ignore_type=False): if "COMP_ROOT_DIR" in vid: if subgroup is not None: self.COMP_ROOT_DIR[vid+subgroup["component"]] = value else: self.COMP_ROOT_DIR[vid] = value else: expect(False, "Attempt to set a nonmutable variable {}".format(vid)) return value
[docs] def get_schema(self, nodename, attributes=None): node = self.get_optional_child("entry", {"id":nodename}) schemanode = self.get_optional_child("schema", root=node, attributes=attributes) if schemanode is not None: logger.debug("Found schema for {}".format(nodename)) return self.get_resolved_value(self.text(schemanode)) return None
[docs] def get_components(self, nodename): node = self.get_optional_child("entry", {"id":nodename}) if node is not None: valnodes = self.get_children("value", root=self.get_child("values", root=node)) values = [] for valnode in valnodes: value = self.get(valnode, "component") values.append(value) return values return None