spdx_tools.spdx.parser.jsonlikedict.file_parser
1# SPDX-FileCopyrightText: 2022 spdx contributors 2# 3# SPDX-License-Identifier: Apache-2.0 4from beartype.typing import Dict, List, Optional, Union 5from license_expression import LicenseExpression 6 7from spdx_tools.spdx.model import Checksum, File, FileType, SpdxNoAssertion, SpdxNone 8from spdx_tools.spdx.parser.jsonlikedict.checksum_parser import ChecksumParser 9from spdx_tools.spdx.parser.jsonlikedict.dict_parsing_functions import ( 10 parse_field_or_log_error, 11 parse_field_or_no_assertion_or_none, 12) 13from spdx_tools.spdx.parser.jsonlikedict.license_expression_parser import LicenseExpressionParser 14from spdx_tools.spdx.parser.logger import Logger 15from spdx_tools.spdx.parser.parsing_functions import ( 16 construct_or_raise_parsing_error, 17 raise_parsing_error_if_logger_has_messages, 18) 19 20 21class FileParser: 22 logger: Logger 23 checksum_parser: ChecksumParser 24 license_expression_parser: LicenseExpressionParser 25 26 def __init__(self): 27 self.logger = Logger() 28 self.checksum_parser = ChecksumParser() 29 self.license_expression_parser = LicenseExpressionParser() 30 31 def parse_file(self, file_dict: Dict) -> Optional[File]: 32 logger = Logger() 33 name: Optional[str] = file_dict.get("fileName") 34 spdx_id: Optional[str] = file_dict.get("SPDXID") 35 checksums_list: List[Dict] = file_dict.get("checksums") 36 checksums: List[Checksum] = parse_field_or_log_error( 37 logger, checksums_list, self.checksum_parser.parse_checksum, field_is_list=True 38 ) 39 40 attribution_texts: List[str] = file_dict.get("attributionTexts", []) 41 comment: Optional[str] = file_dict.get("comment") 42 copyright_text: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = parse_field_or_no_assertion_or_none( 43 file_dict.get("copyrightText") 44 ) 45 file_contributors: List[str] = file_dict.get("fileContributors", []) 46 file_types: List[FileType] = parse_field_or_log_error( 47 logger, file_dict.get("fileTypes"), self.parse_file_types 48 ) 49 50 license_comments: Optional[str] = file_dict.get("licenseComments") 51 52 license_concluded: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error( 53 logger, file_dict.get("licenseConcluded"), self.license_expression_parser.parse_license_expression 54 ) 55 56 license_info_in_files: List[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error( 57 logger, 58 file_dict.get("licenseInfoInFiles"), 59 self.license_expression_parser.parse_license_expression, 60 field_is_list=True, 61 ) 62 notice_text: Optional[str] = file_dict.get("noticeText") 63 raise_parsing_error_if_logger_has_messages(logger, "File") 64 65 file = construct_or_raise_parsing_error( 66 File, 67 dict( 68 name=name, 69 spdx_id=spdx_id, 70 checksums=checksums, 71 attribution_texts=attribution_texts, 72 comment=comment, 73 copyright_text=copyright_text, 74 file_types=file_types, 75 contributors=file_contributors, 76 license_comment=license_comments, 77 license_concluded=license_concluded, 78 license_info_in_file=license_info_in_files, 79 notice=notice_text, 80 ), 81 ) 82 return file 83 84 @staticmethod 85 def parse_file_types(file_types_list: List[str]) -> List[FileType]: 86 logger = Logger() 87 file_types = [] 88 for file_type in file_types_list: 89 try: 90 file_type = FileType[file_type] 91 except KeyError: 92 logger.append(f"Invalid FileType: {file_type}") 93 continue 94 file_types.append(file_type) 95 raise_parsing_error_if_logger_has_messages(logger, "FileType") 96 return file_types
class
FileParser:
22class FileParser: 23 logger: Logger 24 checksum_parser: ChecksumParser 25 license_expression_parser: LicenseExpressionParser 26 27 def __init__(self): 28 self.logger = Logger() 29 self.checksum_parser = ChecksumParser() 30 self.license_expression_parser = LicenseExpressionParser() 31 32 def parse_file(self, file_dict: Dict) -> Optional[File]: 33 logger = Logger() 34 name: Optional[str] = file_dict.get("fileName") 35 spdx_id: Optional[str] = file_dict.get("SPDXID") 36 checksums_list: List[Dict] = file_dict.get("checksums") 37 checksums: List[Checksum] = parse_field_or_log_error( 38 logger, checksums_list, self.checksum_parser.parse_checksum, field_is_list=True 39 ) 40 41 attribution_texts: List[str] = file_dict.get("attributionTexts", []) 42 comment: Optional[str] = file_dict.get("comment") 43 copyright_text: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = parse_field_or_no_assertion_or_none( 44 file_dict.get("copyrightText") 45 ) 46 file_contributors: List[str] = file_dict.get("fileContributors", []) 47 file_types: List[FileType] = parse_field_or_log_error( 48 logger, file_dict.get("fileTypes"), self.parse_file_types 49 ) 50 51 license_comments: Optional[str] = file_dict.get("licenseComments") 52 53 license_concluded: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error( 54 logger, file_dict.get("licenseConcluded"), self.license_expression_parser.parse_license_expression 55 ) 56 57 license_info_in_files: List[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error( 58 logger, 59 file_dict.get("licenseInfoInFiles"), 60 self.license_expression_parser.parse_license_expression, 61 field_is_list=True, 62 ) 63 notice_text: Optional[str] = file_dict.get("noticeText") 64 raise_parsing_error_if_logger_has_messages(logger, "File") 65 66 file = construct_or_raise_parsing_error( 67 File, 68 dict( 69 name=name, 70 spdx_id=spdx_id, 71 checksums=checksums, 72 attribution_texts=attribution_texts, 73 comment=comment, 74 copyright_text=copyright_text, 75 file_types=file_types, 76 contributors=file_contributors, 77 license_comment=license_comments, 78 license_concluded=license_concluded, 79 license_info_in_file=license_info_in_files, 80 notice=notice_text, 81 ), 82 ) 83 return file 84 85 @staticmethod 86 def parse_file_types(file_types_list: List[str]) -> List[FileType]: 87 logger = Logger() 88 file_types = [] 89 for file_type in file_types_list: 90 try: 91 file_type = FileType[file_type] 92 except KeyError: 93 logger.append(f"Invalid FileType: {file_type}") 94 continue 95 file_types.append(file_type) 96 raise_parsing_error_if_logger_has_messages(logger, "FileType") 97 return file_types
checksum_parser: spdx_tools.spdx.parser.jsonlikedict.checksum_parser.ChecksumParser
license_expression_parser: spdx_tools.spdx.parser.jsonlikedict.license_expression_parser.LicenseExpressionParser
32 def parse_file(self, file_dict: Dict) -> Optional[File]: 33 logger = Logger() 34 name: Optional[str] = file_dict.get("fileName") 35 spdx_id: Optional[str] = file_dict.get("SPDXID") 36 checksums_list: List[Dict] = file_dict.get("checksums") 37 checksums: List[Checksum] = parse_field_or_log_error( 38 logger, checksums_list, self.checksum_parser.parse_checksum, field_is_list=True 39 ) 40 41 attribution_texts: List[str] = file_dict.get("attributionTexts", []) 42 comment: Optional[str] = file_dict.get("comment") 43 copyright_text: Optional[Union[str, SpdxNoAssertion, SpdxNone]] = parse_field_or_no_assertion_or_none( 44 file_dict.get("copyrightText") 45 ) 46 file_contributors: List[str] = file_dict.get("fileContributors", []) 47 file_types: List[FileType] = parse_field_or_log_error( 48 logger, file_dict.get("fileTypes"), self.parse_file_types 49 ) 50 51 license_comments: Optional[str] = file_dict.get("licenseComments") 52 53 license_concluded: Optional[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error( 54 logger, file_dict.get("licenseConcluded"), self.license_expression_parser.parse_license_expression 55 ) 56 57 license_info_in_files: List[Union[LicenseExpression, SpdxNoAssertion, SpdxNone]] = parse_field_or_log_error( 58 logger, 59 file_dict.get("licenseInfoInFiles"), 60 self.license_expression_parser.parse_license_expression, 61 field_is_list=True, 62 ) 63 notice_text: Optional[str] = file_dict.get("noticeText") 64 raise_parsing_error_if_logger_has_messages(logger, "File") 65 66 file = construct_or_raise_parsing_error( 67 File, 68 dict( 69 name=name, 70 spdx_id=spdx_id, 71 checksums=checksums, 72 attribution_texts=attribution_texts, 73 comment=comment, 74 copyright_text=copyright_text, 75 file_types=file_types, 76 contributors=file_contributors, 77 license_comment=license_comments, 78 license_concluded=license_concluded, 79 license_info_in_file=license_info_in_files, 80 notice=notice_text, 81 ), 82 ) 83 return file
@staticmethod
def
parse_file_types(file_types_list: list[str]) -> list[spdx_tools.spdx.model.file.FileType]:
85 @staticmethod 86 def parse_file_types(file_types_list: List[str]) -> List[FileType]: 87 logger = Logger() 88 file_types = [] 89 for file_type in file_types_list: 90 try: 91 file_type = FileType[file_type] 92 except KeyError: 93 logger.append(f"Invalid FileType: {file_type}") 94 continue 95 file_types.append(file_type) 96 raise_parsing_error_if_logger_has_messages(logger, "FileType") 97 return file_types