Skip to content

Commit e367308

Browse files
committed
feat(sw360_objects): better __repr__ and __str__
This allows for easy copy'n'pasting of an object in interactive sessions plus nicer print output.
1 parent d960188 commit e367308

File tree

4 files changed

+98
-15
lines changed

4 files changed

+98
-15
lines changed

sw360/sw360_objects.py

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,20 @@ def from_json(self, json, copy_attributes=list(), snake_case=True):
126126
else:
127127
self.details[key] = value
128128

129+
def __repr__(self):
130+
repr_ = []
131+
for k, v in self.__dict__.items():
132+
if v is None:
133+
continue
134+
if (k in ("name", "version", "filename", "attachment_type")
135+
or k.endswith("_id")):
136+
repr_.append(f'{k}={v!r}')
137+
if k == "id":
138+
repr_.append(f'{self.__class__.__name__.lower()}_id={v!r}')
139+
return (f'{self.__class__.__name__}('
140+
+ ", ".join(repr_)
141+
+ ")")
142+
129143

130144
class Release(SW360Resource):
131145
"""A release is the SW360 abstraction for a single version of a component.
@@ -153,13 +167,14 @@ class Release(SW360Resource):
153167
:type kwargs: dictionary
154168
"""
155169
def __init__(self, json=None, release_id=None, component_id=None,
156-
version=None, downloadurl=None, sw360=None, **kwargs):
170+
name=None, version=None, downloadurl=None, sw360=None, **kwargs):
157171
self.attachments = {}
158172
self.external_ids = {}
159173
self.purls = []
160174

161-
self.component_id = component_id
175+
self.name = name
162176
self.version = version
177+
self.component_id = component_id
163178
self.downloadurl = downloadurl
164179
super().__init__(json, release_id, sw360=sw360, **kwargs)
165180

@@ -195,9 +210,8 @@ def get_component(self, sw360=None):
195210
self.sw360 = sw360
196211
return Component().get(self.sw360, self.component_id)
197212

198-
def __repr__(self):
199-
"""Representation string."""
200-
return "<Release %s %s id:%s>" % (self.name, self.version, self.id)
213+
def __str__(self):
214+
return f'{self.name} {self.version} ({self.id})'
201215

202216

203217
class Attachment(SW360Resource):
@@ -236,9 +250,9 @@ class Attachment(SW360Resource):
236250
def __init__(self, json=None, attachment_id=None, resources={},
237251
filename=None, sha1=None, attachment_type=None, sw360=None, **kwargs):
238252
self.resources = resources
253+
self.attachment_type = attachment_type
239254
self.filename = filename
240255
self.sha1 = sha1
241-
self.attachment_type = attachment_type
242256
self.download_link = None
243257
super().__init__(json, attachment_id, sw360, **kwargs)
244258

@@ -295,9 +309,8 @@ def download(self, target_path, filename=None):
295309
self.sw360.download_attachment(os.path.join(target_path, filename),
296310
self.download_link)
297311

298-
def __repr__(self):
299-
"""Representation string."""
300-
return "<Attachment %s id:%s>" % (self.filename, self.id)
312+
def __str__(self):
313+
return f'{self.filename} ({self.id})'
301314

302315

303316
class Component(SW360Resource):
@@ -373,9 +386,8 @@ def get(self, sw360=None, id_=None):
373386
self.from_json(self.sw360.get_component(self.id))
374387
return self
375388

376-
def __repr__(self):
377-
"""Representation string."""
378-
return "<Component %s id:%s>" % (self.name, self.id)
389+
def __str__(self):
390+
return f'{self.name} ({self.id})'
379391

380392

381393
class Project(SW360Resource):
@@ -453,6 +465,5 @@ def get(self, sw360=None, id_=None):
453465
self.from_json(self.sw360.get_project(self.id))
454466
return self
455467

456-
def __repr__(self):
457-
"""Representation string."""
458-
return "<Project %s id:%s>" % (self.name, self.id)
468+
def __str__(self):
469+
return f'{self.name} {self.version} ({self.id})'

tests/test_sw360obj_component.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@
55

66

77
class Sw360ObjTestComponent(Sw360ObjTestBase):
8+
def test_repr(self):
9+
comp = Component(component_id="123", name="TestCmp", homepage="http://www",
10+
component_type="INTERNAL")
11+
comp = eval(repr(comp))
12+
assert comp.id == "123"
13+
assert comp.name == "TestCmp"
14+
self.assertEqual(str(comp), "TestCmp (123)")
15+
16+
comp = Component()
17+
comp = eval(repr(comp))
18+
assert comp.id is None
19+
assert comp.name is None
20+
821
@responses.activate
922
def test_get_component(self):
1023
responses.add(

tests/test_sw360obj_project.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,19 @@
55

66

77
class Sw360ObjTestProject(Sw360ObjTestBase):
8+
def test_repr(self):
9+
prj = Project(project_id="123", name="TestPrj", version="12")
10+
prj = eval(repr(prj))
11+
assert prj.id == "123"
12+
assert prj.name == "TestPrj"
13+
assert prj.version == "12"
14+
self.assertEqual(str(prj), "TestPrj 12 (123)")
15+
16+
prj = Project()
17+
prj = eval(repr(prj))
18+
assert prj.id is None
19+
assert prj.name is None
20+
821
@responses.activate
922
def test_get_project(self):
1023
responses.add(
@@ -25,6 +38,8 @@ def test_get_project(self):
2538
self.assertEqual(len(proj.releases), 1)
2639
self.assertIsNone(proj.releases["7c4"].component_id)
2740

41+
self.assertEqual(str(proj), "MyProj 11.0 (123)")
42+
2843

2944
if __name__ == "__main__":
3045
unittest.main()

tests/test_sw360obj_release.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import responses
2+
import unittest
3+
from tests.test_sw360obj_base import Sw360ObjTestBase, SW360_BASE_URL
4+
from sw360 import Release
5+
6+
7+
class Sw360ObjTestRelease(Sw360ObjTestBase):
8+
def test_repr(self):
9+
r = Release(release_id="123", name="TestCmp", version="1.4",
10+
component_id="456", downloadurl="http://www")
11+
12+
r = eval(repr(r))
13+
assert r.id == "123"
14+
assert r.name == "TestCmp"
15+
assert r.version == "1.4"
16+
self.assertEqual(str(r), "TestCmp 1.4 (123)")
17+
18+
r = Release()
19+
r = eval(repr(r))
20+
assert r.id is None
21+
assert r.name is None
22+
assert r.version is None
23+
24+
@responses.activate
25+
def test_get_release(self):
26+
responses.add(
27+
responses.GET,
28+
SW360_BASE_URL + "releases/123",
29+
json={
30+
'name': 'acl',
31+
'version': '1.4',
32+
'somekey': 'value',
33+
'_links': {
34+
'sw360:component': {
35+
'href': SW360_BASE_URL + 'components/7b4'}}})
36+
r = Release().get(self.lib, "123")
37+
self.assertEqual(r.name, "acl")
38+
self.assertEqual(r.details["somekey"], "value")
39+
self.assertEqual(len(r.purls), 0)
40+
self.assertEqual(r.component_id, "7b4")
41+
42+
43+
if __name__ == "__main__":
44+
unittest.main()

0 commit comments

Comments
 (0)