From ac72eb283c0ead53697532cc5a9c6c80542b7d34 Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Sun, 27 Sep 2026 22:23:58 +0200 Subject: [PATCH 1/5] style: organize imports Organized imports according to Ruff (I001). --- src/jcloud_docsgen/core/python/_core.py | 3 +-- tests/unit/cli/test_python.py | 3 +-- .../core/python/_core/test_PythonDocumentationGenerator.py | 5 ++--- .../case03/project/user_management/service.py | 2 +- .../case03/project/user_management/storage.py | 1 + 5 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/jcloud_docsgen/core/python/_core.py b/src/jcloud_docsgen/core/python/_core.py index af783b3..e2373ff 100644 --- a/src/jcloud_docsgen/core/python/_core.py +++ b/src/jcloud_docsgen/core/python/_core.py @@ -16,14 +16,13 @@ from __future__ import annotations import ast import pathlib +import shutil from collections.abc import Iterator from dataclasses import dataclass from typing import TypeAlias import docstring_parser -import shutil - from ...exceptions import ( DirectoryNotEmptyError, InvalidNamespaceError, diff --git a/tests/unit/cli/test_python.py b/tests/unit/cli/test_python.py index d15e037..c185100 100644 --- a/tests/unit/cli/test_python.py +++ b/tests/unit/cli/test_python.py @@ -13,11 +13,10 @@ # limitations under the License. import pathlib +import tempfile import pytest -import tempfile - from jcloud_docsgen.cli.cli import create_argument_parser from jcloud_docsgen.cli.cli import main as cli_main from jcloud_docsgen.cli.languages.python import parse_sections_list diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py index fb90798..72eea90 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py @@ -13,17 +13,16 @@ # limitations under the License. import pathlib +import tempfile import pytest -import tempfile - -from src.jcloud_docsgen.exceptions import DirectoryNotEmptyError from src.jcloud_docsgen.core.python import PythonDocumentationGenerator from src.jcloud_docsgen.core.python.namespaces import ( PythonModuleNamespace, PythonPackageNamespace, ) +from src.jcloud_docsgen.exceptions import DirectoryNotEmptyError @pytest.mark.parametrize( diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/service.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/service.py index c240ac8..f3cc9b0 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/service.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/service.py @@ -1,6 +1,6 @@ +from .exceptions import InvalidEmailError, UserNotFoundError from .models import User from .storage import InMemoryUserStorage -from .exceptions import UserNotFoundError, InvalidEmailError from .utils import is_valid_email, normalize_name diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py index 659c14f..88229b1 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py @@ -1,4 +1,5 @@ from typing import Dict, List + from .models import User -- 2.47.3 From b2a7c9a0e34190b550bc38666c7209c4c5a5875f Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Sun, 27 Sep 2026 22:29:48 +0200 Subject: [PATCH 2/5] style: fix lines which exceed the line length limit --- .../test_PythonDocumentationGenerator.py | 4 ++- .../python/_core/test__collect_definitions.py | 35 ++++++++++--------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py index 72eea90..76f503a 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator.py @@ -85,7 +85,9 @@ def test_PythonDocumentationGenerator_collect_modules( python_documentation_generator: PythonDocumentationGenerator, expected, ): - assert python_documentation_generator.namespace().sub_namespaces == expected + assert ( + python_documentation_generator.namespace().sub_namespaces + ) == expected @pytest.mark.parametrize( diff --git a/tests/unit/core/python/_core/test__collect_definitions.py b/tests/unit/core/python/_core/test__collect_definitions.py index fdb4cc3..4fa4f5f 100644 --- a/tests/unit/core/python/_core/test__collect_definitions.py +++ b/tests/unit/core/python/_core/test__collect_definitions.py @@ -292,22 +292,25 @@ def test_PythonDocumentationGenerator_collect_modules( None, [ ( - """pytest.mark.parametrize('python_documentation_gener""" - """ator,expected', [(PythonDocumentationGenerator(path""" - """lib.Path('tests/unit/core/python/_core/test_project""" - """_dirs/pdir_1'), pathlib.Path('tests/unit/core/pytho""" - """n/_core/test_project_dirs/pdir_1/docs')), []), (Pyt""" - """honDocumentationGenerator(pathlib.Path('tests/unit/""" - """core/python/_core/test_project_dirs/pdir_2'), pathl""" - """ib.Path('tests/unit/core/python/_core/test_project_""" - """dirs/pdir_2/docs')), [PythonPackageNamespace('pkg',""" - """ [PythonModuleNamespace('module')])]), (PythonDocum""" - """entationGenerator(pathlib.Path('tests/unit/core/pyt""" - """hon/_core/test_project_dirs/pdir_3'), pathlib.Path(""" - """'tests/unit/core/python/_core/test_project_dirs/pdi""" - """r_3/docs')), [PythonPackageNamespace('pkg', [Python""" - """ModuleNamespace(\'module'), PythonPackageNamespace(""" - """\'pkg\', [PythonModuleNamespace(\'module2')])])])])""" + "pytest.mark.parametrize('python_documentatio" + "n_generator,expected', [(PythonDocumentation" + "Generator(pathlib.Path('tests/unit/core/pyth" + "on/_core/test_project_dirs/pdir_1'), pathlib" + ".Path('tests/unit/core/python/_core/test_pro" + "ject_dirs/pdir_1/docs')), []), (PythonDocume" + "ntationGenerator(pathlib.Path('tests/unit/co" + "re/python/_core/test_project_dirs/pdir_2'), " + "pathlib.Path('tests/unit/core/python/_core/t" + "est_project_dirs/pdir_2/docs')), [PythonPack" + "ageNamespace('pkg', [PythonModuleNamespace('" + "module')])]), (PythonDocumentationGenerator(" + "pathlib.Path('tests/unit/core/python/_core/t" + "est_project_dirs/pdir_3'), pathlib.Path('tes" + 'ts/unit/core/python/_core/test_project_dirs/' + "pdir_3/docs')), [PythonPackageNamespace('pkg" + "', [PythonModuleNamespace('module'), Python" + "PackageNamespace('pkg', [PythonModuleNames" + "pace('module2')])])])])" ) ], ), -- 2.47.3 From 896bfcc2dde302a718d9b00e562b0517ba890efd Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Sun, 27 Sep 2026 23:45:38 +0200 Subject: [PATCH 3/5] style: use target version practices --- src/jcloud_docsgen/utils.py | 7 +++---- .../case03/expected/user_management/storage.md | 4 ++-- .../case03/project/user_management/models.py | 3 +-- .../case03/project/user_management/storage.py | 6 ++---- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/jcloud_docsgen/utils.py b/src/jcloud_docsgen/utils.py index 197a292..f8da8a6 100644 --- a/src/jcloud_docsgen/utils.py +++ b/src/jcloud_docsgen/utils.py @@ -20,7 +20,6 @@ import errno import os import pathlib import types -from typing import Union try: from warnings import deprecated @@ -154,10 +153,10 @@ def assert_that_is_instance( obj: object, class_or_tuple: type | types.UnionType | tuple[type, ...], ) -> None: - if not isinstance(class_or_tuple, Union[type, types.UnionType, tuple]): + if not isinstance(class_or_tuple, (type, types.UnionType, tuple)): raise TypeError( - f"class_or_tuple: expected 'Union[type, types.UnionType, " - f"tuple[type, ...]]', 'got {type(class_or_tuple).__name__}'", + f"class_or_tuple: expected 'type | types.UnionType, tupl" + f"e[type, ...]', 'got {type(class_or_tuple).__name__}'", ) if not isinstance(obj, class_or_tuple): if isinstance(class_or_tuple, (tuple, types.UnionType)): diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/expected/user_management/storage.md b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/expected/user_management/storage.md index 8753e51..b6fe41e 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/expected/user_management/storage.md +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/expected/user_management/storage.md @@ -125,12 +125,12 @@ Returns all users. ##### Method signature ```python -list_all(self) -> List[User] +list_all(self) -> list[User] ``` ##### Returns -Return type: `List[User]` +Return type: `list[User]` ##### Parameters diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/models.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/models.py index bf4d0c9..468106b 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/models.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/models.py @@ -1,5 +1,4 @@ from dataclasses import dataclass -from typing import Optional @dataclass @@ -11,4 +10,4 @@ class User: id: str name: str email: str - age: Optional[int] = None + age: int | None = None diff --git a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py index 88229b1..d837acc 100644 --- a/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py +++ b/tests/unit/core/python/_core/test_PythonDocumentationGenerator/test_generate_documentation/case03/project/user_management/storage.py @@ -1,5 +1,3 @@ -from typing import Dict, List - from .models import User @@ -10,7 +8,7 @@ class InMemoryUserStorage: """ def __init__(self): - self._users: Dict[str, User] = {} + self._users: dict[str, User] = {} def add(self, user: User) -> None: """Adds a user.""" @@ -24,6 +22,6 @@ class InMemoryUserStorage: """Deletes a user.""" del self._users[user_id] - def list_all(self) -> List[User]: + def list_all(self) -> list[User]: """Returns all users.""" return list(self._users.values()) -- 2.47.3 From f796263c0e2f153678629c70e8186ca159ac8b59 Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Sun, 27 Sep 2026 23:56:00 +0200 Subject: [PATCH 4/5] fix: fix syntax errors (target version) Fixed all lines which were syntax errors in the target version (only multi-line f-strings). --- src/jcloud_docsgen/core/python/_core.py | 19 +++++++-------- src/jcloud_docsgen/exceptions.py | 32 +++++++++++++++---------- src/jcloud_docsgen/utils.py | 5 ++-- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/jcloud_docsgen/core/python/_core.py b/src/jcloud_docsgen/core/python/_core.py index e2373ff..f9881db 100644 --- a/src/jcloud_docsgen/core/python/_core.py +++ b/src/jcloud_docsgen/core/python/_core.py @@ -249,9 +249,8 @@ def _markdown_table( if len(row) != header_len: if force_row_lengths: raise ValueError( - f'expected {header_len} value{ - "s" if header_len > 1 else "" - }, got {len(row)}', + f'expected {header_len} value' + f'{"s" if header_len > 1 else ""}, got {len(row)}' ) else: row = _fit_row_length(header_len, row) @@ -277,9 +276,8 @@ def _markdown_table( if len(row) != header_len: if force_row_lengths: raise ValueError( - f'expected {header_len} value{ - "s" if header_len > 1 else "" - }, got {len(row)}', + f'expected {header_len} value' + f'{"s" if header_len > 1 else ""}, got {len(row)}' ) else: row = _fit_row_length(header_len, row) @@ -601,11 +599,10 @@ class PythonDefinitionDocumentationGenerator: if _is_docstring(self.definition.doc) or not self.skip_empty_sections: if self.allow_html: - md += f'
Docstring' + md += ( + f'
Docstring' + ) else: md += self.level * '#' + '# Docstring\n\n' diff --git a/src/jcloud_docsgen/exceptions.py b/src/jcloud_docsgen/exceptions.py index d687917..fa506e8 100644 --- a/src/jcloud_docsgen/exceptions.py +++ b/src/jcloud_docsgen/exceptions.py @@ -28,9 +28,11 @@ class NamespaceError(ValueError): if not self.args: return '' else: - return f'{self.args[0]}{ - ": " if self.namespace_identifier and self.args[0] else "" - }{self.namespace_identifier if self.args[0] else ""}' + return ( + self.args[0] + + (': ' if self.namespace_identifier and self.args[0] else '') + + (self.namespace_identifier if self.args[0] else '') + ) class InvalidNamespaceError(NamespaceError): ... @@ -55,9 +57,11 @@ class PythonIdentifierError(ValueError): if not self.args: return '' else: - return f'{self.args[0]}{ - ": " if self.identifier and self.args[0] else "" - }{self.identifier if self.args[0] else ""}' + return ( + self.args[0] + + (': ' if self.identifier and self.args[0] else '') + + (self.identifier if self.args[0] else '') + ) class InvalidPythonIdentifierError(PythonIdentifierError): ... @@ -76,9 +80,11 @@ class PythonAnnotationError(ValueError): if not self.args: return '' else: - return f'{self.args[0]}{ - ": " if self.annotation and self.args[0] else "" - }{self.annotation if self.args[0] else ""}' + return ( + self.args[0] + + (': ' if self.annotation and self.args[0] else '') + + (self.annotation if self.args[0] else '') + ) class InvalidPythonAnnotationError(PythonAnnotationError): ... @@ -97,9 +103,11 @@ class PythonDefinitionError(ValueError): if not self.args: return '' else: - return f'{self.args[0]}{ - ": " if self.definition and self.args[0] else "" - }{self.definition if self.args[0] else ""}' + return ( + self.args[0] + + (': ' if self.definition and self.args[0] else '') + + (self.definition if self.args[0] else '') + ) class PythonArgumentStructureError(PythonDefinitionError): ... diff --git a/src/jcloud_docsgen/utils.py b/src/jcloud_docsgen/utils.py index f8da8a6..8e29898 100644 --- a/src/jcloud_docsgen/utils.py +++ b/src/jcloud_docsgen/utils.py @@ -174,9 +174,8 @@ def assert_that_is_instance( else: exception_message_expected = "'" + class_or_tuple.__name__ + "'" raise TypeError( - f"expected {exception_message_expected}, got '{ - type(obj).__name__ - }'", + f'expected {exception_message_expected}' + f", got '{type(obj).__name__}'" ) -- 2.47.3 From 37308227d9d6954c519818e19185cd6362b69ca0 Mon Sep 17 00:00:00 2001 From: Jakob Scheid Date: Sun, 27 Sep 2026 23:59:18 +0200 Subject: [PATCH 5/5] chore: add noqa comments to wildcard imports Added noqa comments to suppress linting warnings for wildcard imports. --- src/jcloud_docsgen/__init__.py | 2 +- src/jcloud_docsgen/core/python/__init__.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/jcloud_docsgen/__init__.py b/src/jcloud_docsgen/__init__.py index 8989209..c19a6c8 100644 --- a/src/jcloud_docsgen/__init__.py +++ b/src/jcloud_docsgen/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. from . import cli -from .core import * +from .core import * # noqa: F403 from .core import __all__ as _core__all__ __all__ = [ diff --git a/src/jcloud_docsgen/core/python/__init__.py b/src/jcloud_docsgen/core/python/__init__.py index 1213677..4df7ce8 100644 --- a/src/jcloud_docsgen/core/python/__init__.py +++ b/src/jcloud_docsgen/core/python/__init__.py @@ -13,7 +13,7 @@ # limitations under the License. from . import namespaces -from ._core import * +from ._core import * # noqa: F403 from ._core import __all__ as _core__all__ __all__ = [ -- 2.47.3