Skip to content

Commit 003e426

Browse files
committed
feat added get_projects_by_tag, get_releases_by_name, and get_all_vendors
1 parent 7604fc6 commit 003e426

5 files changed

Lines changed: 182 additions & 6 deletions

File tree

sw360/sw360_api.py

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ def get_projects_by_external_id(self, ext_id_name, ext_id_value=""):
330330
def get_projects_by_group(self, group, all_details=False):
331331
"""Get projects by group.
332332
333-
API endpoint: GET /projects
333+
API endpoint: GET /projects?group=
334334
335335
:param group: the group the projects shall belong to
336336
:type group: string
@@ -349,6 +349,25 @@ def get_projects_by_group(self, group, all_details=False):
349349
resp = resp["_embedded"]["sw360:projects"]
350350
return resp
351351

352+
def get_projects_by_tag(self, tag):
353+
"""Get projects by tag.
354+
355+
API endpoint: GET /projects?tag=
356+
357+
:param group: the group the projects shall belong to
358+
:type group: string
359+
:return: list of projects
360+
:rtype: list of JSON project objects
361+
:raises SW360Error: if there is a negative HTTP response
362+
"""
363+
full_url = self.url + "resource/api/projects?tag=" + tag
364+
resp = self.api_get(full_url)
365+
if not resp:
366+
return None
367+
368+
resp = resp["_embedded"]["sw360:projects"]
369+
return resp
370+
352371
def download_license_info(self, project_id, filename, generator="XhtmlGenerator",
353372
variant="DISCLOSURE"):
354373
"""Gets the license information, aka Readme_OSS for the project
@@ -587,6 +606,23 @@ def get_release_by_url(self, release_url):
587606
resp = self.api_get(release_url)
588607
return resp
589608

609+
def get_releases_by_name(self, name):
610+
"""Gets a list of releases that match the given name.
611+
612+
API endpoint: GET /releases?name=
613+
614+
:param name: the name
615+
:type name: string
616+
:return: list of releases
617+
:rtype: list of JSON release objects
618+
:raises SW360Error: if there is a negative HTTP response
619+
"""
620+
full_url = self.url + "resource/api/releases?name=" + name
621+
resp = self.api_get(full_url)
622+
if resp and ("_embedded" in resp) and ("sw360:releases" in resp["_embedded"]):
623+
resp = resp["_embedded"]["sw360:releases"]
624+
return resp
625+
590626
def get_all_releases(self, fields=None, all_details=False):
591627
"""Get information of about all releases
592628
@@ -919,9 +955,9 @@ def update_component(self, component, component_id):
919955
920956
API endpoint: PATCH /components
921957
922-
:param component: the new vedor data
958+
:param component: the new component data
923959
:param component_id: the id of the component to be updated
924-
:type component: JSON vendor object
960+
:type component: JSON component object
925961
:type component_id: string
926962
:return: SW360 result
927963
:rtype: JSON SW360 result object
@@ -1013,15 +1049,32 @@ def get_users_of_component(self, component_id):
10131049

10141050
# ----- Vendor ----------------------------------------------------------
10151051

1052+
def get_all_vendors(self):
1053+
"""Returns all vendors
1054+
1055+
API endpoint: GET /vendors
1056+
1057+
:return: a vendor
1058+
:rtype: JSON vendor object
1059+
:raises SW360Error: if there is a negative HTTP response
1060+
"""
1061+
1062+
resp = self.api_get(self.url + "resource/api/vendors")
1063+
if not resp:
1064+
return None
1065+
1066+
resp = resp["_embedded"]["sw360:vendors"]
1067+
return resp
1068+
10161069
def get_vendor(self, vendor_id):
10171070
"""Returns a vendor
10181071
10191072
API endpoint: GET /vendors/{id}
10201073
10211074
:param vendor_id: the id of the vendor to be requested
10221075
:type vendor_id: string
1023-
:return: a vendor
1024-
:rtype: JSON vendor object
1076+
:return: list of vendors
1077+
:rtype: list of JSON vendor objects
10251078
:raises SW360Error: if there is a negative HTTP response
10261079
"""
10271080

tests/test_sw360_clearingrequests.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,29 @@ def test_get_clearing_request(self):
6464
self.assertIsNotNone(vendor)
6565
self.assertEqual("2021-09-04", vendor["requestedClearingDate"])
6666

67+
@responses.activate
68+
def test_get_clearing_request_for_project(self):
69+
lib = SW360(self.MYURL, self.MYTOKEN, False)
70+
self._add_login_response()
71+
actual = lib.login_api()
72+
self.assertTrue(actual)
73+
74+
responses.add(
75+
method=responses.GET,
76+
url=self.MYURL + "resource/api/clearingrequest/project/12345",
77+
body='{"id": "12345",\
78+
"requestedClearingDate": "2021-09-04",\
79+
"projectId": "007",\
80+
"clearingState": "NEW"}', # noqa
81+
status=200,
82+
content_type="application/json",
83+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
84+
)
85+
86+
vendor = lib.get_clearing_request_for_project("12345")
87+
self.assertIsNotNone(vendor)
88+
self.assertEqual("2021-09-04", vendor["requestedClearingDate"])
89+
6790

6891
if __name__ == "__main__":
6992
unittest.main()

tests/test_sw360_projects.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,40 @@ def test_get_projects_by_group_no_result(self):
403403
projects = lib.get_projects_by_group("SI")
404404
self.assertIsNone(projects)
405405

406+
@responses.activate
407+
def test_get_projects_by_tag(self):
408+
lib = self.get_logged_in_lib()
409+
410+
responses.add(
411+
responses.GET,
412+
url=self.MYURL + "resource/api/projects?tag=SI BP",
413+
body='{"_embedded": {"sw360:projects": [{"name": "My Testproject", "externalIds": {"com.siemens.code.project.id": "13171"}}]}}', # noqa
414+
status=200,
415+
content_type="application/json",
416+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
417+
)
418+
419+
projects = lib.get_projects_by_tag("SI BP")
420+
self.assertIsNotNone(projects)
421+
self.assertTrue(len(projects) > 0)
422+
self.assertEqual("My Testproject", projects[0]["name"])
423+
424+
@responses.activate
425+
def test_get_projects_by_tag_no_result(self):
426+
lib = self.get_logged_in_lib()
427+
428+
responses.add(
429+
responses.GET,
430+
url=self.MYURL + "resource/api/projects?tag=SI",
431+
body='{}',
432+
status=200,
433+
content_type="application/json",
434+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
435+
)
436+
437+
projects = lib.get_projects_by_tag("SI")
438+
self.assertIsNone(projects)
439+
406440
@responses.activate
407441
def test_download_license_info(self):
408442
lib = self.get_logged_in_lib()

tests/test_sw360_releases.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,28 @@ def test_get_releases_by_external_id(self):
226226
self.assertEqual("Tethys.Logging", releases[0]["name"])
227227
self.assertEqual("1.3.0", releases[0]["version"])
228228

229+
@responses.activate
230+
def test_get_releases_by_name(self):
231+
lib = SW360(self.MYURL, self.MYTOKEN, False)
232+
self._add_login_response()
233+
actual = lib.login_api()
234+
self.assertTrue(actual)
235+
236+
responses.add(
237+
method=responses.GET,
238+
url=self.MYURL + "resource/api/releases?name=john",
239+
body='{"_embedded": {"sw360:releases": [{"name": "john", "version": "2.2.2", "_links": {"self": {"href": "https://my.server.com/resource/api/releases/08ddfd57636c4c47f4c879515007081f"}}}]}}', # noqa
240+
status=200,
241+
content_type="application/json",
242+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
243+
)
244+
245+
releases = lib.get_releases_by_name("john")
246+
self.assertIsNotNone(releases)
247+
self.assertTrue(len(releases) > 0)
248+
self.assertEqual("john", releases[0]["name"])
249+
self.assertEqual("2.2.2", releases[0]["version"])
250+
229251
@responses.activate
230252
def test_create_new_release(self):
231253
lib = SW360(self.MYURL, self.MYTOKEN, False)

tests/test_sw360_vendors.py

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def test_get_vendor(self):
9494
"shortName": "Triangle, Inc.",\
9595
"fullName": "Triangle, Inc.",\
9696
"_links": { "self": {\
97-
"href": "https://sw360.siemens.com/resource/api/vendors/12345"}}}', # noqa
97+
"href": "https://my.server.com/resource/api/vendors/12345"}}}', # noqa
9898
status=200,
9999
content_type="application/json",
100100
adding_headers={"Authorization": "Token " + self.MYTOKEN},
@@ -104,6 +104,50 @@ def test_get_vendor(self):
104104
self.assertIsNotNone(vendor)
105105
self.assertEqual("Triangle, Inc.", vendor["shortName"])
106106

107+
@responses.activate
108+
def test_get_all_vendors(self):
109+
lib = SW360(self.MYURL, self.MYTOKEN, False)
110+
self._add_login_response()
111+
actual = lib.login_api()
112+
self.assertTrue(actual)
113+
114+
responses.add(
115+
method=responses.GET,
116+
url=self.MYURL + "resource/api/vendors",
117+
body='{"_embedded" : {\
118+
"sw360:vendors" : [{\
119+
"fullName": "Premium Software",\
120+
"_links": { "self": {\
121+
"href": "https://my.server.com/resource/api/vendors/006"}}}]}}',
122+
status=200,
123+
content_type="application/json",
124+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
125+
)
126+
127+
vendors = lib.get_all_vendors()
128+
self.assertIsNotNone(vendors)
129+
self.assertEqual(1, len(vendors))
130+
self.assertEqual("Premium Software", vendors[0]["fullName"])
131+
132+
@responses.activate
133+
def test_get_all_vendors_no_result(self):
134+
lib = SW360(self.MYURL, self.MYTOKEN, False)
135+
self._add_login_response()
136+
actual = lib.login_api()
137+
self.assertTrue(actual)
138+
139+
responses.add(
140+
method=responses.GET,
141+
url=self.MYURL + "resource/api/vendors",
142+
body='{}',
143+
status=200,
144+
content_type="application/json",
145+
adding_headers={"Authorization": "Token " + self.MYTOKEN},
146+
)
147+
148+
vendors = lib.get_all_vendors()
149+
self.assertIsNone(vendors)
150+
107151
@responses.activate
108152
def test_create_new_vendor(self):
109153
lib = SW360(self.MYURL, self.MYTOKEN, False)

0 commit comments

Comments
 (0)