spdx_tools.spdx.validation.snippet_validator

  1# SPDX-FileCopyrightText: 2022 spdx contributors
  2#
  3# SPDX-License-Identifier: Apache-2.0
  4
  5from beartype.typing import List, Optional
  6
  7from spdx_tools.spdx.model import Document, Snippet
  8from spdx_tools.spdx.validation.license_expression_validator import (
  9    validate_license_expression,
 10    validate_license_expressions,
 11)
 12from spdx_tools.spdx.validation.spdx_id_validators import validate_spdx_id
 13from spdx_tools.spdx.validation.validation_message import SpdxElementType, ValidationContext, ValidationMessage
 14
 15
 16def validate_snippets(
 17    snippets: List[Snippet], spdx_version: str, document: Optional[Document] = None
 18) -> List[ValidationMessage]:
 19    validation_messages = []
 20    if document:
 21        for snippet in snippets:
 22            validation_messages.extend(validate_snippet_within_document(snippet, spdx_version, document))
 23    else:
 24        for snippet in snippets:
 25            validation_messages.extend(validate_snippet(snippet, spdx_version))
 26
 27    return validation_messages
 28
 29
 30def validate_snippet_within_document(
 31    snippet: Snippet, spdx_version: str, document: Document
 32) -> List[ValidationMessage]:
 33    validation_messages: List[ValidationMessage] = []
 34    context = ValidationContext(
 35        spdx_id=snippet.spdx_id,
 36        parent_id=document.creation_info.spdx_id,
 37        element_type=SpdxElementType.SNIPPET,
 38        full_element=snippet,
 39    )
 40
 41    messages: List[str] = validate_spdx_id(snippet.spdx_id, document)
 42    for message in messages:
 43        validation_messages.append(ValidationMessage(message, context))
 44
 45    messages: List[str] = validate_spdx_id(snippet.file_spdx_id, document, check_files=True)
 46    for message in messages:
 47        validation_messages.append(ValidationMessage(message, context))
 48
 49    validation_messages.extend(validate_license_expression(snippet.license_concluded, document, snippet.spdx_id))
 50
 51    validation_messages.extend(
 52        validate_license_expressions(snippet.license_info_in_snippet, document, snippet.spdx_id)
 53    )
 54
 55    validation_messages.extend(validate_snippet(snippet, spdx_version, context))
 56
 57    return validation_messages
 58
 59
 60def validate_snippet(
 61    snippet: Snippet, spdx_version: str, context: Optional[ValidationContext] = None
 62) -> List[ValidationMessage]:
 63    validation_messages = []
 64    if not context:
 65        context = ValidationContext(
 66            spdx_id=snippet.spdx_id, element_type=SpdxElementType.SNIPPET, full_element=snippet
 67        )
 68
 69    if snippet.byte_range[0] < 1:
 70        validation_messages.append(
 71            ValidationMessage(
 72                f"byte_range values must be greater than or equal to 1, but is: {snippet.byte_range}", context
 73            )
 74        )
 75
 76    if snippet.byte_range[0] > snippet.byte_range[1]:
 77        validation_messages.append(
 78            ValidationMessage(
 79                f"the first value of byte_range must be less than or equal to the second, but is: "
 80                f"{snippet.byte_range}",
 81                context,
 82            )
 83        )
 84
 85    if snippet.line_range:
 86        if snippet.line_range[0] < 1:
 87            validation_messages.append(
 88                ValidationMessage(
 89                    f"line_range values must be greater than or equal to 1, but is: {snippet.line_range}", context
 90                )
 91            )
 92
 93        if snippet.line_range[0] > snippet.line_range[1]:
 94            validation_messages.append(
 95                ValidationMessage(
 96                    f"the first value of line_range must be less than or equal to the second, "
 97                    f"but is: {snippet.line_range}",
 98                    context,
 99                )
100            )
101
102    if spdx_version == "SPDX-2.2":
103        if snippet.license_concluded is None:
104            validation_messages.append(ValidationMessage("license_concluded is mandatory in SPDX-2.2", context))
105        if snippet.copyright_text is None:
106            validation_messages.append(ValidationMessage("copyright_text is mandatory in SPDX-2.2", context))
107
108    return validation_messages
def validate_snippets( snippets: list[spdx_tools.spdx.model.snippet.Snippet], spdx_version: str, document: Optional[spdx_tools.spdx.model.document.Document] = None) -> list[spdx_tools.spdx.validation.validation_message.ValidationMessage]:
17def validate_snippets(
18    snippets: List[Snippet], spdx_version: str, document: Optional[Document] = None
19) -> List[ValidationMessage]:
20    validation_messages = []
21    if document:
22        for snippet in snippets:
23            validation_messages.extend(validate_snippet_within_document(snippet, spdx_version, document))
24    else:
25        for snippet in snippets:
26            validation_messages.extend(validate_snippet(snippet, spdx_version))
27
28    return validation_messages
def validate_snippet_within_document( snippet: spdx_tools.spdx.model.snippet.Snippet, spdx_version: str, document: spdx_tools.spdx.model.document.Document) -> list[spdx_tools.spdx.validation.validation_message.ValidationMessage]:
31def validate_snippet_within_document(
32    snippet: Snippet, spdx_version: str, document: Document
33) -> List[ValidationMessage]:
34    validation_messages: List[ValidationMessage] = []
35    context = ValidationContext(
36        spdx_id=snippet.spdx_id,
37        parent_id=document.creation_info.spdx_id,
38        element_type=SpdxElementType.SNIPPET,
39        full_element=snippet,
40    )
41
42    messages: List[str] = validate_spdx_id(snippet.spdx_id, document)
43    for message in messages:
44        validation_messages.append(ValidationMessage(message, context))
45
46    messages: List[str] = validate_spdx_id(snippet.file_spdx_id, document, check_files=True)
47    for message in messages:
48        validation_messages.append(ValidationMessage(message, context))
49
50    validation_messages.extend(validate_license_expression(snippet.license_concluded, document, snippet.spdx_id))
51
52    validation_messages.extend(
53        validate_license_expressions(snippet.license_info_in_snippet, document, snippet.spdx_id)
54    )
55
56    validation_messages.extend(validate_snippet(snippet, spdx_version, context))
57
58    return validation_messages
 61def validate_snippet(
 62    snippet: Snippet, spdx_version: str, context: Optional[ValidationContext] = None
 63) -> List[ValidationMessage]:
 64    validation_messages = []
 65    if not context:
 66        context = ValidationContext(
 67            spdx_id=snippet.spdx_id, element_type=SpdxElementType.SNIPPET, full_element=snippet
 68        )
 69
 70    if snippet.byte_range[0] < 1:
 71        validation_messages.append(
 72            ValidationMessage(
 73                f"byte_range values must be greater than or equal to 1, but is: {snippet.byte_range}", context
 74            )
 75        )
 76
 77    if snippet.byte_range[0] > snippet.byte_range[1]:
 78        validation_messages.append(
 79            ValidationMessage(
 80                f"the first value of byte_range must be less than or equal to the second, but is: "
 81                f"{snippet.byte_range}",
 82                context,
 83            )
 84        )
 85
 86    if snippet.line_range:
 87        if snippet.line_range[0] < 1:
 88            validation_messages.append(
 89                ValidationMessage(
 90                    f"line_range values must be greater than or equal to 1, but is: {snippet.line_range}", context
 91                )
 92            )
 93
 94        if snippet.line_range[0] > snippet.line_range[1]:
 95            validation_messages.append(
 96                ValidationMessage(
 97                    f"the first value of line_range must be less than or equal to the second, "
 98                    f"but is: {snippet.line_range}",
 99                    context,
100                )
101            )
102
103    if spdx_version == "SPDX-2.2":
104        if snippet.license_concluded is None:
105            validation_messages.append(ValidationMessage("license_concluded is mandatory in SPDX-2.2", context))
106        if snippet.copyright_text is None:
107            validation_messages.append(ValidationMessage("copyright_text is mandatory in SPDX-2.2", context))
108
109    return validation_messages