def get_names(cf_coord_var, coord_name, attributes): """Determine the standard_name, long_name and var_name attributes.""" standard_name = getattr(cf_coord_var, CF_ATTR_STD_NAME, None) long_name = getattr(cf_coord_var, CF_ATTR_LONG_NAME, None) cf_name = str(cf_coord_var.cf_name) if standard_name is not None: try: standard_name = _get_valid_standard_name(standard_name) except ValueError: if long_name is not None: attributes["invalid_standard_name"] = standard_name if coord_name is not None: standard_name = coord_name else: standard_name = None else: if coord_name is not None: attributes["invalid_standard_name"] = standard_name standard_name = coord_name else: standard_name = None else: if coord_name is not None: standard_name = coord_name # Last attempt to set the standard name to something meaningful. if standard_name is None: if cf_name in iris.std_names.STD_NAMES: standard_name = cf_name return (standard_name, long_name, cf_name)
def build_cube_metadata(engine): """Add the standard meta data to the cube.""" cf_var = engine.cf_var cube = engine.cube # Determine the cube's name attributes cube.var_name = cf_var.cf_name standard_name = getattr(cf_var, CF_ATTR_STD_NAME, None) long_name = getattr(cf_var, CF_ATTR_LONG_NAME, None) cube.long_name = long_name if standard_name is not None: try: cube.standard_name = _get_valid_standard_name(standard_name) except ValueError: if cube.long_name is not None: cube.attributes["invalid_standard_name"] = standard_name else: cube.long_name = standard_name # Determine the cube units. attr_units = get_attr_units(cf_var, cube.attributes) cube.units = attr_units # Incorporate cell methods nc_att_cell_methods = getattr(cf_var, CF_ATTR_CELL_METHODS, None) with warnings.catch_warnings(record=True) as warning_records: cube.cell_methods = parse_cell_methods(nc_att_cell_methods) # Filter to get the warning we are interested in. warning_records = [ record for record in warning_records if issubclass(record.category, UnknownCellMethodWarning) ] if len(warning_records) > 0: # Output an enhanced warning message. warn_record = warning_records[0] name = "{}".format(cf_var.cf_name) msg = warn_record.message.args[0] msg = msg.replace("variable", "variable {!r}".format(name)) warnings.warn(message=msg, category=UnknownCellMethodWarning) # Set the cube global attributes. for attr_name, attr_value in cf_var.cf_group.global_attributes.items(): try: cube.attributes[str(attr_name)] = attr_value except ValueError as e: msg = "Skipping global attribute {!r}: {}" warnings.warn(msg.format(attr_name, str(e)))
def test_valid_standard_valid_name_modifier_extra_names(self): name = "air_temperature standard_error extra words" with self.assertRaisesRegex(ValueError, self.emsg.format(name)): _get_valid_standard_name(name)
def test_valid_standard_name_valid_modifier_extra_spaces(self): name = "air_temperature standard_error" self.assertEqual(_get_valid_standard_name(name), name)
def test_invalid_standard_name_valid_modifier(self): name = "not_a_standard_name standard_error" with self.assertRaisesRegex(ValueError, self.emsg.format(name)): _get_valid_standard_name(name)
def test_standard_name_alias(self): name = "atmosphere_optical_thickness_due_to_pm1_ambient_aerosol" self.assertEqual(_get_valid_standard_name(name), name)
def test_valid_standard_name(self): name = "air_temperature" self.assertEqual(_get_valid_standard_name(name), name)
def test_pass_thru_whitespace(self): name = " " self.assertEqual(_get_valid_standard_name(name), name)
def test_pass_thru_empty(self): name = "" self.assertEqual(_get_valid_standard_name(name), name)
def test_pass_thru_none(self): name = None self.assertEqual(_get_valid_standard_name(name), name)