From d996af554ae21435028e538e417e403e8db7433e Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Tue, 18 Apr 2023 22:02:47 -0400 Subject: [PATCH] fix: restore Python 3.7 support Signed-off-by: Henry Schreiner --- bin/update_pythons.py | 2 +- bin/update_virtualenv.py | 2 +- cibuildwheel/__main__.py | 11 ++++++----- cibuildwheel/_compat/__init__.py | 1 + .../_functools_cached_property_38.py} | 0 cibuildwheel/_compat/functools.py | 10 ++++++++++ cibuildwheel/{ => _compat}/typing.py | 4 ++-- cibuildwheel/architecture.py | 2 +- cibuildwheel/environment.py | 3 +-- cibuildwheel/extra.py | 2 +- cibuildwheel/linux.py | 2 +- cibuildwheel/logger.py | 4 ++-- cibuildwheel/macos.py | 2 +- cibuildwheel/oci_container.py | 2 +- cibuildwheel/options.py | 2 +- cibuildwheel/util.py | 9 ++------- cibuildwheel/windows.py | 2 +- pyproject.toml | 9 ++++++++- 18 files changed, 41 insertions(+), 28 deletions(-) create mode 100644 cibuildwheel/_compat/__init__.py rename cibuildwheel/{functools_cached_property_38.py => _compat/_functools_cached_property_38.py} (100%) create mode 100644 cibuildwheel/_compat/functools.py rename cibuildwheel/{ => _compat}/typing.py (92%) diff --git a/bin/update_pythons.py b/bin/update_pythons.py index 35f6a76e..8649f765 100755 --- a/bin/update_pythons.py +++ b/bin/update_pythons.py @@ -24,8 +24,8 @@ from packaging.version import Version from rich.logging import RichHandler from rich.syntax import Syntax +from cibuildwheel._compat.typing import Final, Literal, TypedDict from cibuildwheel.extra import dump_python_configurations -from cibuildwheel.typing import Final, Literal, TypedDict log = logging.getLogger("cibw") diff --git a/bin/update_virtualenv.py b/bin/update_virtualenv.py index d7c7dc8a..7e22d383 100755 --- a/bin/update_virtualenv.py +++ b/bin/update_virtualenv.py @@ -21,7 +21,7 @@ from packaging.version import InvalidVersion, Version from rich.logging import RichHandler from rich.syntax import Syntax -from cibuildwheel.typing import Final +from cibuildwheel._compat.typing import Final log = logging.getLogger("cibw") diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py index 9dfba151..c6b02bec 100644 --- a/cibuildwheel/__main__.py +++ b/cibuildwheel/__main__.py @@ -16,15 +16,16 @@ import cibuildwheel.linux import cibuildwheel.macos import cibuildwheel.util import cibuildwheel.windows -from cibuildwheel.architecture import Architecture, allowed_architectures_check -from cibuildwheel.logger import log -from cibuildwheel.options import CommandLineArguments, Options, compute_options -from cibuildwheel.typing import ( +from cibuildwheel._compat.typing import ( PLATFORMS, GenericPythonConfiguration, PlatformName, + Protocol, assert_never, ) +from cibuildwheel.architecture import Architecture, allowed_architectures_check +from cibuildwheel.logger import log +from cibuildwheel.options import CommandLineArguments, Options, compute_options from cibuildwheel.util import ( CIBW_CACHE_PATH, BuildSelector, @@ -244,7 +245,7 @@ def _compute_platform(args: CommandLineArguments) -> PlatformName: return _compute_platform_ci() -class PlatformModule(typing.Protocol): +class PlatformModule(Protocol): # note that as per PEP544, the self argument is ignored when the protocol # is applied to a module def get_python_configurations( diff --git a/cibuildwheel/_compat/__init__.py b/cibuildwheel/_compat/__init__.py new file mode 100644 index 00000000..9d48db4f --- /dev/null +++ b/cibuildwheel/_compat/__init__.py @@ -0,0 +1 @@ +from __future__ import annotations diff --git a/cibuildwheel/functools_cached_property_38.py b/cibuildwheel/_compat/_functools_cached_property_38.py similarity index 100% rename from cibuildwheel/functools_cached_property_38.py rename to cibuildwheel/_compat/_functools_cached_property_38.py diff --git a/cibuildwheel/_compat/functools.py b/cibuildwheel/_compat/functools.py new file mode 100644 index 00000000..8fe86a3e --- /dev/null +++ b/cibuildwheel/_compat/functools.py @@ -0,0 +1,10 @@ +from __future__ import annotations + +import sys + +if sys.version_info >= (3, 8): + from functools import cached_property +else: + from ._functools_cached_property_38 import cached_property + +__all__ = ("cached_property",) diff --git a/cibuildwheel/typing.py b/cibuildwheel/_compat/typing.py similarity index 92% rename from cibuildwheel/typing.py rename to cibuildwheel/_compat/typing.py index 9374401c..01475bbb 100644 --- a/cibuildwheel/typing.py +++ b/cibuildwheel/_compat/typing.py @@ -8,12 +8,12 @@ from typing import TYPE_CHECKING, Union if sys.version_info < (3, 8): from typing_extensions import Final, Literal, OrderedDict, Protocol, TypedDict else: - from typing import Final, Literal, OrderedDict, Protocol, TypedDict + from typing import Final, Literal, OrderedDict, Protocol, TypedDict # noqa: TID251 if sys.version_info < (3, 11): from typing_extensions import NotRequired, assert_never else: - from typing import NotRequired, assert_never + from typing import NotRequired, assert_never # noqa: TID251 __all__ = ( "Final", diff --git a/cibuildwheel/architecture.py b/cibuildwheel/architecture.py index 8c4b2293..ec5116f2 100644 --- a/cibuildwheel/architecture.py +++ b/cibuildwheel/architecture.py @@ -7,7 +7,7 @@ import sys from collections.abc import Set from enum import Enum -from .typing import Final, Literal, PlatformName, assert_never +from ._compat.typing import Final, Literal, PlatformName, assert_never PRETTY_NAMES: Final = {"linux": "Linux", "macos": "macOS", "windows": "Windows"} diff --git a/cibuildwheel/environment.py b/cibuildwheel/environment.py index 2a7b99a2..3117b54e 100644 --- a/cibuildwheel/environment.py +++ b/cibuildwheel/environment.py @@ -7,9 +7,8 @@ from typing import Any import bashlex import bashlex.errors -from cibuildwheel.typing import Protocol - from . import bashlex_eval +from ._compat.typing import Protocol class EnvironmentParseError(Exception): diff --git a/cibuildwheel/extra.py b/cibuildwheel/extra.py index 03e3ce6f..5ac9ea1f 100644 --- a/cibuildwheel/extra.py +++ b/cibuildwheel/extra.py @@ -7,7 +7,7 @@ from __future__ import annotations from collections.abc import Mapping, Sequence from io import StringIO -from .typing import Protocol +from ._compat.typing import Protocol __all__ = ("Printable", "dump_python_configurations") diff --git a/cibuildwheel/linux.py b/cibuildwheel/linux.py index 4f019ac3..18ab1954 100644 --- a/cibuildwheel/linux.py +++ b/cibuildwheel/linux.py @@ -8,11 +8,11 @@ from dataclasses import dataclass from pathlib import Path, PurePath, PurePosixPath from typing import Tuple +from ._compat.typing import OrderedDict, PathOrStr, assert_never from .architecture import Architecture from .logger import log from .oci_container import OCIContainer from .options import Options -from .typing import OrderedDict, PathOrStr, assert_never from .util import ( AlreadyBuiltWheelError, BuildSelector, diff --git a/cibuildwheel/logger.py b/cibuildwheel/logger.py index 014f3b00..bc63a3aa 100644 --- a/cibuildwheel/logger.py +++ b/cibuildwheel/logger.py @@ -7,8 +7,8 @@ import sys import time from typing import IO, AnyStr -from cibuildwheel.typing import Final -from cibuildwheel.util import CIProvider, detect_ci_provider +from ._compat.typing import Final +from .util import CIProvider, detect_ci_provider DEFAULT_FOLD_PATTERN: Final = ("{name}", "") FOLD_PATTERNS: Final = { diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py index 75614449..10f26d0f 100644 --- a/cibuildwheel/macos.py +++ b/cibuildwheel/macos.py @@ -16,11 +16,11 @@ from typing import Tuple from filelock import FileLock +from ._compat.typing import Literal, PathOrStr, assert_never from .architecture import Architecture from .environment import ParsedEnvironment from .logger import log from .options import Options -from .typing import Literal, PathOrStr, assert_never from .util import ( CIBW_CACHE_PATH, AlreadyBuiltWheelError, diff --git a/cibuildwheel/oci_container.py b/cibuildwheel/oci_container.py index aa54eefb..4d76c5c3 100644 --- a/cibuildwheel/oci_container.py +++ b/cibuildwheel/oci_container.py @@ -17,7 +17,7 @@ from typing import IO, Dict from cibuildwheel.util import CIProvider, detect_ci_provider -from .typing import Literal, PathOrStr, PopenBytes +from ._compat.typing import Literal, PathOrStr, PopenBytes ContainerEngine = Literal["docker", "podman"] diff --git a/cibuildwheel/options.py b/cibuildwheel/options.py index d28e7621..7214bea0 100644 --- a/cibuildwheel/options.py +++ b/cibuildwheel/options.py @@ -22,12 +22,12 @@ else: from packaging.specifiers import SpecifierSet +from ._compat.typing import PLATFORMS, Literal, NotRequired, PlatformName, TypedDict from .architecture import Architecture from .environment import EnvironmentParseError, ParsedEnvironment, parse_environment from .logger import log from .oci_container import ContainerEngine from .projectfiles import get_requires_python_str -from .typing import PLATFORMS, Literal, NotRequired, PlatformName, TypedDict from .util import ( MANYLINUX_ARCHS, MUSLLINUX_ARCHS, diff --git a/cibuildwheel/util.py b/cibuildwheel/util.py index 2ba4fe6a..0b5ae24c 100644 --- a/cibuildwheel/util.py +++ b/cibuildwheel/util.py @@ -36,7 +36,8 @@ from packaging.utils import parse_wheel_filename from packaging.version import Version from platformdirs import user_cache_path -from cibuildwheel.typing import Final, Literal, PathOrStr, PlatformName +from ._compat.functools import cached_property +from ._compat.typing import Final, Literal, PathOrStr, PlatformName __all__ = [ "resources_dir", @@ -661,12 +662,6 @@ def find_compatible_wheel(wheels: Sequence[T], identifier: str) -> T | None: return None -if sys.version_info >= (3, 8): - from functools import cached_property -else: - from .functools_cached_property_38 import cached_property - - # Can be replaced by contextlib.chdir in Python 3.11 @contextlib.contextmanager def chdir(new_path: Path | str) -> Generator[None, None, None]: diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py index caee9ce6..eba342b3 100644 --- a/cibuildwheel/windows.py +++ b/cibuildwheel/windows.py @@ -16,11 +16,11 @@ from zipfile import ZipFile from filelock import FileLock from packaging.version import Version +from ._compat.typing import PathOrStr, assert_never from .architecture import Architecture from .environment import ParsedEnvironment from .logger import log from .options import Options -from .typing import PathOrStr, assert_never from .util import ( CIBW_CACHE_PATH, AlreadyBuiltWheelError, diff --git a/pyproject.toml b/pyproject.toml index 570772db..29e9c231 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -149,7 +149,7 @@ extend-ignore = [ "PT007", # False positive (fixed upstream) ] target-version = "py37" -typing-modules = ["cibuildwheel.typing"] +typing-modules = ["cibuildwheel._compat.typing"] flake8-unused-arguments.ignore-variadic-names = true [tool.ruff.flake8-tidy-imports.banned-api] @@ -158,6 +158,13 @@ flake8-unused-arguments.ignore-variadic-names = true "typing.Iterator".msg = "Use collections.abc.Iterator instead." "typing.Sequence".msg = "Use collections.abc.Sequence instead." "typing.Set".msg = "Use collections.abc.Set instead." +"typing.Protocol".msg = "Use cibuildwheel._compat.typing.Protocol instead." +"typing.Final".msg = "Use cibuildwheel._compat.typing.Final instead." +"typing.Literal".msg = "Use cibuildwheel._compat.typing.Literal instead." +"typing.OrderedDict".msg = "Use cibuildwheel._compat.typing.OrderedDict instead." +"typing.TypedDict".msg = "Use cibuildwheel._compat.typing.TypedDict instead." +"typing.NotRequired".msg = "Use cibuildwheel._compat.typing.NotRequired instead." +"typing.assert_never".msg = "Use cibuildwhee._compat.typing.assert_never instead." [tool.ruff.per-file-ignores] "unit_test/*" = ["PLC1901"]