From f31ab3d46ca0669c93a744332f0a55c0ce44a51d Mon Sep 17 00:00:00 2001 From: Jan Kowalleck Date: Thu, 5 Jun 2025 12:42:02 +0200 Subject: [PATCH 1/4] chore: bring pyupgrade Signed-off-by: Jan Kowalleck --- .github/workflows/python.yml | 24 ++++++++++++++++++++++++ CONTRIBUTING.md | 9 ++++++--- pyproject.toml | 1 + tox.ini | 12 ++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 3e606d92e..02a982a17 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -44,6 +44,30 @@ env: permissions: {} jobs: + pyupgrade: + name: Find Upgradable CodingStandards + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout + # see https://github.com/actions/checkout + uses: actions/checkout@v4 + - name: Setup Python Environment + # see https://github.com/actions/setup-python + uses: actions/setup-python@v5 + with: + python-version: ${{ env.PYTHON_VERSION_DEFAULT }} + architecture: 'x64' + - name: Install poetry + # see https://github.com/marketplace/actions/setup-poetry + uses: Gr1N/setup-poetry@v9 + with: + poetry-version: ${{ env.POETRY_VERSION }} + - name: Install dependencies + run: poetry install --no-root + - name: Run tox + run: poetry run tox run -e pyupgrade -s false + coding-standards: name: Linting & Coding Standards runs-on: ubuntu-latest diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f1a758a01..11ee314e6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,13 +17,16 @@ poetry install ## Code style +THis project loves latest python features. This project uses [PEP8] Style Guide for Python Code. -This project loves sorted imports. +This project loves sorted imports. + Get it all applied via: ```shell -poetry run isort . -poetry run autopep8 -ir cyclonedx_py/ tests/ +poetry run -- tox r -e pyupgrade -- --exit-zero-even-if-changed +poetry run -- tox r -e isort +poetry run -- tox r -e autopep8 ``` This project prefers `f'strings'` over `'string'.format()`. diff --git a/pyproject.toml b/pyproject.toml index 6d60ea130..050d806f9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -94,6 +94,7 @@ mypy = "1.16.0" bandit = "1.8.3" tomli = { version = "^2.0.1", python = "<3.11" } tox = "4.26.0" +pyupgrade = "3.20.0" # min version required to be able to install some dependencies # see https://github.com/MichaelKim0407/flake8-use-fstring/issues/33 diff --git a/tox.ini b/tox.ini index c0ce392b4..c59106545 100644 --- a/tox.ini +++ b/tox.ini @@ -46,3 +46,15 @@ commands = skip_install = True commands = poetry run bandit -c bandit.yml -v -r cyclonedx_py tests + +[testenv:pyupgrade] +allowlist_externals = poetry, sh +commands = sh -c "\ + find cyclonedx_py tests -not -path '*/.venv/*' -type f -name '*.py' -print0 \ + | xargs -0 poetry run pyupgrade --py39-plus {posargs} " + +[testenv:isort] +commands = poetry run isort . + +[testenv:autopep8] +commands = poetry run autopep8 --in-place -r cyclonedx typings tests tools examples From 66176bc86f75f8dd23246673792cb354fe38ef46 Mon Sep 17 00:00:00 2001 From: Jan Kowalleck Date: Thu, 5 Jun 2025 12:57:26 +0200 Subject: [PATCH 2/4] style: upgrade code style Signed-off-by: Jan Kowalleck --- cyclonedx_py/_internal/pipenv.py | 2 +- cyclonedx_py/_internal/poetry.py | 4 ++-- cyclonedx_py/_internal/utils/pyproject.py | 2 +- tests/__init__.py | 8 ++++---- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cyclonedx_py/_internal/pipenv.py b/cyclonedx_py/_internal/pipenv.py index 3401dcf0d..b740c8fc6 100644 --- a/cyclonedx_py/_internal/pipenv.py +++ b/cyclonedx_py/_internal/pipenv.py @@ -124,7 +124,7 @@ def __call__(self, *, # type:ignore[override] lock_file = join(project_directory, 'Pipfile.lock') try: - lock = open(lock_file, 'rt', encoding='utf8', errors='replace') + lock = open(lock_file, encoding='utf8', errors='replace') except OSError as err: raise ValueError(f'Could not open lock file: {lock_file}') from err with lock: diff --git a/cyclonedx_py/_internal/poetry.py b/cyclonedx_py/_internal/poetry.py index 09ba68dab..c6a5845b3 100644 --- a/cyclonedx_py/_internal/poetry.py +++ b/cyclonedx_py/_internal/poetry.py @@ -171,11 +171,11 @@ def __call__(self, *, # type:ignore[override] pyproject_file = join(project_directory, 'pyproject.toml') lock_file = join(project_directory, 'poetry.lock') try: - pyproject = open(pyproject_file, 'rt', encoding='utf8', errors='replace') + pyproject = open(pyproject_file, encoding='utf8', errors='replace') except OSError as err: raise ValueError(f'Could not open pyproject file: {pyproject_file}') from err try: - lock = open(lock_file, 'rt', encoding='utf8', errors='replace') + lock = open(lock_file, encoding='utf8', errors='replace') except OSError as err: pyproject.close() raise ValueError(f'Could not open lock file: {lock_file}') from err diff --git a/cyclonedx_py/_internal/utils/pyproject.py b/cyclonedx_py/_internal/utils/pyproject.py index eccb47a20..a45efce02 100644 --- a/cyclonedx_py/_internal/utils/pyproject.py +++ b/cyclonedx_py/_internal/utils/pyproject.py @@ -43,7 +43,7 @@ def pyproject2component(data: dict[str, Any], *, def pyproject_load(pyproject_file: str) -> dict[str, Any]: try: - pyproject_fh = open(pyproject_file, 'rt', encoding='utf8', errors='replace') + pyproject_fh = open(pyproject_file, encoding='utf8', errors='replace') except OSError as err: raise ValueError(f'Could not open pyproject file: {pyproject_file}') from err with pyproject_fh: diff --git a/tests/__init__.py b/tests/__init__.py index a47f58105..75a968196 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -20,7 +20,7 @@ from os import getenv, path from pathlib import Path from re import sub as re_sub -from typing import Any, Dict, Union +from typing import Any, Union from unittest import TestCase from xml.sax.saxutils import escape as xml_escape, quoteattr as xml_quoteattr # nosec:B406 @@ -62,12 +62,12 @@ def getSnapshotFile(snapshot_name: str) -> str: # noqa: N802 @classmethod def writeSnapshot(cls, snapshot_name: str, data: str) -> None: # noqa: N802 - with open(cls.getSnapshotFile(snapshot_name), 'wt', encoding='utf8', newline='\n') as sf: + with open(cls.getSnapshotFile(snapshot_name), 'w', encoding='utf8', newline='\n') as sf: sf.write(data) @classmethod def readSnapshot(cls, snapshot_name: str) -> str: # noqa: N802 - with open(cls.getSnapshotFile(snapshot_name), 'rt', encoding='utf8', newline='\n') as sf: + with open(cls.getSnapshotFile(snapshot_name), encoding='utf8', newline='\n') as sf: return sf.read() def assertEqualSnapshot(self: Union[TestCase, 'SnapshotMixin'], # noqa: N802 @@ -227,7 +227,7 @@ def make_comparable(bom: str, of: OutputFormat) -> str: # endregion reproducible test results -def load_pyproject() -> Dict[str, Any]: +def load_pyproject() -> dict[str, Any]: if sys.version_info >= (3, 11): from tomllib import load as toml_load else: From d8a79471c456889a508e9bb384355096777f7b56 Mon Sep 17 00:00:00 2001 From: Jan Kowalleck Date: Thu, 5 Jun 2025 13:07:59 +0200 Subject: [PATCH 3/4] style: remove unused type-error-suppressiosn Signed-off-by: Jan Kowalleck --- cyclonedx_py/_internal/cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cyclonedx_py/_internal/cli.py b/cyclonedx_py/_internal/cli.py index bb54ab463..f17dac635 100644 --- a/cyclonedx_py/_internal/cli.py +++ b/cyclonedx_py/_internal/cli.py @@ -186,10 +186,10 @@ def _shorten_purls(self, bom: 'Bom') -> bool: if component.purl is not None: purl = component.purl component.purl = type(purl)( - type=purl.type, # type:ignore[arg-type] - namespace=purl.namespace, # type:ignore[arg-type] - name=purl.name, # type:ignore[arg-type] - version=purl.version # type:ignore[arg-type] + type=purl.type, + namespace=purl.namespace, + name=purl.name, + version=purl.version # omit qualifiers # omit subdirectory ) From 460b916cae76ef62b57e7a00490e8c44cd7696e5 Mon Sep 17 00:00:00 2001 From: Jan Kowalleck Date: Thu, 5 Jun 2025 13:14:45 +0200 Subject: [PATCH 4/4] chore: rename CI/CT job Signed-off-by: Jan Kowalleck --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 02a982a17..41156b5d8 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -45,7 +45,7 @@ permissions: {} jobs: pyupgrade: - name: Find Upgradable CodingStandards + name: find Upgradable CodingFeatures runs-on: ubuntu-latest timeout-minutes: 10 steps: