Skip to content

Commit e55c440

Browse files
committed
sw360_objects: make purls a Python set()
This allows for easy de-duplication.
1 parent 9c6bd9b commit e55c440

File tree

4 files changed

+46
-32
lines changed

4 files changed

+46
-32
lines changed

sw360/sw360_objects.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ def _parse_link(self, key, links_key, links_value):
152152

153153
def _parse_purls(self, purl_value):
154154
"""Parse package url strings"""
155-
purls = []
155+
purls = set()
156156
if type(purl_value) is str:
157157
if purl_value.startswith("["):
158158
# as of 2022-04, SW360 returns arrays as JSON string...
@@ -164,7 +164,7 @@ def _parse_purls(self, purl_value):
164164
if purl_string.startswith("pkg:"):
165165
try:
166166
purl = packageurl.PackageURL.from_string(purl_string)
167-
purls.append(purl)
167+
purls.add(purl)
168168
except ValueError:
169169
pass
170170
return purls
@@ -176,8 +176,6 @@ def from_json(self, json, copy_attributes=list(), snake_case=True):
176176
attributes and JSON members. If `snake_case` is set, more Python-ish
177177
snake_case names will be used (project_type instead of projectType).
178178
"""
179-
# delete purl list as we add purls from different external ids below
180-
self.purls = []
181179
for key, value in json.items():
182180
if key in copy_attributes:
183181
if snake_case:
@@ -188,7 +186,7 @@ def from_json(self, json, copy_attributes=list(), snake_case=True):
188186
# 'package-url', but some use "purl", "purl.id", etc.
189187
purls = self._parse_purls(id_value)
190188
if len(purls):
191-
self.purls += purls
189+
self.purls.update(purls)
192190
continue
193191
self.external_ids[id_type] = id_value
194192
else:
@@ -245,7 +243,7 @@ class Release(SW360Resource):
245243
def __init__(self, json=None, id_=None, parent=None, users={},
246244
name=None, version=None, downloadurl=None, sw360=None, **kwargs):
247245
self.__setattrdefault__("external_ids", {})
248-
self.__setattrdefault__("purls", [])
246+
self.__setattrdefault__("purls", set())
249247
self.__setattrdefault__("attachments", {})
250248
self.__setattrdefault__("name", name)
251249
self.__setattrdefault__("version", version)
@@ -405,7 +403,7 @@ def __init__(self, json=None, id_=None, name=None, description=None,
405403
self.__setattrdefault__("releases", {})
406404
self.__setattrdefault__("attachments", {})
407405
self.__setattrdefault__("external_ids", {})
408-
self.__setattrdefault__("purls", [])
406+
self.__setattrdefault__("purls", set())
409407
self.__setattrdefault__("name", name)
410408
self.__setattrdefault__("description", description)
411409
self.__setattrdefault__("homepage", homepage)
@@ -489,7 +487,7 @@ def __init__(self, json=None, id_=None, users={},
489487
self.__setattrdefault__("projects", {})
490488
self.__setattrdefault__("attachments", {})
491489
self.__setattrdefault__("external_ids", {})
492-
self.__setattrdefault__("purls", [])
490+
self.__setattrdefault__("purls", set())
493491
self.__setattrdefault__("name", name)
494492
self.__setattrdefault__("version", version)
495493
self.__setattrdefault__("description", description)

tests/test_sw360obj_component.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,24 +62,39 @@ def test_get_component_with_purls(self):
6262
'package-url': 'pkg:deb/debian/[email protected] pkg:deb/ubuntu/[email protected]'}})
6363
comp = Component.get(self.lib, "123")
6464
self.assertEqual(len(comp.purls), 2)
65-
self.assertEqual(comp.purls[0].name, "acl")
65+
for purl in comp.purls:
66+
self.assertEqual(purl.name, "acl")
6667
self.assertNotIn("package-url", comp.external_ids)
6768

69+
responses.replace(
70+
responses.GET,
71+
SW360_BASE_URL + "components/123",
72+
json={
73+
'name': 'acl',
74+
'somekey': 'value',
75+
'externalIds': {
76+
'package-url': 'pkg:deb/ubuntu/[email protected]'}})
77+
comp = Component.get(self.lib, "123")
78+
self.assertEqual(len(comp.purls), 2)
79+
self.assertNotIn("package-url", comp.external_ids)
80+
81+
6882
@responses.activate
6983
def test_get_component_invalid_purls(self):
7084
responses.add(
7185
responses.GET,
72-
SW360_BASE_URL + "components/123",
86+
SW360_BASE_URL + "components/122",
7387
json={
7488
'name': 'acl',
7589
'somekey': 'value',
7690
'externalIds': {
7791
'package-url': 'pkg:[email protected]',
7892
'purl': 'pkg:deb/debian/[email protected]'}})
79-
comp = Component.get(self.lib, "123")
93+
comp = Component.get(self.lib, "122")
8094
self.assertEqual(len(comp.purls), 1)
8195
self.assertEqual(comp.external_ids['package-url'], 'pkg:[email protected]')
82-
self.assertEqual(comp.purls[0].name, "acl")
96+
for purl in comp.purls:
97+
self.assertEqual(purl.name, "acl")
8398

8499

85100
if __name__ == "__main__":

tests/test_sw360obj_project.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,17 @@ def test_get_project(self):
3737
'version': '11.0',
3838
'_embedded': {
3939
'sw360:releases': [{
40-
'id': '7c4',
40+
'id': '7c3',
4141
'name': 'acl',
4242
'version': '2.2',
4343
'_links': {'self': {
44-
'href': SW360_BASE_URL + 'releases/7c4'}}}]}})
44+
'href': SW360_BASE_URL + 'releases/7c3'}}},]}})
4545
proj = Project.get(self.lib, "123")
4646
self.assertEqual(proj.name, "MyProj")
4747
self.assertEqual(proj.version, "11.0")
4848
self.assertEqual(len(proj.releases), 1)
4949
self.assertEqual(len(proj.projects), 0)
50-
self.assertIsNone(proj.releases["7c4"].parent.id)
50+
self.assertIsNone(proj.releases["7c3"].parent)
5151

5252
self.assertEqual(str(proj), "MyProj 11.0 (123)")
5353

@@ -76,8 +76,9 @@ def test_get_project_purl_string(self):
7676
'package-url': 'pkg:deb/debian/[email protected]?arch=source'}})
7777
proj = Project.get(self.lib, "123")
7878
self.assertEqual(len(proj.purls), 1)
79-
self.assertEqual(proj.purls[0].name, "app")
80-
self.assertEqual(proj.purls[0].version, "11.0-1")
79+
purl = next(iter(proj.purls))
80+
self.assertEqual(purl.name, "app")
81+
self.assertEqual(purl.version, "11.0-1")
8182

8283
@responses.activate
8384
def test_get_project_purl_invalid(self):

tests/test_sw360obj_release.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import unittest
1212
from tests.test_sw360obj_base import Sw360ObjTestBase, SW360_BASE_URL
1313
from sw360 import Release
14+
from packageurl import PackageURL
1415

1516

1617
class Sw360ObjTestRelease(Sw360ObjTestBase):
@@ -65,42 +66,41 @@ def test_get_release_extid(self):
6566
def test_get_release_purl_string(self):
6667
responses.add(
6768
responses.GET,
68-
SW360_BASE_URL + "releases/123",
69+
SW360_BASE_URL + "releases/113",
6970
json={
7071
'name': 'acl',
7172
'version': '1.4',
7273
'externalIds': {
7374
'package-url': 'pkg:deb/debian/[email protected]?arch=source'}})
74-
r = Release.get(self.lib, "123")
75+
r = Release.get(self.lib, "113")
7576
self.assertEqual(len(r.purls), 1)
76-
self.assertEqual(r.purls[0].name, "linux")
77-
self.assertEqual(r.purls[0].version, "4.19.98-1")
77+
purl = next(iter(r.purls))
78+
self.assertEqual(purl.name, "linux")
79+
self.assertEqual(purl.version, "4.19.98-1")
7880

79-
r = Release.get(self.lib, "123")
81+
r = Release.get(self.lib, "113")
8082
self.assertEqual(len(r.purls), 1)
8183

8284
responses.replace(
8385
responses.GET,
84-
SW360_BASE_URL + "releases/123",
86+
SW360_BASE_URL + "releases/113",
8587
json={
8688
'name': 'acl',
8789
'version': '1.4'})
88-
r = Release.get(self.lib, "123")
90+
r = Release.get(self.lib, "113")
8991
self.assertEqual(len(r.purls), 1)
90-
self.assertEqual(r.purls[0].name, "linux")
91-
self.assertEqual(r.purls[0].version, "4.19.98-1")
9292

9393
@responses.activate
9494
def test_get_release_purl_invalid(self):
9595
responses.add(
9696
responses.GET,
97-
SW360_BASE_URL + "releases/123",
97+
SW360_BASE_URL + "releases/120",
9898
json={
9999
'name': 'acl',
100100
'version': '1.4',
101101
'externalIds': {
102102
'package-url': 'pkg:huhu'}})
103-
r = Release.get(self.lib, "123")
103+
r = Release.get(self.lib, "120")
104104
self.assertEqual(len(r.purls), 0)
105105
self.assertEqual(r.external_ids["package-url"], "pkg:huhu")
106106

@@ -118,8 +118,8 @@ def test_get_release_purl_array(self):
118118
'pkg:deb/debian/[email protected]%2B1?arch=source']}})
119119
r = Release.get(self.lib, "123")
120120
self.assertEqual(len(r.purls), 2)
121-
self.assertEqual(r.purls[1].name, "linux-signed-amd64")
122-
self.assertEqual(r.purls[1].version, "4.19.98+1")
121+
self.assertIn(PackageURL.from_string("pkg:deb/debian/linux@4.19.98-1?arch=source"), r.purls)
122+
self.assertIn(PackageURL.from_string("pkg:deb/debian/linux-signed-amd64@4.19.98+1?arch=source"), r.purls)
123123

124124
@responses.activate
125125
def test_get_release_purl_strarray(self):
@@ -135,8 +135,8 @@ def test_get_release_purl_strarray(self):
135135
' "pkg:deb/debian/[email protected]%2B1?arch=source"]'}})
136136
r = Release.get(self.lib, "123")
137137
self.assertEqual(len(r.purls), 2)
138-
self.assertEqual(r.purls[1].name, "linux-signed-amd64")
139-
self.assertEqual(r.purls[1].version, "4.19.98+1")
138+
self.assertIn(PackageURL.from_string("pkg:deb/debian/linux@4.19.98-1?arch=source"), r.purls)
139+
self.assertIn(PackageURL.from_string("pkg:deb/debian/linux-signed-amd64@4.19.98+1?arch=source"), r.purls)
140140

141141

142142
if __name__ == "__main__":

0 commit comments

Comments
 (0)