From 0a04bf459b8b04b09a5a1de398dcbf7144a29974 Mon Sep 17 00:00:00 2001 From: Marion Deveaud Date: Wed, 9 Aug 2023 08:57:43 +0200 Subject: [PATCH 1/2] chore(release): update version string to 3.0.0 --- README.rst | 14 +++----------- docs-source/conf.py | 2 +- pyproject.toml | 2 +- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/README.rst b/README.rst index 6bee17c..e89603a 100644 --- a/README.rst +++ b/README.rst @@ -26,19 +26,11 @@ A simple wrapper for the Fossology REST API. See `the OpenAPI specification `_ used to implement this library. - Compatible API versions: +Current release is compatible with **Fossology version 4.2.1** - API version 1.4.3. - - 1.2.1 (Fossology 3.10.0) - - 1.3.2 (Fossology 3.11.0) - - 1.4.0 (Fossology 4.0.0) - - 1.4.3 (Fossology 4.1.0) - - 1.5.1 (Fossology 4.2.0) - partially covered, see #52 for the list of missing supported API feature + `See release notes `_ for all details. -**NOTE** - - Version 2.0.0 of `fossology-python` only supports Fossology API version 1.4.3 onwards because of a breaking change in - the version format returned by the API. Other earlier version of the wrapper support a wider range of API versions, - e.g. 1.5.0 supports Fossology API 1.2.1 to 1.4.0. + The list of unsupported API features is documented in `issue #52 `_. Documentation ============= diff --git a/docs-source/conf.py b/docs-source/conf.py index 7ee63e4..750c21b 100644 --- a/docs-source/conf.py +++ b/docs-source/conf.py @@ -22,7 +22,7 @@ copyright = "2021, Siemens AG" # The full version, including major/minor/patch tags -release = "2.1.0" +release = "3.0.0" # -- General configuration --------------------------------------------------- diff --git a/pyproject.toml b/pyproject.toml index a714613..58334af 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "fossology" -version = "2.1.0" +version = "3.0.0" description = "A library to automate Fossology from Python scripts" authors = ["Marion Deveaud "] license = "MIT License" From 1e639aa4f539312a0c39cbc9377e7234589e19da Mon Sep 17 00:00:00 2001 From: Marion Deveaud Date: Wed, 9 Aug 2023 08:58:12 +0200 Subject: [PATCH 2/2] refactor(all): update copyright and remove deprecated functions --- .github/workflows/foss_cli_tests.yml | 39 ------------------------ docs-source/sample_workflow.rst | 3 +- fossology/__init__.py | 32 ++++--------------- fossology/__main__.py | 3 ++ fossology/exceptions.py | 2 +- fossology/folders.py | 4 +-- fossology/foss_cli.py | 21 ++++--------- fossology/groups.py | 2 +- fossology/jobs.py | 2 +- fossology/license.py | 2 +- fossology/obj.py | 2 +- fossology/report.py | 2 +- fossology/uploads.py | 2 +- fossology/users.py | 2 +- tests/conftest.py | 2 +- tests/test_folders.py | 2 +- tests/test_foss_cli_create_cmds.py | 3 ++ tests/test_foss_cli_flow_cmds.py | 3 ++ tests/test_foss_cli_help.py | 3 ++ tests/test_foss_cli_logger.py | 3 ++ tests/test_foss_cli_start_workflow.py | 3 ++ tests/test_groups.py | 2 +- tests/test_jobs.py | 2 +- tests/test_license.py | 2 +- tests/test_report.py | 2 +- tests/test_search.py | 2 +- tests/test_upload_from.py | 2 +- tests/test_upload_licenses_copyrights.py | 3 ++ tests/test_upload_permissions.py | 3 ++ tests/test_uploads.py | 2 +- tests/test_users.py | 2 +- 31 files changed, 57 insertions(+), 102 deletions(-) diff --git a/.github/workflows/foss_cli_tests.yml b/.github/workflows/foss_cli_tests.yml index 8ff5849..37ba370 100644 --- a/.github/workflows/foss_cli_tests.yml +++ b/.github/workflows/foss_cli_tests.yml @@ -47,42 +47,3 @@ jobs: poetry run coverage run --source=fossology -m pytest tests/test_foss_cli*.py poetry run coverage report -m continue-on-error: true - - test-last_release: - name: foss_cli tests (Fossology 4.1.0) - runs-on: ubuntu-latest - - container: - image: python:3.11-slim - volumes: - - /tmp:/tmp - - services: - fossology: - image: fossology/fossology:4.1.0 - ports: - - 8081:80 - volumes: - - /tmp:/tmp - - steps: - - uses: actions/checkout@v1 - - name: Install host dependencies - run: | - apt-get -qq update - apt-get install -qq gcc git nmap xz-utils - rm -rf /var/lib/apt/lists/* - - name: Install Python dependencies - run: | - pip install poetry - poetry install --with=dev - - name: Install files in shared volume - run: | - tar xJf tests/files/base-files_11.tar.xz -C /tmp - - name: Check services - run: nmap fossology -p 80 - - name: Run tests - run: | - poetry run coverage run --source=fossology -m pytest tests/test_foss_cli*.py - poetry run coverage report -m - diff --git a/docs-source/sample_workflow.rst b/docs-source/sample_workflow.rst index c067e0c..9450a33 100644 --- a/docs-source/sample_workflow.rst +++ b/docs-source/sample_workflow.rst @@ -65,8 +65,7 @@ Login to the Fossology Server Create the Fossology Instance. ->>> # The username is only needed for Fossology API version < 1.2.3 ->>> foss = Fossology(FOSSOLOGY_SERVER, token, name=os.environ["FOSSOLOGY_USER"]) +>>> foss = Fossology(FOSSOLOGY_SERVER, token) >>> print(f"Logged in as user {foss.user.name}") Logged in as user fossy diff --git a/fossology/__init__.py b/fossology/__init__.py index def5084..a186516 100644 --- a/fossology/__init__.py +++ b/fossology/__init__.py @@ -1,8 +1,7 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging -import re from datetime import date, timedelta import requests @@ -68,7 +67,7 @@ def fossology_token( response = requests.post(url + "/api/v1/tokens", data=data) if response.status_code == 201: token = response.json()["Authorization"] - return re.sub("Bearer ", "", token) + return token.replace("Bearer ", "") elif response.status_code == 404: description = "Authentication error" raise AuthenticationError(description, response) @@ -88,14 +87,12 @@ class Fossology(Folders, Groups, LicenseEndpoint, Uploads, Jobs, Report, Users, :Example: >>> from fossology import Fossology - >>> foss = Fossology(FOSS_URL, FOSS_TOKEN, username) # doctest: +SKIP + >>> foss = Fossology(FOSS_URL, FOSS_TOKEN) # doctest: +SKIP :param url: URL of the Fossology instance :param token: The API token generated using the Fossology UI - :param name: The name of the token owner (deprecated since API version 1.2.3) :type url: str :type token: str - :type name: str (deprecated since API version 1.2.3) :raises FossologyApiError: if a REST call failed :raises AuthenticationError: if the user couldn't be authenticated """ @@ -109,19 +106,18 @@ def __init__(self, url, token, name=None): self.api = f"{self.host}/api/v1" self.session = requests.Session() self.session.headers.update({"Authorization": f"Bearer {self.token}"}) - self.version = self.get_version() self.info = self.get_info() self.health = self.get_health() - self.user = self.get_self(name) + self.user = self.get_self() self.name = self.user.name self.rootFolder = self.detail_folder(self.user.rootFolderId) self.folders = self.list_folders() logger.info( - f"Authenticated as {self.user.name} against {self.host} using API version {self.version}" + f"Authenticated as {self.user.name} against {self.host} using API version {self.info.version}" ) - def get_self(self, name=None): + def get_self(self): """Perform the first API request and populate user variables API Endpoint: GET /users/self @@ -147,22 +143,6 @@ def get_self(self, name=None): def close(self): self.session.close() - def get_version(self): - """Get API version from the server - - API endpoint: GET /version (deprecated since API version 1.3.3) - - :return: the API version string - :rtype: string - :raises FossologyApiError: if the REST call failed - """ - response = self.session.get(f"{self.api}/version") - if response.status_code == 200: - return response.json()["version"] - else: - description = "Error while getting API version" - raise FossologyApiError(description, response) - def get_info(self) -> ApiInfo: """Get info from the server diff --git a/fossology/__main__.py b/fossology/__main__.py index 04d8118..93ab27e 100644 --- a/fossology/__main__.py +++ b/fossology/__main__.py @@ -1,3 +1,6 @@ +# Copyright 2019 Siemens AG +# SPDX-License-Identifier: MIT + __doc__ = """ Allows to run the foss_cli with: python -m fossology """ diff --git a/fossology/exceptions.py b/fossology/exceptions.py index 5dc76b4..3eb5c82 100644 --- a/fossology/exceptions.py +++ b/fossology/exceptions.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT from json.decoder import JSONDecodeError diff --git a/fossology/folders.py b/fossology/folders.py index d488abd..ad5b1f7 100644 --- a/fossology/folders.py +++ b/fossology/folders.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging @@ -99,7 +99,7 @@ def create_folder( logger.info( f"Folder '{name}' already exists under the folder {parent.name} ({parent.id})" ) - # Foldernames with similar letter but different cases + # Folder names with similar letter but different cases # are not allowed in Fossology, compare with lower case existing_folder = [ folder diff --git a/fossology/foss_cli.py b/fossology/foss_cli.py index 10ff384..2346ed9 100644 --- a/fossology/foss_cli.py +++ b/fossology/foss_cli.py @@ -1,3 +1,6 @@ +# Copyright 2019 Siemens AG +# SPDX-License-Identifier: MIT + __doc__ = """ The foss_cli cmdline interface uses the provided REST-API to communicate with the Fossology Server. @@ -20,11 +23,7 @@ import click from fossology import Fossology, fossology_token -from fossology.exceptions import ( - AuthenticationError, - FossologyApiError, - FossologyUnsupported, -) +from fossology.exceptions import FossologyApiError, FossologyUnsupported from fossology.obj import AccessLevel, Folder, ReportFormat, Summary, TokenScope logger = logging.getLogger(__name__) @@ -46,7 +45,6 @@ "copyright_email_author": True, "ecc": True, "keyword": True, - "monk": True, "mime": True, "monk": True, "nomos": True, @@ -219,14 +217,7 @@ def init_foss(ctx: click.Context): "No Token provided. Either provide FOSS_TOKEN in environment or use the -t option." ) raise e - try: - foss = Fossology(ctx.obj["SERVER"], ctx.obj["TOKEN"]) # using new API - except AuthenticationError: # API version < 1.2.3 requires a username - foss = Fossology( - ctx.obj["SERVER"], - ctx.obj["TOKEN"], - name=ctx.obj["USERNAME"], - ) + foss = Fossology(ctx.obj["SERVER"], ctx.obj["TOKEN"]) # using new API ctx.obj["FOSS"] = foss ctx.obj["USER"] = foss.user.name logger.debug(f"Logged in as user {foss.user.name}") @@ -323,7 +314,7 @@ def cli( logger.debug("Started in debug mode") if foss_needs_initialization: logger.debug( - f"Using API: {pprint.pformat(foss.api)} version {pprint.pformat(foss.version)}" + f"Using API: {pprint.pformat(foss.api)} version {pprint.pformat(foss.info.version)}" ) logger.debug( f"Running as user {pprint.pformat(foss.user.name)} on {pprint.pformat(foss.host)}" diff --git a/fossology/groups.py b/fossology/groups.py index 0155185..22d0fb6 100644 --- a/fossology/groups.py +++ b/fossology/groups.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging diff --git a/fossology/jobs.py b/fossology/jobs.py index 584bc3d..7ab5ae1 100644 --- a/fossology/jobs.py +++ b/fossology/jobs.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import json diff --git a/fossology/license.py b/fossology/license.py index f9c66ce..f0af57a 100644 --- a/fossology/license.py +++ b/fossology/license.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import json diff --git a/fossology/obj.py b/fossology/obj.py index d54a4a5..e3d8bdc 100644 --- a/fossology/obj.py +++ b/fossology/obj.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import json diff --git a/fossology/report.py b/fossology/report.py index 16ed2ec..9a0436e 100644 --- a/fossology/report.py +++ b/fossology/report.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging diff --git a/fossology/uploads.py b/fossology/uploads.py index ba00ae5..ba51cae 100644 --- a/fossology/uploads.py +++ b/fossology/uploads.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import json import logging diff --git a/fossology/users.py b/fossology/users.py index 7ceee67..1171f15 100644 --- a/fossology/users.py +++ b/fossology/users.py @@ -1,5 +1,5 @@ # mypy: disable-error-code="attr-defined" -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging diff --git a/tests/conftest.py b/tests/conftest.py index 1252e43..c48d016 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging diff --git a/tests/test_folders.py b/tests/test_folders.py index 911cc3e..ab43408 100644 --- a/tests/test_folders.py +++ b/tests/test_folders.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import secrets diff --git a/tests/test_foss_cli_create_cmds.py b/tests/test_foss_cli_create_cmds.py index 52d9c92..0be36ce 100644 --- a/tests/test_foss_cli_create_cmds.py +++ b/tests/test_foss_cli_create_cmds.py @@ -1,3 +1,6 @@ +# Copyright 2022 Siemens AG +# SPDX-License-Identifier: MIT + __doc__ = """Test 'create_*' sub commands of foss_cli""" import time diff --git a/tests/test_foss_cli_flow_cmds.py b/tests/test_foss_cli_flow_cmds.py index b689383..ac1d6dd 100644 --- a/tests/test_foss_cli_flow_cmds.py +++ b/tests/test_foss_cli_flow_cmds.py @@ -1,3 +1,6 @@ +# Copyright 2022 Siemens AG +# SPDX-License-Identifier: MIT + __doc__ = """Test the "workflow" sub commands of foss_cli""" import configparser import os diff --git a/tests/test_foss_cli_help.py b/tests/test_foss_cli_help.py index 1d16af8..20e115d 100644 --- a/tests/test_foss_cli_help.py +++ b/tests/test_foss_cli_help.py @@ -1,3 +1,6 @@ +# Copyright 2022 Siemens AG +# SPDX-License-Identifier: MIT + __doc__ = """Test the "help" text of the different sub commands of foss_cli""" from fossology import foss_cli diff --git a/tests/test_foss_cli_logger.py b/tests/test_foss_cli_logger.py index baed85f..af282c1 100644 --- a/tests/test_foss_cli_logger.py +++ b/tests/test_foss_cli_logger.py @@ -1,3 +1,6 @@ +# Copyright 2022 Siemens AG +# SPDX-License-Identifier: MIT + __doc__ = """Test the logging of the foss_cli foss_cli distinguishes the verbosity levels 0,1,2 defined in foss_cli.py diff --git a/tests/test_foss_cli_start_workflow.py b/tests/test_foss_cli_start_workflow.py index 97e61ce..849a10e 100644 --- a/tests/test_foss_cli_start_workflow.py +++ b/tests/test_foss_cli_start_workflow.py @@ -1,3 +1,6 @@ +# Copyright 2022 Siemens AG +# SPDX-License-Identifier: MIT + from pathlib import PurePath from fossology import foss_cli diff --git a/tests/test_groups.py b/tests/test_groups.py index 8d8786a..950c81f 100644 --- a/tests/test_groups.py +++ b/tests/test_groups.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import secrets diff --git a/tests/test_jobs.py b/tests/test_jobs.py index a13593d..9fabbf3 100644 --- a/tests/test_jobs.py +++ b/tests/test_jobs.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import secrets diff --git a/tests/test_license.py b/tests/test_license.py index 16c5758..58236cb 100644 --- a/tests/test_license.py +++ b/tests/test_license.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT from unittest.mock import MagicMock diff --git a/tests/test_report.py b/tests/test_report.py index 0e50bca..780554a 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import mimetypes diff --git a/tests/test_search.py b/tests/test_search.py index e758320..50f7cd6 100644 --- a/tests/test_search.py +++ b/tests/test_search.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import secrets diff --git a/tests/test_upload_from.py b/tests/test_upload_from.py index 8259ee7..77e8a6f 100644 --- a/tests/test_upload_from.py +++ b/tests/test_upload_from.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT from fossology import Fossology diff --git a/tests/test_upload_licenses_copyrights.py b/tests/test_upload_licenses_copyrights.py index ebe819f..95dc2d4 100644 --- a/tests/test_upload_licenses_copyrights.py +++ b/tests/test_upload_licenses_copyrights.py @@ -1,3 +1,6 @@ +# Copyright 2023 Siemens AG +# SPDX-License-Identifier: MIT + import pytest import responses from tenacity import RetryError diff --git a/tests/test_upload_permissions.py b/tests/test_upload_permissions.py index 6e758da..f42d322 100644 --- a/tests/test_upload_permissions.py +++ b/tests/test_upload_permissions.py @@ -1,3 +1,6 @@ +# Copyright 2023 Siemens AG +# SPDX-License-Identifier: MIT + import secrets import pytest diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 3b8d063..8058253 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import mimetypes diff --git a/tests/test_users.py b/tests/test_users.py index 9e55dba..f2a410b 100644 --- a/tests/test_users.py +++ b/tests/test_users.py @@ -1,4 +1,4 @@ -# Copyright 2019-2021 Siemens AG +# Copyright 2019 Siemens AG # SPDX-License-Identifier: MIT import logging