Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sw360/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@

__version__ = (1, 11, 2)

from .base import SW360Response
from .sorting import (BaseSortMixin, ProjectSortColumn, ReleaseSortColumn,
SortParam)
from .base import SW360Response
from .sw360_api import SW360
from .sw360error import SW360Error
from .sw360keycloak import SW360Keycloak
Expand Down
15 changes: 14 additions & 1 deletion sw360/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ def __init__(self, url: str, token: str, oauth2: bool = False,

self.force_no_session = False
self.default_batch_size = default_batch_size
self.api_version = (18, 0)

def api_get(self, url: str = "") -> Optional[SW360Response]:
"""Request `url` from REST API and return json answer.
Expand Down Expand Up @@ -373,7 +374,8 @@ def _update_external_ids(self, current_data: Dict[str, Any], ext_id_name: str, e

return (old_value, ext_id_data, update)

def _add_params(self, url: str, params: Dict[str, str]) -> str:
@staticmethod
def _add_params(url: str, params: Dict[str, str]) -> str:
"""Add the given parameter to the given url"""

query_string = urlencode(params)
Expand Down Expand Up @@ -505,6 +507,17 @@ def _get_attachments(
if '_links' in attachment:
del attachment['_links']
return attachments

def is_above_version_18(self) -> bool:
"""Check if API version is above version 18.
Used to check version >= 19 features."""
return self.api_version >= (19, 0)

def is_above_version_19(self) -> bool:
"""Check if API version is above version 19.
Used to check version >= 20 features."""
return self.api_version >= (20, 0)

@classmethod
def get_linked_id(cls, data: Dict[str, Any], link_key: str = "self") -> Optional[str]:
"""Extract the resource ID from a HAL ``_links`` entry.
Expand Down
13 changes: 10 additions & 3 deletions sw360/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,15 @@ def __get_components_filtered(
:raises SW360Error: if there is a negative HTTP response
"""

full_url = self._add_params(url, {"luceneSearch": "true"})
if self.is_above_version_18():
full_url = self._add_params(url, {"luceneSearch": "true"})
else:
full_url = url

if page > -1 and page_size > -1:
full_url = self._add_pagination(full_url, page, page_size, sort)

if page_size == -1:
if self.is_above_version_18() and page_size == -1:
resp = self.api_get_all(full_url, sort)
else:
resp = self.api_get(full_url)
Expand Down Expand Up @@ -197,7 +201,10 @@ def get_component_by_name(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = ComponentSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = ComponentSortColumn.SCORE.asc()
else:
sort = ComponentSortColumn.NAME.asc()

return self.__get_components_filtered(url_with_param, page, page_size,
sort)
Expand Down
7 changes: 5 additions & 2 deletions sw360/license.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Copyright (c) 2022 BMW CarIT GmbH
# All Rights Reserved.
# Authors: thomas.graf@siemens.com, gernot.hillier@siemens.com
# Authors: helio.chissini-de-castro@bmw.de
# Authors: helio.chissini-de-castro@bmw.de, mishra.gaurav@siemens.com
#
# Licensed under the MIT license.
# SPDX-License-Identifier: MIT
Expand Down Expand Up @@ -133,7 +133,10 @@ def get_all_licenses(self) -> List[Dict[str, Any]]:
"""

fullbase_url = self.url + "resource/api/licenses"
resp = self.api_get_all(fullbase_url)
if self.is_above_version_18():
resp = self.api_get_all(fullbase_url)
else:
resp = self.api_get(fullbase_url)

if resp and "_embedded" in resp and "sw360:licenses" in resp["_embedded"]:
return resp["_embedded"]["sw360:licenses"]
Expand Down
9 changes: 6 additions & 3 deletions sw360/moderationrequests.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,10 @@ def get_all_moderation_requests(
"""

fullbase_url = self.url + "resource/api/moderationrequest"
params = {"luceneSearch": "true"}
if self.is_above_version_18():
params = {"luceneSearch": "true"}
else:
params = {}

if sort is None:
sort = ModerationSortColumn.REQUEST_DATE.desc()
Expand All @@ -46,7 +49,7 @@ def get_all_moderation_requests(
if page > -1 and page_size > -1:
full_url = self._add_pagination(full_url, page, page_size, sort)

if page_size == -1:
if self.is_above_version_18() and page_size == -1:
resp = self.api_get_all(full_url, sort)
else:
resp = self.api_get(full_url)
Expand Down Expand Up @@ -92,7 +95,7 @@ def get_moderation_requests_by_state(
if page > -1 and page_size > -1:
full_url = self._add_pagination(full_url, page, page_size, sort)

if page_size == -1:
if self.is_above_version_18() and page_size == -1:
resp = self.api_get_all(full_url, sort)
else:
resp = self.api_get(full_url)
Expand Down
23 changes: 18 additions & 5 deletions sw360/packages.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,15 @@ def __get_packages_filtered(
:raises SW360Error: if there is a negative HTTP response
"""

full_url = self._add_params(url, {"luceneSearch": "true"})
if self.is_above_version_18():
full_url = self._add_params(url, {"luceneSearch": "true"})
else:
full_url = url

if page > -1 and page_size > -1:
full_url = self._add_pagination(full_url, page, page_size, sort)

if page_size == -1:
if self.is_above_version_18() and page_size == -1:
resp = self.api_get_all(full_url, sort)
else:
resp = self.api_get(full_url)
Expand Down Expand Up @@ -100,7 +104,10 @@ def get_packages_by_name(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = PackageSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = PackageSortColumn.SCORE.asc()
else:
sort = PackageSortColumn.NAME.asc()

return self.__get_packages_filtered(url_with_param, page, page_size, sort)

Expand Down Expand Up @@ -155,7 +162,10 @@ def get_all_packages(
if sort is None:
sort = PackageSortColumn.NAME.asc()
if name != "" or version != "" or purl != "":
sort = PackageSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = PackageSortColumn.SCORE.asc()
else:
sort = PackageSortColumn.NAME.asc()

return self.__get_packages_filtered(url_with_param, page, page_size,
sort)
Expand Down Expand Up @@ -189,7 +199,10 @@ def get_packages_by_packagemanager(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = PackageSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = PackageSortColumn.SCORE.asc()
else:
sort = PackageSortColumn.NAME.asc()

return self.__get_packages_filtered(url_with_param, page, page_size,
sort)
Expand Down
33 changes: 26 additions & 7 deletions sw360/project.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,10 @@ def get_project_releases(self, project_id: str, transitive: bool = False) -> Any
trans = "true"
url = self.url + "resource/api/projects/" + project_id + "/releases"
url = self._add_params(url, {"transitive": trans})
resp = self.api_get_all(url, ReleaseSortColumn.CREATED_ON.desc())
if self.is_above_version_18():
resp = self.api_get_all(url, ReleaseSortColumn.CREATED_ON.desc())
else:
resp = self.api_get(url)
return resp

def get_project_by_url(self, url: str) -> Optional[Dict[str, Any]]:
Expand Down Expand Up @@ -97,11 +100,15 @@ def __get_projects_filtered(
:raises SW360Error: if there is a negative HTTP response
"""

full_url = self._add_params(url, {"luceneSearch": "true"})
if self.is_above_version_18():
full_url = self._add_params(url, {"luceneSearch": "true"})
else:
full_url = url

if page > -1 and page_size > -1:
full_url = self._add_pagination(full_url, page, page_size, sort)

if page_size == -1:
if self.is_above_version_18() and page_size == -1:
resp = self.api_get_all(full_url, sort)
else:
resp = self.api_get(full_url)
Expand Down Expand Up @@ -237,7 +244,10 @@ def get_projects_by_name(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = ProjectSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = ProjectSortColumn.SCORE.asc()
else:
sort = ProjectSortColumn.NAME.asc()

return self.__get_projects_filtered(url_with_param, page, page_size,
sort)
Expand Down Expand Up @@ -311,7 +321,10 @@ def get_projects_by_group(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = ProjectSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = ProjectSortColumn.SCORE.asc()
else:
sort = ProjectSortColumn.NAME.asc()

return self.__get_projects_filtered(url_with_param, page, page_size,
sort)
Expand Down Expand Up @@ -345,7 +358,10 @@ def get_projects_by_tag(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = ProjectSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = ProjectSortColumn.SCORE.asc()
else:
sort = ProjectSortColumn.NAME.asc()

return self.__get_projects_filtered(url_with_param, page, page_size,
sort)
Expand All @@ -365,7 +381,10 @@ def get_project_vulnerabilities(self, project_id: str) -> Optional[Dict[str, Any
raise SW360Error(message="No project id provided!")

full_url = self.url + "resource/api/projects/" + project_id + "/vulnerabilities"
resp = self.api_get_all(full_url)
if self.is_above_version_18():
resp = self.api_get_all(full_url)
else:
resp = self.api_get(full_url)
if not resp:
return None

Expand Down
21 changes: 14 additions & 7 deletions sw360/releases.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
# Copyright (c) 2022 BMW CarIT GmbH
# All Rights Reserved.
# Authors: thomas.graf@siemens.com, gernot.hillier@siemens.com
# Authors: helio.chissini-de-castro@bmw.de
# Authors: helio.chissini-de-castro@bmw.de, mishra.gaurav@siemens.com
#
# Licensed under the MIT license.
# SPDX-License-Identifier: MIT
Expand Down Expand Up @@ -40,18 +40,22 @@ def __get_releases_filtered(
:raises SW360Error: if there is a negative HTTP response
"""

full_url = self._add_params(url, {"luceneSearch": "true"})
if self.is_above_version_18():
full_url = self._add_params(url, {"luceneSearch": "true"})
else:
full_url = url

if page > -1 and page_size > -1:
full_url = self._add_pagination(full_url, page, page_size, sort)

if page_size == -1:
if self.is_above_version_18() and page_size == -1:
resp = self.api_get_all(full_url, sort)
else:
resp = self.api_get(full_url)

if (resp and
"_embedded" in resp and
"sw360:releases" in resp["_embedded"]):
"sw360:releases" in resp["_embedded"]):
return resp["_embedded"]["sw360:releases"]

return []
Expand Down Expand Up @@ -119,7 +123,10 @@ def get_releases_by_name(
url_with_param = self._add_params(fullbase_url, params)

if sort is None:
sort = ReleaseSortColumn.SCORE.asc()
if self.is_above_version_18():
sort = ReleaseSortColumn.SCORE.asc()
else:
sort = ReleaseSortColumn.VERSION.desc()

return self.__get_releases_filtered(url_with_param, page, page_size,
sort)
Expand Down Expand Up @@ -420,8 +427,8 @@ def upload_attachment_to_release(
raise SW360Error(message="No release id provided!")

attachment_content = self._upload_resource_file(upload_file, upload_type, upload_comment)
attachment_content['attachmentType'] = upload_type # Make sure the type is correct
attachment_content['createdComment'] = upload_comment # Override
attachment_content['attachmentType'] = upload_type # Make sure the type is correct
attachment_content['createdComment'] = upload_comment # Override

current_release = self.get_release(release_id)
attachments = self._get_attachments(current_release)
Expand Down
11 changes: 9 additions & 2 deletions sw360/reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
# SPDX-License-Identifier: MIT
# -------------------------------------------------------------------------------

from typing import Any, Dict, List, Optional

import requests

from .base import BaseMixin
Expand Down Expand Up @@ -37,6 +35,9 @@ def generate_project_license_info(
:rtype: int
:raises SW360Error: if there is a negative HTTP response
"""
if not self.is_above_version_18():
raise SW360Error(message="SW360 version < 19 is not supported")

if not project_id:
raise SW360Error(message="No project id provided!")

Expand Down Expand Up @@ -97,6 +98,9 @@ def generate_project_clearing_report(
:rtype: int
:raises SW360Error: if there is a negative HTTP response
"""
if not self.is_above_version_18():
raise SW360Error(message="SW360 version < 19 is not supported")

if not project_id:
raise SW360Error(message="No project id provided!")

Expand Down Expand Up @@ -148,6 +152,9 @@ def generate_project_source_code_bundle(
:type with_subprojects: bool
:raises SW360Error: if there is a negative HTTP response
"""
if not self.is_above_version_18():
raise SW360Error(message="SW360 version < 19 is not supported")

if not project_id:
raise SW360Error(message="No project id provided!")

Expand Down
2 changes: 2 additions & 0 deletions sw360/sorting.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,11 +79,13 @@ class PackageSortColumn(BaseSortMixin, Enum):
VERSION = "version"
PACKAGE_MANAGER = "packageManager"


class VendorSortColumn(BaseSortMixin, Enum):
SCORE = "score"
FULL_NAME = "fullName"
SHORT_NAME = "shortName"


class VulnerabilitySortColumn(BaseSortMixin, Enum):
LAST_UPDATE_DATE = "lastUpdateDate"
EXTERNAL_ID = "externalId"
Expand Down
Loading
Loading