forked from spdx/tools-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdict_parsing_functions.py
More file actions
82 lines (67 loc) · 2.78 KB
/
dict_parsing_functions.py
File metadata and controls
82 lines (67 loc) · 2.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# SPDX-FileCopyrightText: 2022 spdx contributors
#
# SPDX-License-Identifier: Apache-2.0
from beartype.typing import Any, Callable, Dict, List, Optional
from spdx_tools.spdx.model import SpdxNoAssertion, SpdxNone
from spdx_tools.spdx.parser.error import SPDXParsingError
from spdx_tools.spdx.parser.logger import Logger
from spdx_tools.spdx.parser.parsing_functions import raise_parsing_error_if_logger_has_messages
def json_str_to_enum_name(json_str: str) -> str:
if not isinstance(json_str, str):
raise SPDXParsingError([f"Type for enum must be str not {type(json_str).__name__}"])
return json_str.replace("-", "_").upper()
def parse_field_or_log_error(
logger: Logger,
field: Any,
parsing_method: Callable = lambda x: x,
default: Any | None = None,
field_is_list: bool = False,
) -> Any:
if not field:
return default
try:
if field_is_list:
return parse_list_of_elements(field, parsing_method)
else:
return parsing_method(field)
except SPDXParsingError as err:
logger.extend(err.get_messages())
except (TypeError, ValueError) as err:
logger.append(err.args[0])
return default
def append_parsed_field_or_log_error(
logger: Logger, list_to_append_to: List[Any], field: Any, method_to_parse: Callable
) -> List[Any]:
try:
parsed_element = method_to_parse(field)
list_to_append_to.append(parsed_element)
except SPDXParsingError as err:
logger.extend(err.get_messages())
except (TypeError, ValueError) as err:
logger.append(err.args[0])
return list_to_append_to
def parse_field_or_no_assertion_or_none(field: Optional[str], method_for_field: Callable = lambda x: x) -> Any:
if field == SpdxNoAssertion().__str__():
return SpdxNoAssertion()
elif field == SpdxNone().__str__():
return SpdxNone()
else:
return method_for_field(field)
def parse_field_or_no_assertion(field: Optional[str], method_for_field: Callable = lambda x: x) -> Any:
if field == SpdxNoAssertion().__str__():
return SpdxNoAssertion()
else:
return method_for_field(field)
def parse_list_of_elements(list_of_elements: List[Dict], method_to_parse_element: Callable, logger=None) -> List[Any]:
if not logger:
logger = Logger()
parsed_elements = []
for element_dict in list_of_elements:
parsed_elements = append_parsed_field_or_log_error(
logger, parsed_elements, element_dict, method_to_parse_element
)
raise_parsing_error_if_logger_has_messages(logger)
return parsed_elements
def delete_duplicates_from_list(list_with_potential_duplicates: List[Any]) -> List[Any]:
list_without_duplicates = list(dict.fromkeys(list_with_potential_duplicates))
return list_without_duplicates