spdx_tools.spdx.document_utils
1# SPDX-FileCopyrightText: 2022 spdx contributors 2# 3# SPDX-License-Identifier: Apache-2.0 4from copy import deepcopy 5 6from beartype.typing import Any, Dict, List, Union 7 8from spdx_tools.spdx.model import Document, File, Package, Snippet 9 10 11def get_contained_spdx_element_ids(document: Document) -> List[str]: 12 element_ids = [file.spdx_id for file in document.files] 13 element_ids.extend([package.spdx_id for package in document.packages]) 14 element_ids.extend([snippet.spdx_id for snippet in document.snippets]) 15 return element_ids 16 17 18def get_element_from_spdx_id(document: Document, spdx_id: str) -> Union[Package, File, Snippet, None]: 19 contained_spdx_elements: Dict[str, Union[Package, File, Snippet]] = get_contained_spdx_elements(document) 20 if spdx_id not in contained_spdx_elements: 21 return None 22 return contained_spdx_elements[spdx_id] 23 24 25def get_contained_spdx_elements(document: Document) -> Dict[str, Union[Package, File, Snippet]]: 26 contained_spdx_elements = {package.spdx_id: package for package in document.packages} 27 contained_spdx_elements.update({file.spdx_id: file for file in document.files}) 28 contained_spdx_elements.update({snippet.spdx_id: snippet for snippet in document.snippets}) 29 30 return contained_spdx_elements 31 32 33def create_document_without_duplicates(document: Document) -> Document: 34 document_without_duplicates = deepcopy(document) 35 for elements in [ 36 [document_without_duplicates.creation_info], 37 document_without_duplicates.files, 38 document_without_duplicates.packages, 39 document_without_duplicates.snippets, 40 document_without_duplicates.extracted_licensing_info, 41 ]: 42 for element in elements: 43 for key, value in element.__dict__.items(): 44 if isinstance(value, list): 45 value_without_duplicates = create_list_without_duplicates(value) 46 setattr(element, key, value_without_duplicates) 47 48 return document_without_duplicates 49 50 51def create_list_without_duplicates(list_with_potential_duplicates: List[Any]) -> List[Any]: 52 list_without_duplicates = [] 53 for element in list_with_potential_duplicates: 54 if element not in list_without_duplicates: 55 list_without_duplicates.append(element) 56 57 return list_without_duplicates
def
get_element_from_spdx_id( document: spdx_tools.spdx.model.document.Document, spdx_id: str) -> Union[spdx_tools.spdx.model.package.Package, spdx_tools.spdx.model.file.File, spdx_tools.spdx.model.snippet.Snippet, NoneType]:
19def get_element_from_spdx_id(document: Document, spdx_id: str) -> Union[Package, File, Snippet, None]: 20 contained_spdx_elements: Dict[str, Union[Package, File, Snippet]] = get_contained_spdx_elements(document) 21 if spdx_id not in contained_spdx_elements: 22 return None 23 return contained_spdx_elements[spdx_id]
def
get_contained_spdx_elements( document: spdx_tools.spdx.model.document.Document) -> dict[str, typing.Union[spdx_tools.spdx.model.package.Package, spdx_tools.spdx.model.file.File, spdx_tools.spdx.model.snippet.Snippet]]:
26def get_contained_spdx_elements(document: Document) -> Dict[str, Union[Package, File, Snippet]]: 27 contained_spdx_elements = {package.spdx_id: package for package in document.packages} 28 contained_spdx_elements.update({file.spdx_id: file for file in document.files}) 29 contained_spdx_elements.update({snippet.spdx_id: snippet for snippet in document.snippets}) 30 31 return contained_spdx_elements
def
create_document_without_duplicates( document: spdx_tools.spdx.model.document.Document) -> spdx_tools.spdx.model.document.Document:
34def create_document_without_duplicates(document: Document) -> Document: 35 document_without_duplicates = deepcopy(document) 36 for elements in [ 37 [document_without_duplicates.creation_info], 38 document_without_duplicates.files, 39 document_without_duplicates.packages, 40 document_without_duplicates.snippets, 41 document_without_duplicates.extracted_licensing_info, 42 ]: 43 for element in elements: 44 for key, value in element.__dict__.items(): 45 if isinstance(value, list): 46 value_without_duplicates = create_list_without_duplicates(value) 47 setattr(element, key, value_without_duplicates) 48 49 return document_without_duplicates
def
create_list_without_duplicates(list_with_potential_duplicates: list[typing.Any]) -> list[typing.Any]:
52def create_list_without_duplicates(list_with_potential_duplicates: List[Any]) -> List[Any]: 53 list_without_duplicates = [] 54 for element in list_with_potential_duplicates: 55 if element not in list_without_duplicates: 56 list_without_duplicates.append(element) 57 58 return list_without_duplicates