Skip to content
Merged
58 changes: 43 additions & 15 deletions py_mmd_tools/nc_to_mmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -1601,6 +1601,20 @@ def get_license(self, mmd_element, ncin):

return data

def well_formed_parent(self, parent):
if ":" not in parent:
raise ValueError(
"parent must be composed as <%s>:<uuid>" % self.ACDD_NAMING_AUTH
)
nauth, uuid = parent.split(":")
if nauth not in self.VALID_NAMING_AUTHORITIES:
raise ValueError(
"%s ACDD attribute %s is not valid" % (self.ACDD_NAMING_AUTH, nauth)
)
if not Nc_to_mmd.is_valid_uuid(uuid):
raise ValueError("UUID part of the parent ID is not valid")
return True

def to_mmd(
self,
collection=None,
Expand Down Expand Up @@ -1752,21 +1766,35 @@ def to_mmd(
)
# Add parent from function kwarg
if parent is not None:
if ":" not in parent:
raise ValueError("parent must be composed as <%s>:<uuid>" % self.ACDD_NAMING_AUTH)
nauth, uuid = parent.split(":")
if nauth not in self.VALID_NAMING_AUTHORITIES:
raise ValueError(
"%s ACDD attribute %s is not valid" % (self.ACDD_NAMING_AUTH, nauth)
)
if not Nc_to_mmd.is_valid_uuid(uuid):
raise ValueError("UUID part of the parent ID is not valid")
self.metadata["related_dataset"].append(
{
"id": parent,
"relation_type": "parent",
}
)
if self.well_formed_parent(parent):
rel_dat = self.metadata["related_dataset"]
if (
rel_dat and "parent" == rel_dat[0]["relation_type"]
):
parent_from_nc_file = rel_dat[0]["id"]
self.missing_attributes["warnings"].append(
"Parent identifier already in place: %s" % (parent_from_nc_file)
Comment thread
mortenwh marked this conversation as resolved.
Outdated
)
if self.well_formed_parent(parent_from_nc_file):
if parent_from_nc_file.split(":")[1] != parent.split(":")[1]:
self.missing_attributes["warnings"].append(
"The passed parent UUID %s does not match "
"the one provided in the netcdf file "
"(%s). Using the one provided as keyword argument."
% (parent, parent_from_nc_file)
)
else:
self.missing_attributes["warnings"].append(
"The passed parent id %s is already provided in the netcdf file, "
"no need to update it" % (parent)
)
else:
self.metadata["related_dataset"].append(
{
"id": parent,
"relation_type": "parent",
}
)

self.metadata["related_information"] = self.get_related_information(
mmd_yaml.pop("related_information"), ncin
Expand Down
Binary file added tests/data/reference_nc_withparent.nc
Binary file not shown.
Binary file added tests/data/reference_nc_withparentmalformed.nc
Binary file not shown.
20 changes: 20 additions & 0 deletions tests/test_nc_to_mmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,26 @@ def test_parent_keyword_arg(dataDir):
req, msg = md.to_mmd(parent="no.met:not-a-uuid")
assert str(ve.value) == "UUID part of the parent ID is not valid"

# pre-existing parent
md = Nc_to_mmd(os.path.join(dataDir, "reference_nc_withparent.nc"), check_only=True)
req, msg = md.to_mmd(parent="no.met:654e8acf-77b1-4f53-b6bf-0cd6cf94e646")
# print(md.missing_attributes["warnings"])
assert "no need to update" in md.missing_attributes["warnings"][2]

# pre-existing parent but malformed
md = Nc_to_mmd(
os.path.join(dataDir, "reference_nc_withparentmalformed.nc"), check_only=True
)
with pytest.raises(ValueError) as ve:
req, msg = md.to_mmd(parent="no.met:654e8acf-77b1-4f53-b6bf-0cd6cf94e646")
assert str(ve.value) == "naming_authority ACDD attribute no.kvet is not valid"
assert "Parent identifier already in place" in md.missing_attributes["warnings"][1]

# pre-existing parent but different
md = Nc_to_mmd(os.path.join(dataDir, "reference_nc_withparent.nc"), check_only=True)
req, msg = md.to_mmd(parent="no.met:bce66800-1722-495e-975b-6033abb4da7d")
assert "Using the one provided as keyword argument" in md.missing_attributes["warnings"][2]


@pytest.mark.py_mmd_tools
def test_file_location_in_overrides(dataDir):
Expand Down