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_contained_spdx_element_ids(document: spdx_tools.spdx.model.document.Document) -> list[str]:
12def get_contained_spdx_element_ids(document: Document) -> List[str]:
13    element_ids = [file.spdx_id for file in document.files]
14    element_ids.extend([package.spdx_id for package in document.packages])
15    element_ids.extend([snippet.spdx_id for snippet in document.snippets])
16    return element_ids
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]
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