def __init__(self, code_root=None, unittest=False): self._unittest = unittest self.conventions = util.WormDict() self.aliases = util.WormDict() self.modifier = util.read_json(os.path.join(code_root, 'data', 'modifiers.jsonc'), log=_log)
def from_struct(cls, d): def _process_coord(section_name, d, temp_d): # build two-stage lookup table (by axis type, then standard name) section_d = d.pop(section_name, dict()) for k, v in section_d.items(): ax = v['axis'] entry = data_model.coordinate_from_struct(v, name=k) d['axes'][k] = entry temp_d[ax][entry.standard_name] = entry return (d, temp_d) def _process_var(section_name, d, temp_d): # build two-stage lookup table (by standard name, then data # dimensionality) section_d = d.pop(section_name, dict()) for k, v in section_d.items(): entry = FieldlistEntry.from_struct(d['axes'], name=k, **v) d['entries'][k] = entry temp_d[entry.standard_name][entry.modifier] = entry return (d, temp_d) temp_d = collections.defaultdict(util.WormDict) d['axes'] = util.WormDict() d['axes_lut'] = util.WormDict() d, temp_d = _process_coord('coords', d, temp_d) d['axes_lut'].update(temp_d) temp_d = collections.defaultdict(util.WormDict) d['entries'] = util.WormDict() d['lut'] = util.WormDict() d, temp_d = _process_var('aux_coords', d, temp_d) d, temp_d = _process_var('variables', d, temp_d) d['lut'].update(temp_d) return cls(**d)
def __init__(self, code_root=None, unittest=False): self._unittest = unittest self.conventions = util.WormDict() self.aliases = util.WormDict() if unittest: # value not used, when we're testing will mock out call to read_json # below with actual translation table to use for test config_files = [] else: glob_pattern = os.path.join( code_root, 'data', 'fieldlist_*.jsonc' ) config_files = glob.glob(glob_pattern) for f in config_files: try: d = util.read_json(f) self.add_convention(d) except Exception as exc: _log.exception("Caught exception loading fieldlist file %s: %r", f, exc) continue
def build_axes(self, *coords, verify=True): """Constructs a dict mapping axes labels to dimension coordinates (of type :class:`AbstractDMCoordinate`.) """ if verify: # validate that we don't have duplicate axes d = util.WormDict() verify_d = util.WormDict() for c in itertools.chain(*coords): if c.axis != 'OTHER' and c.axis in verify_d: err_name = getattr(self, 'name', self.__class__.__name__) raise ValueError((f"Duplicate definition of {c.axis} axis in " f"{err_name}: {c}, {verify_d[c.axis]}")) verify_d[c.axis] = c if c.axis in _AXIS_NAMES: d[c.axis] = c return d else: # assume we've already verified, so use a quicker version of same logic return {c.axis: c for c in itertools.chain(*coords) \ if c.axis in _AXIS_NAMES}
def __post_init__(self, coords=None): super(VarlistEntry, self).__post_init__(coords) # (re)initialize mutable fields here so that if we copy VE (eg with .replace) # the fields on the copy won't point to the same object as the fields on # the original. self.translation = None self.remote_data: util.WormDict() self.local_data = [] if self.active == util.NOTSET: self.active = ( self.requirement == VarlistEntryRequirement.REQUIRED) # env_vars if not self.env_var: self.env_var = self.name + _var_name_env_var_suffix if not self.path_variable: self.path_variable = self.name.upper() + _file_env_var_suffix # self.alternates is either [] or a list of nonempty lists of VEs if self.alternates: if not isinstance(self.alternates[0], list): self.alternates = [self.alternates] self.alternates = [vs for vs in self.alternates if vs]