spdx_tools.spdx.parser.rdf.file_parser

 1# SPDX-FileCopyrightText: 2023 spdx contributors
 2#
 3# SPDX-License-Identifier: Apache-2.0
 4from beartype.typing import Union
 5from rdflib import RDFS, BNode, Graph, URIRef
 6
 7from spdx_tools.spdx.model import File, FileType
 8from spdx_tools.spdx.parser.logger import Logger
 9from spdx_tools.spdx.parser.parsing_functions import (
10    construct_or_raise_parsing_error,
11    raise_parsing_error_if_logger_has_messages,
12)
13from spdx_tools.spdx.parser.rdf.checksum_parser import parse_checksum
14from spdx_tools.spdx.parser.rdf.graph_parsing_functions import (
15    apply_parsing_method_or_log_error,
16    get_correctly_typed_triples,
17    get_correctly_typed_value,
18    parse_enum_value,
19    parse_literal,
20    parse_literal_or_no_assertion_or_none,
21    parse_spdx_id,
22)
23from spdx_tools.spdx.parser.rdf.license_expression_parser import parse_license_expression
24from spdx_tools.spdx.rdfschema.namespace import SPDX_NAMESPACE
25
26
27def parse_file(file_node: Union[URIRef, BNode], graph: Graph, doc_namespace: str) -> File:
28    logger = Logger()
29    spdx_id = parse_spdx_id(file_node, doc_namespace, graph)
30    name = parse_literal(logger, graph, file_node, SPDX_NAMESPACE.fileName)
31    checksums = []
32    for _, _, checksum_node in get_correctly_typed_triples(logger, graph, file_node, SPDX_NAMESPACE.checksum):
33        checksums.append(parse_checksum(checksum_node, graph))
34
35    file_types = []
36    for _, _, file_type_ref in graph.triples((file_node, SPDX_NAMESPACE.fileType, None)):
37        file_types.append(
38            apply_parsing_method_or_log_error(
39                logger, file_type_ref, parsing_method=lambda x: parse_enum_value(x, FileType, SPDX_NAMESPACE.fileType_)
40            )
41        )
42    license_concluded = parse_literal_or_no_assertion_or_none(
43        logger,
44        graph,
45        file_node,
46        SPDX_NAMESPACE.licenseConcluded,
47        parsing_method=lambda x: parse_license_expression(x, graph, doc_namespace, logger),
48    )
49    license_info_in_file = []
50    for _, _, license_info_from_files_node in graph.triples((file_node, SPDX_NAMESPACE.licenseInfoInFile, None)):
51        license_info_in_file.append(
52            get_correctly_typed_value(
53                logger,
54                license_info_from_files_node,
55                lambda x: parse_license_expression(x, graph, doc_namespace, logger),
56            )
57        )
58    license_comment = parse_literal(logger, graph, file_node, SPDX_NAMESPACE.licenseComments)
59    copyright_text = parse_literal_or_no_assertion_or_none(logger, graph, file_node, SPDX_NAMESPACE.copyrightText)
60    file_contributors = []
61    for _, _, file_contributor in get_correctly_typed_triples(
62        logger, graph, file_node, SPDX_NAMESPACE.fileContributor, None
63    ):
64        file_contributors.append(file_contributor.toPython())
65
66    notice_text = parse_literal(logger, graph, file_node, SPDX_NAMESPACE.noticeText)
67    comment = parse_literal(logger, graph, file_node, RDFS.comment)
68    attribution_texts = []
69    for _, _, attribution_text_literal in get_correctly_typed_triples(
70        logger, graph, file_node, SPDX_NAMESPACE.attributionText, None
71    ):
72        attribution_texts.append(attribution_text_literal.toPython())
73    raise_parsing_error_if_logger_has_messages(logger, "File")
74    file = construct_or_raise_parsing_error(
75        File,
76        dict(
77            name=name,
78            spdx_id=spdx_id,
79            checksums=checksums,
80            attribution_texts=attribution_texts,
81            comment=comment,
82            copyright_text=copyright_text,
83            file_types=file_types,
84            contributors=file_contributors,
85            license_comment=license_comment,
86            license_concluded=license_concluded,
87            license_info_in_file=license_info_in_file,
88            notice=notice_text,
89        ),
90    )
91    return file
def parse_file( file_node: Union[rdflib.term.URIRef, rdflib.term.BNode], graph: rdflib.graph.Graph, doc_namespace: str) -> spdx_tools.spdx.model.file.File:
28def parse_file(file_node: Union[URIRef, BNode], graph: Graph, doc_namespace: str) -> File:
29    logger = Logger()
30    spdx_id = parse_spdx_id(file_node, doc_namespace, graph)
31    name = parse_literal(logger, graph, file_node, SPDX_NAMESPACE.fileName)
32    checksums = []
33    for _, _, checksum_node in get_correctly_typed_triples(logger, graph, file_node, SPDX_NAMESPACE.checksum):
34        checksums.append(parse_checksum(checksum_node, graph))
35
36    file_types = []
37    for _, _, file_type_ref in graph.triples((file_node, SPDX_NAMESPACE.fileType, None)):
38        file_types.append(
39            apply_parsing_method_or_log_error(
40                logger, file_type_ref, parsing_method=lambda x: parse_enum_value(x, FileType, SPDX_NAMESPACE.fileType_)
41            )
42        )
43    license_concluded = parse_literal_or_no_assertion_or_none(
44        logger,
45        graph,
46        file_node,
47        SPDX_NAMESPACE.licenseConcluded,
48        parsing_method=lambda x: parse_license_expression(x, graph, doc_namespace, logger),
49    )
50    license_info_in_file = []
51    for _, _, license_info_from_files_node in graph.triples((file_node, SPDX_NAMESPACE.licenseInfoInFile, None)):
52        license_info_in_file.append(
53            get_correctly_typed_value(
54                logger,
55                license_info_from_files_node,
56                lambda x: parse_license_expression(x, graph, doc_namespace, logger),
57            )
58        )
59    license_comment = parse_literal(logger, graph, file_node, SPDX_NAMESPACE.licenseComments)
60    copyright_text = parse_literal_or_no_assertion_or_none(logger, graph, file_node, SPDX_NAMESPACE.copyrightText)
61    file_contributors = []
62    for _, _, file_contributor in get_correctly_typed_triples(
63        logger, graph, file_node, SPDX_NAMESPACE.fileContributor, None
64    ):
65        file_contributors.append(file_contributor.toPython())
66
67    notice_text = parse_literal(logger, graph, file_node, SPDX_NAMESPACE.noticeText)
68    comment = parse_literal(logger, graph, file_node, RDFS.comment)
69    attribution_texts = []
70    for _, _, attribution_text_literal in get_correctly_typed_triples(
71        logger, graph, file_node, SPDX_NAMESPACE.attributionText, None
72    ):
73        attribution_texts.append(attribution_text_literal.toPython())
74    raise_parsing_error_if_logger_has_messages(logger, "File")
75    file = construct_or_raise_parsing_error(
76        File,
77        dict(
78            name=name,
79            spdx_id=spdx_id,
80            checksums=checksums,
81            attribution_texts=attribution_texts,
82            comment=comment,
83            copyright_text=copyright_text,
84            file_types=file_types,
85            contributors=file_contributors,
86            license_comment=license_comment,
87            license_concluded=license_concluded,
88            license_info_in_file=license_info_in_file,
89            notice=notice_text,
90        ),
91    )
92    return file