spdx_tools.spdx.validation.relationship_validator

 1# SPDX-FileCopyrightText: 2022 spdx contributors
 2#
 3# SPDX-License-Identifier: Apache-2.0
 4
 5from beartype.typing import List
 6
 7from spdx_tools.spdx.model import Document, Relationship, RelationshipType, SpdxNoAssertion, SpdxNone
 8from spdx_tools.spdx.validation.spdx_id_validators import validate_spdx_id
 9from spdx_tools.spdx.validation.validation_message import SpdxElementType, ValidationContext, ValidationMessage
10
11
12def validate_relationships(
13    relationships: List[Relationship], spdx_version: str, document: Document
14) -> List[ValidationMessage]:
15    validation_messages = []
16    for relationship in relationships:
17        validation_messages.extend(validate_relationship(relationship, spdx_version, document))
18
19    return validation_messages
20
21
22def validate_relationship(
23    relationship: Relationship, spdx_version: str, document: Document
24) -> List[ValidationMessage]:
25    validation_messages = []
26    context = ValidationContext(element_type=SpdxElementType.RELATIONSHIP, full_element=relationship)
27
28    relationship_type: RelationshipType = relationship.relationship_type
29
30    messages: List[str] = validate_spdx_id(relationship.spdx_element_id, document, check_document=True)
31    for message in messages:
32        validation_messages.append(ValidationMessage(message, context))
33
34    if relationship.related_spdx_element_id not in [SpdxNone(), SpdxNoAssertion()]:
35        messages: List[str] = validate_spdx_id(relationship.related_spdx_element_id, document, check_document=True)
36        for message in messages:
37            validation_messages.append(ValidationMessage(message, context))
38
39    if spdx_version == "SPDX-2.2":
40        if (
41            relationship_type == RelationshipType.SPECIFICATION_FOR
42            or relationship_type == RelationshipType.REQUIREMENT_DESCRIPTION_FOR
43        ):
44            validation_messages.append(ValidationMessage(f"{relationship_type} is not supported in SPDX-2.2", context))
45
46    return validation_messages
def validate_relationships( relationships: list[spdx_tools.spdx.model.relationship.Relationship], spdx_version: str, document: spdx_tools.spdx.model.document.Document) -> list[spdx_tools.spdx.validation.validation_message.ValidationMessage]:
13def validate_relationships(
14    relationships: List[Relationship], spdx_version: str, document: Document
15) -> List[ValidationMessage]:
16    validation_messages = []
17    for relationship in relationships:
18        validation_messages.extend(validate_relationship(relationship, spdx_version, document))
19
20    return validation_messages
23def validate_relationship(
24    relationship: Relationship, spdx_version: str, document: Document
25) -> List[ValidationMessage]:
26    validation_messages = []
27    context = ValidationContext(element_type=SpdxElementType.RELATIONSHIP, full_element=relationship)
28
29    relationship_type: RelationshipType = relationship.relationship_type
30
31    messages: List[str] = validate_spdx_id(relationship.spdx_element_id, document, check_document=True)
32    for message in messages:
33        validation_messages.append(ValidationMessage(message, context))
34
35    if relationship.related_spdx_element_id not in [SpdxNone(), SpdxNoAssertion()]:
36        messages: List[str] = validate_spdx_id(relationship.related_spdx_element_id, document, check_document=True)
37        for message in messages:
38            validation_messages.append(ValidationMessage(message, context))
39
40    if spdx_version == "SPDX-2.2":
41        if (
42            relationship_type == RelationshipType.SPECIFICATION_FOR
43            or relationship_type == RelationshipType.REQUIREMENT_DESCRIPTION_FOR
44        ):
45            validation_messages.append(ValidationMessage(f"{relationship_type} is not supported in SPDX-2.2", context))
46
47    return validation_messages