Skip to content

Commit 52572cc

Browse files
authored
Merge pull request #1479 from henryiii/henryiii/fix/py37
fix: Python 3.7 support
2 parents c6027e4 + aff6dd5 commit 52572cc

24 files changed

+94
-91
lines changed

.github/workflows/test.yml

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ jobs:
3939
matrix:
4040
os: [ubuntu-20.04, windows-latest, macos-11]
4141
python_version: ['3.11']
42+
include:
43+
- os: ubuntu-22.04
44+
python_version: '3.7'
4245
timeout-minutes: 180
4346
steps:
4447
- uses: actions/checkout@v3

bin/update_pythons.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,21 @@
55
import copy
66
import difflib
77
import logging
8-
import sys
98
from collections.abc import Mapping, MutableMapping
109
from pathlib import Path
1110
from typing import Any, Union
1211

1312
import click
1413
import requests
1514
import rich
16-
17-
if sys.version_info >= (3, 11):
18-
import tomllib
19-
else:
20-
import tomli as tomllib
21-
2215
from packaging.specifiers import Specifier
2316
from packaging.version import Version
2417
from rich.logging import RichHandler
2518
from rich.syntax import Syntax
2619

20+
from cibuildwheel._compat import tomllib
21+
from cibuildwheel._compat.typing import Final, Literal, TypedDict
2722
from cibuildwheel.extra import dump_python_configurations
28-
from cibuildwheel.typing import Final, Literal, TypedDict
2923

3024
log = logging.getLogger("cibw")
3125

bin/update_virtualenv.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,17 @@
55
import difflib
66
import logging
77
import subprocess
8-
import sys
98
from dataclasses import dataclass
109
from pathlib import Path
1110

1211
import click
1312
import rich
14-
15-
if sys.version_info >= (3, 11):
16-
import tomllib
17-
else:
18-
import tomli as tomllib
19-
2013
from packaging.version import InvalidVersion, Version
2114
from rich.logging import RichHandler
2215
from rich.syntax import Syntax
2316

24-
from cibuildwheel.typing import Final
17+
from cibuildwheel._compat import tomllib
18+
from cibuildwheel._compat.typing import Final
2519

2620
log = logging.getLogger("cibw")
2721

cibuildwheel/__main__.py

+3-7
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,11 @@
1616
import cibuildwheel.macos
1717
import cibuildwheel.util
1818
import cibuildwheel.windows
19+
from cibuildwheel._compat.typing import Protocol, assert_never
1920
from cibuildwheel.architecture import Architecture, allowed_architectures_check
2021
from cibuildwheel.logger import log
2122
from cibuildwheel.options import CommandLineArguments, Options, compute_options
22-
from cibuildwheel.typing import (
23-
PLATFORMS,
24-
GenericPythonConfiguration,
25-
PlatformName,
26-
assert_never,
27-
)
23+
from cibuildwheel.typing import PLATFORMS, GenericPythonConfiguration, PlatformName
2824
from cibuildwheel.util import (
2925
CIBW_CACHE_PATH,
3026
BuildSelector,
@@ -244,7 +240,7 @@ def _compute_platform(args: CommandLineArguments) -> PlatformName:
244240
return _compute_platform_ci()
245241

246242

247-
class PlatformModule(typing.Protocol):
243+
class PlatformModule(Protocol):
248244
# note that as per PEP544, the self argument is ignored when the protocol
249245
# is applied to a module
250246
def get_python_configurations(

cibuildwheel/_compat/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
from __future__ import annotations

cibuildwheel/_compat/functools.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from __future__ import annotations
2+
3+
import sys
4+
5+
if sys.version_info >= (3, 8):
6+
from functools import cached_property
7+
else:
8+
from ._functools_cached_property_38 import cached_property
9+
10+
__all__ = ("cached_property",)

cibuildwheel/_compat/tomllib.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from __future__ import annotations
2+
3+
import sys
4+
5+
if sys.version_info >= (3, 11):
6+
from tomllib import load # noqa: TID251
7+
else:
8+
from tomli import load # noqa: TID251
9+
10+
__all__ = ("load",)

cibuildwheel/_compat/typing.py

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from __future__ import annotations
2+
3+
import sys
4+
5+
if sys.version_info < (3, 8):
6+
from typing_extensions import Final, Literal, OrderedDict, Protocol, TypedDict
7+
else:
8+
from typing import Final, Literal, OrderedDict, Protocol, TypedDict # noqa: TID251
9+
10+
if sys.version_info < (3, 11):
11+
from typing_extensions import NotRequired, assert_never
12+
else:
13+
from typing import NotRequired, assert_never # noqa: TID251
14+
15+
__all__ = (
16+
"Final",
17+
"Literal",
18+
"Protocol",
19+
"Protocol",
20+
"TypedDict",
21+
"OrderedDict",
22+
"assert_never",
23+
"NotRequired",
24+
)

cibuildwheel/architecture.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from collections.abc import Set
88
from enum import Enum
99

10-
from .typing import Final, Literal, PlatformName, assert_never
10+
from ._compat.typing import Final, Literal, assert_never
11+
from .typing import PlatformName
1112

1213
PRETTY_NAMES: Final = {"linux": "Linux", "macos": "macOS", "windows": "Windows"}
1314

cibuildwheel/environment.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@
77
import bashlex
88
import bashlex.errors
99

10-
from cibuildwheel.typing import Protocol
11-
1210
from . import bashlex_eval
11+
from ._compat.typing import Protocol
1312

1413

1514
class EnvironmentParseError(Exception):

cibuildwheel/extra.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from collections.abc import Mapping, Sequence
88
from io import StringIO
99

10-
from .typing import Protocol
10+
from ._compat.typing import Protocol
1111

1212
__all__ = ("Printable", "dump_python_configurations")
1313

cibuildwheel/linux.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
from pathlib import Path, PurePath, PurePosixPath
99
from typing import Tuple
1010

11+
from ._compat.typing import OrderedDict, assert_never
1112
from .architecture import Architecture
1213
from .logger import log
1314
from .oci_container import OCIContainer
1415
from .options import Options
15-
from .typing import OrderedDict, PathOrStr, assert_never
16+
from .typing import PathOrStr
1617
from .util import (
1718
AlreadyBuiltWheelError,
1819
BuildSelector,

cibuildwheel/logger.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import time
88
from typing import IO, AnyStr
99

10-
from cibuildwheel.typing import Final
11-
from cibuildwheel.util import CIProvider, detect_ci_provider
10+
from ._compat.typing import Final
11+
from .util import CIProvider, detect_ci_provider
1212

1313
DEFAULT_FOLD_PATTERN: Final = ("{name}", "")
1414
FOLD_PATTERNS: Final = {

cibuildwheel/macos.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616

1717
from filelock import FileLock
1818

19+
from ._compat.typing import Literal, assert_never
1920
from .architecture import Architecture
2021
from .environment import ParsedEnvironment
2122
from .logger import log
2223
from .options import Options
23-
from .typing import Literal, PathOrStr, assert_never
24+
from .typing import PathOrStr
2425
from .util import (
2526
CIBW_CACHE_PATH,
2627
AlreadyBuiltWheelError,

cibuildwheel/oci_container.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
from types import TracebackType
1616
from typing import IO, Dict
1717

18-
from cibuildwheel.util import CIProvider, detect_ci_provider
19-
20-
from .typing import Literal, PathOrStr, PopenBytes
18+
from ._compat.typing import Literal
19+
from .typing import PathOrStr, PopenBytes
20+
from .util import CIProvider, detect_ci_provider
2121

2222
ContainerEngine = Literal["docker", "podman"]
2323

cibuildwheel/options.py

+3-6
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,16 @@
1515
from pathlib import Path
1616
from typing import Any, Dict, List, Union
1717

18-
if sys.version_info >= (3, 11):
19-
import tomllib
20-
else:
21-
import tomli as tomllib
22-
2318
from packaging.specifiers import SpecifierSet
2419

20+
from ._compat import tomllib
21+
from ._compat.typing import Literal, NotRequired, TypedDict
2522
from .architecture import Architecture
2623
from .environment import EnvironmentParseError, ParsedEnvironment, parse_environment
2724
from .logger import log
2825
from .oci_container import ContainerEngine
2926
from .projectfiles import get_requires_python_str
30-
from .typing import PLATFORMS, Literal, NotRequired, PlatformName, TypedDict
27+
from .typing import PLATFORMS, PlatformName
3128
from .util import (
3229
MANYLINUX_ARCHS,
3330
MUSLLINUX_ARCHS,

cibuildwheel/projectfiles.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@
77
from pathlib import Path
88
from typing import Any
99

10-
if sys.version_info >= (3, 11):
11-
import tomllib
12-
else:
13-
import tomli as tomllib
10+
from ._compat import tomllib
1411

1512
if sys.version_info < (3, 8):
1613
Constant = ast.Str

cibuildwheel/typing.py

+4-20
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,21 @@
22

33
import os
44
import subprocess
5-
import sys
6-
from typing import TYPE_CHECKING, Union
5+
import typing
6+
from typing import Union
77

8-
if sys.version_info < (3, 8):
9-
from typing_extensions import Final, Literal, OrderedDict, Protocol, TypedDict
10-
else:
11-
from typing import Final, Literal, OrderedDict, Protocol, TypedDict
12-
13-
if sys.version_info < (3, 11):
14-
from typing_extensions import NotRequired, assert_never
15-
else:
16-
from typing import NotRequired, assert_never
8+
from ._compat.typing import Final, Literal, Protocol
179

1810
__all__ = (
19-
"Final",
20-
"Literal",
2111
"PLATFORMS",
2212
"PathOrStr",
2313
"PlatformName",
24-
"Protocol",
2514
"PLATFORMS",
2615
"PopenBytes",
27-
"Protocol",
28-
"TypedDict",
29-
"OrderedDict",
30-
"assert_never",
31-
"NotRequired",
3216
)
3317

3418

35-
if TYPE_CHECKING:
19+
if typing.TYPE_CHECKING:
3620
PopenBytes = subprocess.Popen[bytes]
3721
PathOrStr = Union[str, os.PathLike[str]]
3822
else:

cibuildwheel/util.py

+4-13
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,17 @@
2323

2424
import bracex
2525
import certifi
26-
27-
if sys.version_info >= (3, 11):
28-
import tomllib
29-
else:
30-
import tomli as tomllib
31-
3226
from filelock import FileLock
3327
from packaging.requirements import InvalidRequirement, Requirement
3428
from packaging.specifiers import SpecifierSet
3529
from packaging.utils import parse_wheel_filename
3630
from packaging.version import Version
3731
from platformdirs import user_cache_path
3832

39-
from cibuildwheel.typing import Final, Literal, PathOrStr, PlatformName
33+
from ._compat import tomllib
34+
from ._compat.functools import cached_property
35+
from ._compat.typing import Final, Literal
36+
from .typing import PathOrStr, PlatformName
4037

4138
__all__ = [
4239
"resources_dir",
@@ -661,12 +658,6 @@ def find_compatible_wheel(wheels: Sequence[T], identifier: str) -> T | None:
661658
return None
662659

663660

664-
if sys.version_info >= (3, 8):
665-
from functools import cached_property
666-
else:
667-
from .functools_cached_property_38 import cached_property
668-
669-
670661
# Can be replaced by contextlib.chdir in Python 3.11
671662
@contextlib.contextmanager
672663
def chdir(new_path: Path | str) -> Generator[None, None, None]:

cibuildwheel/windows.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@
1616
from filelock import FileLock
1717
from packaging.version import Version
1818

19+
from ._compat.typing import assert_never
1920
from .architecture import Architecture
2021
from .environment import ParsedEnvironment
2122
from .logger import log
2223
from .options import Options
23-
from .typing import PathOrStr, assert_never
24+
from .typing import PathOrStr
2425
from .util import (
2526
CIBW_CACHE_PATH,
2627
AlreadyBuiltWheelError,

pyproject.toml

+10-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ extend-ignore = [
149149
"PT007", # False positive (fixed upstream)
150150
]
151151
target-version = "py37"
152-
typing-modules = ["cibuildwheel.typing"]
152+
typing-modules = ["cibuildwheel._compat.typing"]
153153
flake8-unused-arguments.ignore-variadic-names = true
154154

155155
[tool.ruff.flake8-tidy-imports.banned-api]
@@ -158,6 +158,15 @@ flake8-unused-arguments.ignore-variadic-names = true
158158
"typing.Iterator".msg = "Use collections.abc.Iterator instead."
159159
"typing.Sequence".msg = "Use collections.abc.Sequence instead."
160160
"typing.Set".msg = "Use collections.abc.Set instead."
161+
"typing.Protocol".msg = "Use cibuildwheel._compat.typing.Protocol instead."
162+
"typing.Final".msg = "Use cibuildwheel._compat.typing.Final instead."
163+
"typing.Literal".msg = "Use cibuildwheel._compat.typing.Literal instead."
164+
"typing.OrderedDict".msg = "Use cibuildwheel._compat.typing.OrderedDict instead."
165+
"typing.TypedDict".msg = "Use cibuildwheel._compat.typing.TypedDict instead."
166+
"typing.NotRequired".msg = "Use cibuildwheel._compat.typing.NotRequired instead."
167+
"typing.assert_never".msg = "Use cibuildwheel._compat.typing.assert_never instead."
168+
"tomllib".msg = "Use cibuildwheel._compat.tomllib instead."
169+
"tomli".msg = "Use cibuildwheel._compat.tomllib instead."
161170

162171
[tool.ruff.per-file-ignores]
163172
"unit_test/*" = ["PLC1901"]

unit_test/build_ids_test.py

+1-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
11
from __future__ import annotations
22

3-
import sys
4-
5-
if sys.version_info >= (3, 11):
6-
import tomllib
7-
else:
8-
import tomli as tomllib
9-
103
from packaging.version import Version
114

5+
from cibuildwheel._compat import tomllib
126
from cibuildwheel.extra import Printable, dump_python_configurations
137
from cibuildwheel.util import resources_dir
148

0 commit comments

Comments
 (0)