Skip to content

Commit 0f3e386

Browse files
authored
Merge pull request #165 from opossum-tool/refactor-split-into-packages
Refactor: split into packages
2 parents 1e0cc35 + d3bcaac commit 0f3e386

25 files changed

+159
-127
lines changed

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ package = true
3939
warn_return_any = true
4040
warn_unused_configs = true
4141
disallow_untyped_defs = true
42+
mypy_path='src:tests'
4243

4344
[[tool.mypy.overrides]]
4445
module = [

src/opossum_lib/cli.py

+4-29
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,9 @@
1010
from pathlib import Path
1111

1212
import click
13-
from spdx_tools.spdx.model.document import Document as SpdxDocument
14-
from spdx_tools.spdx.parser.error import SPDXParsingError
15-
from spdx_tools.spdx.parser.parse_anything import parse_file
16-
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
1713

18-
from opossum_lib.file_generation import generate_json_file_from_tree, write_dict_to_file
19-
from opossum_lib.graph_generation import generate_graph_from_spdx
20-
from opossum_lib.tree_generation import generate_tree_from_graph
14+
from opossum_lib.opossum.file_generation import write_opossum_information_to_file
15+
from opossum_lib.spdx.convert_to_opossum import convert_spdx_to_opossum_information
2116

2217

2318
@click.group()
@@ -56,35 +51,15 @@ def generate(spdx: list[str], outfile: str) -> None:
5651
sys.exit(1)
5752

5853
the_spdx_file = spdx[0]
59-
try:
60-
document: SpdxDocument = parse_file(the_spdx_file)
61-
62-
except SPDXParsingError as err:
63-
log_string = "\n".join(
64-
["There have been issues while parsing the provided document:"]
65-
+ [message for message in err.get_messages()]
66-
)
67-
logging.error(log_string)
68-
sys.exit(1)
69-
validation_messages = validate_full_spdx_document(document)
70-
if validation_messages:
71-
logging.warning(
72-
"The given SPDX document is not valid, this might cause "
73-
"issues with the conversion."
74-
)
75-
76-
graph = generate_graph_from_spdx(document)
77-
tree = generate_tree_from_graph(graph)
78-
79-
opossum_information = generate_json_file_from_tree(tree)
54+
opossum_information = convert_spdx_to_opossum_information(the_spdx_file)
8055

8156
if not outfile.endswith(".opossum"):
8257
outfile += ".opossum"
8358

8459
if Path.is_file(Path(outfile)):
8560
logging.warning(f"{outfile} already exists and will be overwritten.")
8661

87-
write_dict_to_file(opossum_information, Path(outfile))
62+
write_opossum_information_to_file(opossum_information, Path(outfile))
8863

8964

9065
if __name__ == "__main__":

src/opossum_lib/opossum/__init__.py

Whitespace-only changes.

src/opossum_lib/opossum/constants.py

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
COMPRESSION_LEVEL = 5
+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
import json
5+
from dataclasses import fields
6+
from pathlib import Path
7+
from zipfile import ZIP_DEFLATED, ZipFile
8+
9+
from opossum_lib.opossum.constants import COMPRESSION_LEVEL
10+
from opossum_lib.opossum.opossum_file import (
11+
ExternalAttributionSource,
12+
Metadata,
13+
OpossumInformation,
14+
OpossumPackage,
15+
Resource,
16+
SourceInfo,
17+
)
18+
19+
20+
def write_opossum_information_to_file(
21+
opossum_information: OpossumInformation, file_path: Path
22+
) -> None:
23+
with ZipFile(
24+
file_path, "w", compression=ZIP_DEFLATED, compresslevel=COMPRESSION_LEVEL
25+
) as z:
26+
z.writestr("input.json", json.dumps(to_dict(opossum_information), indent=4))
27+
28+
29+
def to_dict(
30+
element: Resource
31+
| Metadata
32+
| OpossumPackage
33+
| OpossumInformation
34+
| SourceInfo
35+
| ExternalAttributionSource
36+
| str
37+
| int
38+
| bool
39+
| dict[str, OpossumPackage]
40+
| dict[str, list[str]]
41+
| list[str]
42+
| None,
43+
) -> dict | str | list[str] | bool | int | None:
44+
if isinstance(element, Resource):
45+
return element.to_dict()
46+
if isinstance(
47+
element,
48+
Metadata
49+
| OpossumPackage
50+
| OpossumInformation
51+
| SourceInfo
52+
| ExternalAttributionSource,
53+
):
54+
result = []
55+
for f in fields(element):
56+
value = to_dict(getattr(element, f.name))
57+
result.append((f.name, value))
58+
return {k: v for (k, v) in result if v is not None}
59+
elif isinstance(element, dict):
60+
return {k: to_dict(v) for k, v in element.items()}
61+
else:
62+
return element

src/opossum_lib/merger.py src/opossum_lib/opossum/merger.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# SPDX-License-Identifier: Apache-2.0
44
from typing import Any
55

6-
from opossum_lib.opossum_file import (
6+
from opossum_lib.opossum.opossum_file import (
77
OpossumInformation,
88
OpossumPackageIdentifier,
99
Resource,
File renamed without changes.

src/opossum_lib/spdx/__init__.py

Whitespace-only changes.

src/opossum_lib/attribution_generation.py src/opossum_lib/spdx/attribution_generation.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
from spdx_tools.spdx.writer.tagvalue.package_writer import write_package
1313
from spdx_tools.spdx.writer.tagvalue.snippet_writer import write_snippet
1414

15-
from opossum_lib.constants import (
15+
from opossum_lib.opossum.opossum_file import OpossumPackage, SourceInfo
16+
from opossum_lib.spdx.constants import (
1617
PURL,
1718
SPDX_FILE_IDENTIFIER,
1819
SPDX_PACKAGE_IDENTIFIER,
1920
SPDX_SNIPPET_IDENTIFIER,
2021
)
21-
from opossum_lib.opossum_file import OpossumPackage, SourceInfo
2222

2323

2424
def _get_purl(package: Package) -> str | None:

src/opossum_lib/constants.py src/opossum_lib/spdx/constants.py

-1
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,3 @@
55
SPDX_FILE_IDENTIFIER = "SPDX-File"
66
SPDX_PACKAGE_IDENTIFIER = "SPDX-Package"
77
SPDX_SNIPPET_IDENTIFIER = "SPDX-Snippet"
8-
COMPRESSION_LEVEL = 5

src/opossum_lib/file_generation.py src/opossum_lib/spdx/convert_to_opossum.py

+44-62
Original file line numberDiff line numberDiff line change
@@ -1,95 +1,77 @@
11
# SPDX-FileCopyrightText: TNG Technology Consulting GmbH <https://www.tngtech.com>
22
#
33
# SPDX-License-Identifier: Apache-2.0
4-
import json
4+
5+
import logging
6+
import sys
57
import uuid
6-
from dataclasses import fields
7-
from pathlib import Path
8-
from zipfile import ZIP_DEFLATED, ZipFile
98

109
from networkx import DiGraph, shortest_path
1110
from spdx_tools.spdx.model.document import CreationInfo
11+
from spdx_tools.spdx.model.document import Document as SpdxDocument
1212
from spdx_tools.spdx.model.file import File
1313
from spdx_tools.spdx.model.package import Package
1414
from spdx_tools.spdx.model.snippet import Snippet
15+
from spdx_tools.spdx.parser.error import SPDXParsingError
16+
from spdx_tools.spdx.parser.parse_anything import parse_file
17+
from spdx_tools.spdx.validation.document_validator import validate_full_spdx_document
1518

16-
from opossum_lib.attribution_generation import (
19+
from opossum_lib.opossum.opossum_file import (
20+
ExternalAttributionSource,
21+
Metadata,
22+
OpossumInformation,
23+
OpossumPackage,
24+
OpossumPackageIdentifier,
25+
Resource,
26+
ResourceType,
27+
SourceInfo,
28+
)
29+
from opossum_lib.spdx.attribution_generation import (
1730
create_document_attribution,
1831
create_file_attribution,
1932
create_package_attribution,
2033
create_snippet_attribution,
2134
)
22-
from opossum_lib.constants import (
23-
COMPRESSION_LEVEL,
35+
from opossum_lib.spdx.constants import (
2436
SPDX_FILE_IDENTIFIER,
2537
SPDX_PACKAGE_IDENTIFIER,
2638
SPDX_SNIPPET_IDENTIFIER,
2739
)
28-
from opossum_lib.helper_methods import (
40+
from opossum_lib.spdx.graph_generation import generate_graph_from_spdx
41+
from opossum_lib.spdx.helper_methods import (
2942
_create_file_path_from_graph_path,
3043
_get_source_for_graph_traversal,
3144
_node_represents_a_spdx_element,
3245
_replace_node_ids_with_labels_and_add_resource_type,
3346
_weakly_connected_component_sub_graphs,
3447
)
35-
from opossum_lib.opossum_file import (
36-
ExternalAttributionSource,
37-
Metadata,
38-
OpossumInformation,
39-
OpossumPackage,
40-
OpossumPackageIdentifier,
41-
Resource,
42-
ResourceType,
43-
SourceInfo,
44-
)
48+
from opossum_lib.spdx.tree_generation import generate_tree_from_graph
4549

4650

47-
def write_dict_to_file(
48-
opossum_information: OpossumInformation, file_path: Path
49-
) -> None:
50-
with ZipFile(
51-
file_path, "w", compression=ZIP_DEFLATED, compresslevel=COMPRESSION_LEVEL
52-
) as z:
53-
z.writestr("input.json", json.dumps(to_dict(opossum_information), indent=4))
54-
55-
56-
def to_dict(
57-
element: Resource
58-
| Metadata
59-
| OpossumPackage
60-
| OpossumInformation
61-
| SourceInfo
62-
| ExternalAttributionSource
63-
| str
64-
| int
65-
| bool
66-
| dict[str, OpossumPackage]
67-
| dict[str, list[str]]
68-
| list[str]
69-
| None,
70-
) -> dict | str | list[str] | bool | int | None:
71-
if isinstance(element, Resource):
72-
return element.to_dict()
73-
if isinstance(
74-
element,
75-
Metadata
76-
| OpossumPackage
77-
| OpossumInformation
78-
| SourceInfo
79-
| ExternalAttributionSource,
80-
):
81-
result = []
82-
for f in fields(element):
83-
value = to_dict(getattr(element, f.name))
84-
result.append((f.name, value))
85-
return {k: v for (k, v) in result if v is not None}
86-
elif isinstance(element, dict):
87-
return {k: to_dict(v) for k, v in element.items()}
88-
else:
89-
return element
51+
def convert_spdx_to_opossum_information(filename: str) -> OpossumInformation:
52+
try:
53+
document: SpdxDocument = parse_file(filename)
54+
55+
except SPDXParsingError as err:
56+
log_string = "\n".join(
57+
["There have been issues while parsing the provided document:"]
58+
+ [message for message in err.get_messages()]
59+
)
60+
logging.error(log_string)
61+
sys.exit(1)
62+
validation_messages = validate_full_spdx_document(document)
63+
if validation_messages:
64+
logging.warning(
65+
"The given SPDX document is not valid, this might cause "
66+
"issues with the conversion."
67+
)
68+
graph = generate_graph_from_spdx(document)
69+
tree = generate_tree_from_graph(graph)
70+
opossum_information = convert_tree_to_opossum_information(tree)
71+
return opossum_information
9072

9173

92-
def generate_json_file_from_tree(tree: DiGraph) -> OpossumInformation:
74+
def convert_tree_to_opossum_information(tree: DiGraph) -> OpossumInformation:
9375
metadata = create_metadata(tree)
9476
resources = Resource(type=ResourceType.TOP_LEVEL)
9577
resources_to_attributions: dict[str, list[str]] = dict()

src/opossum_lib/graph_generation.py src/opossum_lib/spdx/graph_generation.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from spdx_tools.spdx.model import File, Package, Snippet
88
from spdx_tools.spdx.model.document import CreationInfo, Document
99

10-
from opossum_lib.helper_methods import _node_represents_a_spdx_element
10+
from opossum_lib.spdx.helper_methods import _node_represents_a_spdx_element
1111

1212

1313
def generate_graph_from_spdx(document: Document) -> DiGraph:

src/opossum_lib/helper_methods.py src/opossum_lib/spdx/helper_methods.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from spdx_tools.spdx.constants import DOCUMENT_SPDX_ID
88
from spdx_tools.spdx.model import File, Package, Snippet
99

10-
from opossum_lib.opossum_file import ResourceType
10+
from opossum_lib.opossum.opossum_file import ResourceType
1111

1212

1313
def _get_source_for_graph_traversal(connected_subgraph: DiGraph) -> str | None:

src/opossum_lib/tree_generation.py src/opossum_lib/spdx/tree_generation.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from spdx_tools.spdx.model.file import File
99
from spdx_tools.spdx.model.package import Package
1010

11-
from opossum_lib.helper_methods import (
11+
from opossum_lib.spdx.helper_methods import (
1212
_get_source_for_graph_traversal,
1313
_weakly_connected_component_sub_graphs,
1414
)

tests/test_cli.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from spdx_tools.spdx.writer.write_anything import write_file
1212

1313
from opossum_lib.cli import generate
14-
from tests.helper_methods import _create_minimal_document
14+
from tests.test_spdx.helper_methods import _create_minimal_document
1515

1616

1717
@pytest.mark.parametrize("options", ["--outfile", "-o"])

tests/test_opossum/__init__.py

Whitespace-only changes.

tests/test_file_generation.py tests/test_opossum/test_file_generation.py

+13-8
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,19 @@
88
from spdx_tools.spdx.model.package import Package
99
from spdx_tools.spdx.parser.parse_anything import parse_file
1010

11-
from opossum_lib.constants import (
11+
from opossum_lib.opossum.opossum_file import (
12+
ExternalAttributionSource,
13+
OpossumInformation,
14+
)
15+
from opossum_lib.spdx.constants import (
1216
SPDX_FILE_IDENTIFIER,
1317
SPDX_PACKAGE_IDENTIFIER,
1418
SPDX_SNIPPET_IDENTIFIER,
1519
)
16-
from opossum_lib.file_generation import generate_json_file_from_tree
17-
from opossum_lib.graph_generation import generate_graph_from_spdx
18-
from opossum_lib.opossum_file import ExternalAttributionSource, OpossumInformation
19-
from opossum_lib.tree_generation import generate_tree_from_graph
20-
from tests.helper_methods import (
20+
from opossum_lib.spdx.convert_to_opossum import convert_tree_to_opossum_information
21+
from opossum_lib.spdx.graph_generation import generate_graph_from_spdx
22+
from opossum_lib.spdx.tree_generation import generate_tree_from_graph
23+
from tests.test_spdx.helper_methods import (
2124
_create_minimal_document,
2225
_generate_document_with_from_root_node_unreachable_file,
2326
)
@@ -233,12 +236,14 @@ def test_tree_generation_for_bigger_examples_spdx() -> None:
233236

234237

235238
def _get_opossum_information_from_file(file_name: str) -> OpossumInformation:
236-
document = parse_file(str(Path(__file__).resolve().parent / "data" / file_name))
239+
document = parse_file(
240+
str(Path(__file__).resolve().parent.parent / "data" / file_name)
241+
)
237242
return _get_opossum_information_from_document(document)
238243

239244

240245
def _get_opossum_information_from_document(document: Document) -> OpossumInformation:
241246
graph = generate_graph_from_spdx(document)
242247
tree = generate_tree_from_graph(graph)
243-
opossum_information = generate_json_file_from_tree(tree)
248+
opossum_information = convert_tree_to_opossum_information(tree)
244249
return opossum_information

0 commit comments

Comments
 (0)