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