From e1baa60eb0f6e7e57cbb5087940acefcaa86fb97 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Fri, 7 Nov 2025 18:48:20 -0500 Subject: [PATCH] chore: enable more Ruff checks (#2654) Signed-off-by: Henry Schreiner --- bin/bump_version.py | 4 ++-- cibuildwheel/__main__.py | 2 +- cibuildwheel/extra.py | 4 ++-- cibuildwheel/frontend.py | 2 +- cibuildwheel/oci_container.py | 4 ++-- cibuildwheel/platforms/__init__.py | 17 ++++++++++------- cibuildwheel/platforms/ios.py | 15 +++++++++------ cibuildwheel/platforms/linux.py | 6 ++++-- cibuildwheel/platforms/macos.py | 2 +- cibuildwheel/platforms/pyodide.py | 2 +- cibuildwheel/util/cmd.py | 2 +- cibuildwheel/util/python_build_standalone.py | 2 +- pyproject.toml | 9 +++++++++ test/test_android.py | 8 +------- unit_test/option_prepare_test.py | 4 ++-- unit_test/options_toml_test.py | 5 ++++- 16 files changed, 51 insertions(+), 37 deletions(-) diff --git a/bin/bump_version.py b/bin/bump_version.py index af2d7ae3..5c4eb06f 100755 --- a/bin/bump_version.py +++ b/bin/bump_version.py @@ -68,8 +68,8 @@ def bump_version() -> None: sys.exit(1) # fmt: off - print( 'Current version:', current_version) - new_version = input(' New version: ').strip() + print( "Current version:", current_version) + new_version = input(" New version: ").strip() # fmt: on try: diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py index 574e5fcb..6d0e20ab 100644 --- a/cibuildwheel/__main__.py +++ b/cibuildwheel/__main__.py @@ -314,7 +314,7 @@ def _compute_platform(args: CommandLineArguments) -> PlatformName: if args.only: return _compute_platform_only(args.only) elif platform_option_value != "auto": - return typing.cast(PlatformName, platform_option_value) + return typing.cast("PlatformName", platform_option_value) return native_platform() diff --git a/cibuildwheel/extra.py b/cibuildwheel/extra.py index e13df6e0..0a28cc92 100644 --- a/cibuildwheel/extra.py +++ b/cibuildwheel/extra.py @@ -41,7 +41,7 @@ def dump_python_configurations( def _json_request(request: urllib.request.Request, timeout: int = 30) -> dict[str, Any]: with urllib.request.urlopen(request, timeout=timeout) as response: - return typing.cast(dict[str, Any], json.load(response)) + return typing.cast("dict[str, Any]", json.load(response)) def github_api_request(path: str, *, max_retries: int = 3) -> dict[str, Any]: @@ -98,4 +98,4 @@ def get_pyodide_xbuildenv_info() -> PyodideXBuildEnvInfo: "https://pyodide.github.io/pyodide/api/pyodide-cross-build-environments.json" ) with urllib.request.urlopen(xbuildenv_info_url) as response: - return typing.cast(PyodideXBuildEnvInfo, json.loads(response.read().decode("utf-8"))) + return typing.cast("PyodideXBuildEnvInfo", json.loads(response.read().decode("utf-8"))) diff --git a/cibuildwheel/frontend.py b/cibuildwheel/frontend.py index 7973354f..6684851f 100644 --- a/cibuildwheel/frontend.py +++ b/cibuildwheel/frontend.py @@ -24,7 +24,7 @@ class BuildFrontendConfig: msg = f"Unrecognised build frontend {name!r}, must be one of {names}" raise ValueError(msg) - name = typing.cast(BuildFrontendName, name) + name = typing.cast("BuildFrontendName", name) args = config_dict.get("args") or [] return cls(name=name, args=args) diff --git a/cibuildwheel/oci_container.py b/cibuildwheel/oci_container.py index ca77c06d..5e4edf74 100644 --- a/cibuildwheel/oci_container.py +++ b/cibuildwheel/oci_container.py @@ -78,7 +78,7 @@ class OCIContainerEngineConfig: msg = f"unknown container engine {name}" raise ValueError(msg) - name = typing.cast(ContainerEngineName, name) + name = typing.cast("ContainerEngineName", name) # some flexibility in the option names to cope with TOML conventions create_args = config_dict.get("create_args") or config_dict.get("create-args") or [] disable_host_mount_options = ( @@ -515,7 +515,7 @@ class OCIContainer: capture_output=True, ) ) - return typing.cast(dict[str, str], env) + return typing.cast("dict[str, str]", env) def environment_executor(self, command: Sequence[str], environment: dict[str, str]) -> str: # used as an EnvironmentExecutor to evaluate commands and capture output diff --git a/cibuildwheel/platforms/__init__.py b/cibuildwheel/platforms/__init__.py index 63c4c37d..cb31b0c8 100644 --- a/cibuildwheel/platforms/__init__.py +++ b/cibuildwheel/platforms/__init__.py @@ -1,16 +1,19 @@ from __future__ import annotations import sys -from collections.abc import Sequence -from pathlib import Path -from typing import Final, Protocol +from typing import TYPE_CHECKING, Final, Protocol from cibuildwheel import errors -from cibuildwheel.architecture import Architecture -from cibuildwheel.options import Options from cibuildwheel.platforms import android, ios, linux, macos, pyodide, windows -from cibuildwheel.selector import BuildSelector -from cibuildwheel.typing import GenericPythonConfiguration, PlatformName + +if TYPE_CHECKING: + from collections.abc import Sequence + from pathlib import Path + + from cibuildwheel.architecture import Architecture + from cibuildwheel.options import Options + from cibuildwheel.selector import BuildSelector + from cibuildwheel.typing import GenericPythonConfiguration, PlatformName class PlatformModule(Protocol): diff --git a/cibuildwheel/platforms/ios.py b/cibuildwheel/platforms/ios.py index e32de793..d7c7f3cc 100644 --- a/cibuildwheel/platforms/ios.py +++ b/cibuildwheel/platforms/ios.py @@ -8,22 +8,17 @@ import shutil import subprocess import sys import textwrap -from collections.abc import Sequence, Set from pathlib import Path -from typing import assert_never +from typing import TYPE_CHECKING, assert_never from filelock import FileLock from .. import errors -from ..architecture import Architecture -from ..environment import ParsedEnvironment from ..frontend import ( BuildFrontendName, get_build_frontend_extra_flags, ) from ..logger import log -from ..options import Options -from ..selector import BuildSelector from ..util import resources from ..util.cmd import call, shell, split_command from ..util.file import ( @@ -39,6 +34,14 @@ from ..util.packaging import ( from ..venv import constraint_flags, virtualenv from .macos import install_cpython as install_build_cpython +if TYPE_CHECKING: + from collections.abc import Sequence, Set + + from ..architecture import Architecture + from ..environment import ParsedEnvironment + from ..options import Options + from ..selector import BuildSelector + @dataclasses.dataclass(frozen=True, kw_only=True) class PythonConfiguration: diff --git a/cibuildwheel/platforms/linux.py b/cibuildwheel/platforms/linux.py index 8411a935..a04104f1 100644 --- a/cibuildwheel/platforms/linux.py +++ b/cibuildwheel/platforms/linux.py @@ -6,7 +6,7 @@ import textwrap from collections import OrderedDict from collections.abc import Iterable, Iterator, Sequence, Set from pathlib import Path, PurePath, PurePosixPath -from typing import assert_never +from typing import TYPE_CHECKING, assert_never from .. import errors from ..architecture import Architecture @@ -15,12 +15,14 @@ from ..logger import log from ..oci_container import OCIContainer, OCIContainerEngineConfig, OCIPlatform from ..options import BuildOptions, Options from ..selector import BuildSelector -from ..typing import PathOrStr from ..util import resources from ..util.file import copy_test_sources from ..util.helpers import prepare_command, unwrap from ..util.packaging import find_compatible_wheel +if TYPE_CHECKING: + from ..typing import PathOrStr + ARCHITECTURE_OCI_PLATFORM_MAP = { Architecture.x86_64: OCIPlatform.AMD64, Architecture.i686: OCIPlatform.i386, diff --git a/cibuildwheel/platforms/macos.py b/cibuildwheel/platforms/macos.py index 3151d3e4..e6493f35 100644 --- a/cibuildwheel/platforms/macos.py +++ b/cibuildwheel/platforms/macos.py @@ -60,7 +60,7 @@ def get_macos_version() -> tuple[int, int]: capture_stdout=True, ) version = tuple(map(int, version_str.split(".")[:2])) - return typing.cast(tuple[int, int], version) + return typing.cast("tuple[int, int]", version) @functools.cache diff --git a/cibuildwheel/platforms/pyodide.py b/cibuildwheel/platforms/pyodide.py index 09de6a44..07a9894e 100644 --- a/cibuildwheel/platforms/pyodide.py +++ b/cibuildwheel/platforms/pyodide.py @@ -130,7 +130,7 @@ def get_all_xbuildenv_version_info(env: dict[str, str]) -> list[PyodideXBuildEnv msg = f"Invalid xbuildenvs info, got {xbuildenvs_info}" raise ValueError(msg) - return typing.cast(list[PyodideXBuildEnvInfo], xbuildenvs_info["environments"]) + return typing.cast("list[PyodideXBuildEnvInfo]", xbuildenvs_info["environments"]) def get_xbuildenv_version_info( diff --git a/cibuildwheel/util/cmd.py b/cibuildwheel/util/cmd.py index a528480e..413d6f80 100644 --- a/cibuildwheel/util/cmd.py +++ b/cibuildwheel/util/cmd.py @@ -72,7 +72,7 @@ def call( if not capture_stdout: return None sys.stderr.write(result.stderr) - return typing.cast(str, result.stdout) + return typing.cast("str", result.stdout) def shell( diff --git a/cibuildwheel/util/python_build_standalone.py b/cibuildwheel/util/python_build_standalone.py index 95721ee5..24a23556 100644 --- a/cibuildwheel/util/python_build_standalone.py +++ b/cibuildwheel/util/python_build_standalone.py @@ -28,7 +28,7 @@ class PythonBuildStandaloneReleaseData(typing.TypedDict): @functools.cache def get_python_build_standalone_release_data() -> PythonBuildStandaloneReleaseData: with open(PYTHON_BUILD_STANDALONE_RELEASES, "rb") as f: - return typing.cast(PythonBuildStandaloneReleaseData, json.load(f)) + return typing.cast("PythonBuildStandaloneReleaseData", json.load(f)) class PythonBuildStandaloneError(Exception): diff --git a/pyproject.toml b/pyproject.toml index f918db02..822df2f7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -216,6 +216,15 @@ extend-select = [ "EXE", # flake8-executable "PYI", # flake8-pyi "PERF101", "PERF102", "PERF401", "PERF402", "PERF403", # A selection of perflint codes + "DTZ", # flake8-datetimez + "FA", # flake8-future-annotations + "FLY", # flynt + "FURB", # refurb + "LOG", # flake8-logging + "Q", # flake8-quotes + "SLOT", # flake8-slots + "T10", # flake8-debugger + "TC", # flake8-type-checking ] ignore = [ "PLR", # Design related pylint codes diff --git a/test/test_android.py b/test/test_android.py index fe7072e3..96b81671 100644 --- a/test/test_android.py +++ b/test/test_android.py @@ -385,13 +385,7 @@ def test_environment_markers(tmp_path): **cp313_env, "CIBW_TEST_COMMAND": f"python -m pytest {test_filename}", "CIBW_TEST_SOURCES": test_filename, - "CIBW_TEST_REQUIRES": " ".join( - [ - "pytest", - "certifi;sys_platform=='android'", - "platformdirs;sys_platform!='android'", - ] - ), + "CIBW_TEST_REQUIRES": "pytest certifi;sys_platform=='android' platformdirs;sys_platform!='android'", }, ) diff --git a/unit_test/option_prepare_test.py b/unit_test/option_prepare_test.py index e0a684b7..e209178a 100644 --- a/unit_test/option_prepare_test.py +++ b/unit_test/option_prepare_test.py @@ -56,7 +56,7 @@ def test_build_default_launches(monkeypatch): main() - build_in_container = typing.cast(mock.Mock, platforms.linux.build_in_container) + build_in_container = typing.cast("mock.Mock", platforms.linux.build_in_container) assert build_in_container.call_count == 4 @@ -126,7 +126,7 @@ before-all = "true" main() - build_in_container = typing.cast(mock.Mock, platforms.linux.build_in_container) + build_in_container = typing.cast("mock.Mock", platforms.linux.build_in_container) assert build_in_container.call_count == 7 diff --git a/unit_test/options_toml_test.py b/unit_test/options_toml_test.py index f256fff6..0fb19f63 100644 --- a/unit_test/options_toml_test.py +++ b/unit_test/options_toml_test.py @@ -1,5 +1,5 @@ import shlex -from pathlib import Path +from typing import TYPE_CHECKING import pytest @@ -13,6 +13,9 @@ from cibuildwheel.options import ( _resolve_cascade, ) +if TYPE_CHECKING: + from pathlib import Path + PYPROJECT_1 = """ [tool.cibuildwheel] build = "cp39*"