Skip to content

Commit 172e4b2

Browse files
committed
[issue-514] fix writing of multiple packages to rdf files
Signed-off-by: Meret Behrens <[email protected]>
1 parent b0d946b commit 172e4b2

File tree

4 files changed

+40
-16
lines changed

4 files changed

+40
-16
lines changed

spdx/writers/rdf.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -793,18 +793,9 @@ def create_package_node(self, package):
793793
Return a Node representing the package.
794794
Files must have been added to the graph before this method is called.
795795
"""
796-
package_node = URIRef("http://www.spdx.org/tools#SPDXRef-Package")
796+
package_node = URIRef(f"http://www.spdx.org/tools#{package.spdx_id}")
797797
type_triple = (package_node, RDF.type, self.spdx_namespace.Package)
798798
self.graph.add(type_triple)
799-
# Package SPDXID
800-
if package.spdx_id:
801-
pkg_spdx_id = URIRef(package.spdx_id)
802-
pkg_spdx_id_triple = (
803-
package_node,
804-
self.spdx_namespace.Package,
805-
pkg_spdx_id,
806-
)
807-
self.graph.add(pkg_spdx_id_triple)
808799
# Handle optional fields:
809800
self.handle_pkg_optional_fields(package, package_node)
810801
# package name

tests/data/doc_write/rdf-simple-plus.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
"ns1:describesPackage": {
77
"ns1:Package": {
88
"@rdf:about": "http://www.spdx.org/tools#SPDXRef-Package",
9-
"ns1:Package": {
10-
"@rdf:resource": "SPDXRef-Package"
11-
},
129
"ns1:hasFile": {
1310
"@rdf:resource": "http://www.spdx.org/files#SPDXRef-File"
1411
},

tests/data/doc_write/rdf-simple.json

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66
"ns1:describesPackage": {
77
"ns1:Package": {
88
"@rdf:about": "http://www.spdx.org/tools#SPDXRef-Package",
9-
"ns1:Package": {
10-
"@rdf:resource": "SPDXRef-Package"
11-
},
129
"ns1:hasFile": {
1310
"@rdf:resource": "http://www.spdx.org/files#SPDXRef-File"
1411
},

tests/test_rdf_writer.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import os
2+
from typing import Optional
3+
from unittest import TestCase
24

35
import pytest
46
from rdflib import URIRef
@@ -62,6 +64,35 @@ def test_external_package_references(temporary_file_path) -> None:
6264
assert second_ref.category in parsed_reference_categories
6365

6466

67+
# This test is really clunky since it's hard to isolate features of the rdf writer to test. Should be improved when
68+
# that part is refactored.
69+
def test_multiple_packages_in_one_document(temporary_file_path) -> None:
70+
doc_node = URIRef("http://www.spdx.org/tools#SPDXRef-DOCUMENT")
71+
document = Document()
72+
document.creation_info.set_created_now()
73+
package = Package()
74+
package.spdx_id = "SPDXRef-Package"
75+
package.version = "2.1"
76+
document.add_package(package)
77+
package2 = Package()
78+
package2.spdx_id = "SPDXRef-Another-Package"
79+
package2.version = "2.3"
80+
document.add_package(package2)
81+
82+
with open(temporary_file_path, "wb") as out:
83+
writer = Writer(document, out)
84+
writer.write(doc_node)
85+
parser = Parser(Builder(), StandardLogger())
86+
with open(temporary_file_path, "r") as file:
87+
parsed_document: Document = parser.parse(file)[0]
88+
89+
assert len(parsed_document.packages) == 2
90+
first_package = get_package_by_spdx_id("SPDXRef-Package", document)
91+
assert first_package.version == "2.1"
92+
second_package = get_package_by_spdx_id("SPDXRef-Another-Package", document)
93+
assert second_package.version == "2.3"
94+
95+
6596
def minimal_document_with_package() -> Document:
6697
document = Document(data_license=License.from_identifier('CC0-1.0'))
6798
document.creation_info.set_created_now()
@@ -72,7 +103,15 @@ def minimal_document_with_package() -> Document:
72103

73104
def minimal_package() -> Package:
74105
package = Package()
106+
package.spdx_id = "SPDXRef-Package"
75107
package.conc_lics = NoAssert()
76108
package.license_declared = NoAssert()
77109
package.add_lics_from_file(NoAssert())
78110
return package
111+
112+
113+
def get_package_by_spdx_id(package_spdx_id: str, document: Document) -> Optional[Package]:
114+
for package in document.packages:
115+
if package.spdx_id == package_spdx_id:
116+
return package
117+
return None

0 commit comments

Comments
 (0)