diff --git a/swh/model/identifiers.py b/swh/model/identifiers.py --- a/swh/model/identifiers.py +++ b/swh/model/identifiers.py @@ -800,6 +800,9 @@ return str(swhid) +CONTEXT_QUALIFIERS = {"origin", "anchor", "visit", "path", "lines"} + + def parse_swhid(swhid: str) -> SWHID: """Parse :ref:`persistent-identifiers`. @@ -845,13 +848,22 @@ _metadata = {} for part in swhid_parts: try: - key, val = part.split("=") - _metadata[key] = val + qualifier, val = part.split("=") + _metadata[qualifier] = val except Exception: raise ValidationError( "Invalid SWHID: contextual data must be a ;-separated list of " " key=value pairs" ) + + wrong_qualifiers = set(_metadata) - set(CONTEXT_QUALIFIERS) + if wrong_qualifiers: + error_msg = ( + f"Invalid SWHID: Wrong qualifiers {', '.join(wrong_qualifiers)}. " + f"The qualifiers must be one of {', '.join(CONTEXT_QUALIFIERS)}" + ) + raise ValidationError(error_msg) + return SWHID( _ns, int(_version), diff --git a/swh/model/tests/test_identifiers.py b/swh/model/tests/test_identifiers.py --- a/swh/model/tests/test_identifiers.py +++ b/swh/model/tests/test_identifiers.py @@ -1059,6 +1059,16 @@ "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;invalid;malformed", "swh:1:snp:gh6959356d30f1a4e9b7f6bca59b9a336464c03d", "swh:1:snp:foo", + # wrong qualifier: ori should be origin + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;ori=something;anchor=1;visit=1;path=/", # noqa + # wrong qualifier: anc should be anchor + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin=something;anc=1;visit=1;path=/", # noqa + # wrong qualifier: vis should be visit + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin=something;anchor=1;vis=1;path=/", # noqa + # wrong qualifier: pa should be path + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;origin=something;anchor=1;visit=1;pa=/", # noqa + # wrong qualifier: line should be lines + "swh:1:dir:0b6959356d30f1a4e9b7f6bca59b9a336464c03d;line=10;origin=something;anchor=1;visit=1;path=/", # noqa ], ) def test_parse_swhid_parsing_error(invalid_swhid):