chore: drop python 3.7 for cibuildwheel driver

This drops python 3.7 for cibuildwheel.
Building python 3.6 / 3.7 packages is still supported.
This commit is contained in:
mayeut
2023-07-01 14:33:24 +02:00
parent af42be1f3b
commit 4b19db8454
24 changed files with 46 additions and 160 deletions
+1 -1
View File
@@ -41,7 +41,7 @@ jobs:
python_version: ['3.11'] python_version: ['3.11']
include: include:
- os: ubuntu-22.04 - os: ubuntu-22.04
python_version: '3.7' python_version: '3.8'
timeout-minutes: 180 timeout-minutes: 180
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
+2 -2
View File
@@ -34,9 +34,9 @@ repos:
rev: v1.4.1 rev: v1.4.1
hooks: hooks:
- id: mypy - id: mypy
name: mypy 3.7 on cibuildwheel/ name: mypy 3.8 on cibuildwheel/
exclude: ^cibuildwheel/resources/.*py$ exclude: ^cibuildwheel/resources/.*py$
args: ["--python-version=3.7"] args: ["--python-version=3.8"]
additional_dependencies: &mypy-dependencies additional_dependencies: &mypy-dependencies
- nox - nox
- packaging - packaging
+11 -11
View File
@@ -8,21 +8,21 @@ branches:
jobs: jobs:
include: include:
- name: Linux | x86_64 + i686 | Python 3.7 - name: Linux | x86_64 + i686 | Python 3.9
python: 3.7 python: 3.9
services: docker services: docker
env: PYTHON=python env: PYTHON=python
- name: Linux | arm64 | Python 3.7 - name: Linux | arm64 | Python 3.9
python: 3.7 python: 3.9
services: docker services: docker
arch: arm64-graviton2 arch: arm64-graviton2
group: edge group: edge
virt: vm virt: vm
env: PYTHON=python env: PYTHON=python
- name: Linux | ppc64le | Python 3.7 - name: Linux | ppc64le | Python 3.9
python: 3.7 python: 3.9
services: docker services: docker
arch: ppc64le arch: ppc64le
allow_failure: True allow_failure: True
@@ -32,16 +32,16 @@ jobs:
# c.f. https://travis-ci.community/t/running-out-of-disk-space-quota-when-using-docker-on-ppc64le/11634 # c.f. https://travis-ci.community/t/running-out-of-disk-space-quota-when-using-docker-on-ppc64le/11634
- PYTEST_ADDOPTS='-k "not test_manylinuxXXXX_only"' - PYTEST_ADDOPTS='-k "not test_manylinuxXXXX_only"'
- name: Windows | x86_64 | Python 3.7 - name: Windows | x86_64 | Python 3.9
os: windows os: windows
language: shell language: shell
before_install: before_install:
- choco upgrade python3 -y --version 3.7.9 --limit-output - choco upgrade python3 -y --version 3.9.13 --limit-output --params "/InstallDir:C:\\Python39"
env: env:
- PYTHON=C:\\Python37\\python - PYTHON=C:\\Python39\\python
- name: Linux | s390x | Python 3.7 - name: Linux | s390x | Python 3.9
python: 3.7 python: 3.9
services: docker services: docker
arch: s390x arch: s390x
env: PYTHON=python env: PYTHON=python
+6 -6
View File
@@ -1,11 +1,11 @@
This is a summary of the Python versions and platforms covered by the different CI platforms: This is a summary of the Python versions and platforms covered by the different CI platforms:
| | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | | | 3.8 | 3.9 | 3.10 | 3.11 |
|---------|-----------|---------------------------------------|-----------|-----------|----------------| |---------|--------------------------------------------------------|-----------------------|-----------|----------------|
| Linux | Travis CI | AppVeyor¹ / Azure Pipelines / GitLab¹ | CircleCI¹ | Cirrus CI | GitHub Actions | | Linux | AppVeyor¹ / Azure Pipelines / GitLab¹ / GitHub Actions | CircleCI¹ / Travis CI | Cirrus CI | GitHub Actions |
| macOS | Travis CI | AppVeyor¹ / Azure Pipelines | CircleCI¹ | Cirrus CI | GitHub Actions | | macOS | AppVeyor¹ / Azure Pipelines | CircleCI¹ / Travis CI | Cirrus CI | GitHub Actions |
| Windows | Travis CI | AppVeyor¹ / Azure Pipelines / GitLab¹ | | Cirrus CI | GitHub Actions | | Windows | AppVeyor¹ / Azure Pipelines / GitLab¹ | Travis CI | Cirrus CI | GitHub Actions |
> ¹ Runs a reduced set of tests to reduce CI load > ¹ Runs a reduced set of tests to reduce CI load
Non-x86 architectures are covered on Travis CI using Python 3.7. Non-x86 architectures are covered on Travis CI using Python 3.9.
+1 -1
View File
@@ -28,7 +28,7 @@ runs:
- uses: actions/setup-python@v4 - uses: actions/setup-python@v4
id: python id: python
with: with:
python-version: "3.7 - 3.11" python-version: "3.8 - 3.11"
update-environment: false update-environment: false
# Redirecting stderr to stdout to fix interleaving issue in Actions. # Redirecting stderr to stdout to fix interleaving issue in Actions.
+1 -2
View File
@@ -7,7 +7,7 @@ import difflib
import logging import logging
from collections.abc import Mapping, MutableMapping from collections.abc import Mapping, MutableMapping
from pathlib import Path from pathlib import Path
from typing import Any, Union from typing import Any, Final, Literal, TypedDict, Union
import click import click
import requests import requests
@@ -18,7 +18,6 @@ from rich.logging import RichHandler
from rich.syntax import Syntax from rich.syntax import Syntax
from cibuildwheel._compat import tomllib from cibuildwheel._compat import tomllib
from cibuildwheel._compat.typing import Final, Literal, TypedDict
from cibuildwheel.extra import dump_python_configurations from cibuildwheel.extra import dump_python_configurations
log = logging.getLogger("cibw") log = logging.getLogger("cibw")
+1 -1
View File
@@ -7,6 +7,7 @@ import logging
import subprocess import subprocess
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Final
import click import click
import rich import rich
@@ -15,7 +16,6 @@ from rich.logging import RichHandler
from rich.syntax import Syntax from rich.syntax import Syntax
from cibuildwheel._compat import tomllib from cibuildwheel._compat import tomllib
from cibuildwheel._compat.typing import Final
log = logging.getLogger("cibw") log = logging.getLogger("cibw")
+2 -1
View File
@@ -10,13 +10,14 @@ import typing
from collections.abc import Iterable, Sequence, Set from collections.abc import Iterable, Sequence, Set
from pathlib import Path from pathlib import Path
from tempfile import mkdtemp from tempfile import mkdtemp
from typing import Protocol
import cibuildwheel import cibuildwheel
import cibuildwheel.linux import cibuildwheel.linux
import cibuildwheel.macos import cibuildwheel.macos
import cibuildwheel.util import cibuildwheel.util
import cibuildwheel.windows import cibuildwheel.windows
from cibuildwheel._compat.typing import Protocol, assert_never from cibuildwheel._compat.typing import assert_never
from cibuildwheel.architecture import Architecture, allowed_architectures_check from cibuildwheel.architecture import Architecture, allowed_architectures_check
from cibuildwheel.logger import log from cibuildwheel.logger import log
from cibuildwheel.options import CommandLineArguments, Options, compute_options from cibuildwheel.options import CommandLineArguments, Options, compute_options
@@ -1,66 +0,0 @@
from __future__ import annotations
import typing
from collections.abc import Callable
from threading import RLock
from typing import Any, Generic, TypeVar
__all__ = ["cached_property"]
_NOT_FOUND = object()
_T = TypeVar("_T")
class cached_property(Generic[_T]):
def __init__(self, func: Callable[[Any], _T]):
self.func = func
self.attrname: str | None = None
self.__doc__ = func.__doc__
self.lock = RLock()
def __set_name__(self, owner: type[Any], name: str) -> None:
if self.attrname is None:
self.attrname = name
elif name != self.attrname:
msg = f"Cannot assign the same cached_property to two different names ({self.attrname!r} and {name!r})."
raise TypeError(msg)
@typing.overload
def __get__(self, instance: None, owner: type[Any] | None = ...) -> cached_property[_T]:
...
@typing.overload
def __get__(self, instance: object, owner: type[Any] | None = ...) -> _T:
...
def __get__(self, instance: object | None, owner: type[Any] | None = None) -> Any:
if instance is None:
return self
if self.attrname is None:
msg = "Cannot use cached_property instance without calling __set_name__ on it."
raise TypeError(msg)
try:
cache = instance.__dict__
except AttributeError: # not all objects have __dict__ (e.g. class defines slots)
msg = (
f"No '__dict__' attribute on {type(instance).__name__!r} "
f"instance to cache {self.attrname!r} property."
)
raise TypeError(msg) from None
val = cache.get(self.attrname, _NOT_FOUND)
if val is _NOT_FOUND:
with self.lock:
# check if another thread filled cache while we awaited lock
val = cache.get(self.attrname, _NOT_FOUND)
if val is _NOT_FOUND:
val = self.func(instance)
try:
cache[self.attrname] = val
except TypeError:
msg = (
f"The '__dict__' attribute on {type(instance).__name__!r} instance "
f"does not support item assignment for caching {self.attrname!r} property."
)
raise TypeError(msg) from None
return val
-10
View File
@@ -1,10 +0,0 @@
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",)
-11
View File
@@ -2,23 +2,12 @@ from __future__ import annotations
import sys import sys
if sys.version_info < (3, 8):
from typing_extensions import Final, Literal, OrderedDict, Protocol, TypedDict
else:
from typing import Final, Literal, OrderedDict, Protocol, TypedDict # noqa: TID251
if sys.version_info < (3, 11): if sys.version_info < (3, 11):
from typing_extensions import NotRequired, assert_never from typing_extensions import NotRequired, assert_never
else: else:
from typing import NotRequired, assert_never # noqa: TID251 from typing import NotRequired, assert_never # noqa: TID251
__all__ = ( __all__ = (
"Final",
"Literal",
"Protocol",
"Protocol",
"TypedDict",
"OrderedDict",
"assert_never", "assert_never",
"NotRequired", "NotRequired",
) )
+2 -1
View File
@@ -6,8 +6,9 @@ import re
import sys import sys
from collections.abc import Set from collections.abc import Set
from enum import Enum from enum import Enum
from typing import Final, Literal
from ._compat.typing import Final, Literal, assert_never from ._compat.typing import assert_never
from .typing import PlatformName from .typing import PlatformName
PRETTY_NAMES: Final[dict[PlatformName, str]] = { PRETTY_NAMES: Final[dict[PlatformName, str]] = {
+1 -2
View File
@@ -2,13 +2,12 @@ from __future__ import annotations
import dataclasses import dataclasses
from collections.abc import Mapping, Sequence from collections.abc import Mapping, Sequence
from typing import Any from typing import Any, Protocol
import bashlex import bashlex
import bashlex.errors import bashlex.errors
from . import bashlex_eval from . import bashlex_eval
from ._compat.typing import Protocol
class EnvironmentParseError(Exception): class EnvironmentParseError(Exception):
+1 -2
View File
@@ -6,8 +6,7 @@ from __future__ import annotations
from collections.abc import Mapping, Sequence from collections.abc import Mapping, Sequence
from io import StringIO from io import StringIO
from typing import Protocol
from ._compat.typing import Protocol
__all__ = ("Printable", "dump_python_configurations") __all__ = ("Printable", "dump_python_configurations")
+2 -2
View File
@@ -6,9 +6,9 @@ import textwrap
from collections.abc import Iterable, Iterator, Sequence, Set from collections.abc import Iterable, Iterator, Sequence, Set
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path, PurePath, PurePosixPath from pathlib import Path, PurePath, PurePosixPath
from typing import Tuple from typing import OrderedDict, Tuple
from ._compat.typing import OrderedDict, assert_never from ._compat.typing import assert_never
from .architecture import Architecture from .architecture import Architecture
from .logger import log from .logger import log
from .oci_container import OCIContainer from .oci_container import OCIContainer
+1 -2
View File
@@ -5,9 +5,8 @@ import os
import re import re
import sys import sys
import time import time
from typing import IO, AnyStr, Tuple from typing import IO, AnyStr, Final, Tuple
from ._compat.typing import Final
from .util import CIProvider, detect_ci_provider from .util import CIProvider, detect_ci_provider
FoldPattern = Tuple[str, str] FoldPattern = Tuple[str, str]
+2 -2
View File
@@ -12,11 +12,11 @@ import typing
from collections.abc import Sequence, Set from collections.abc import Sequence, Set
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path from pathlib import Path
from typing import Tuple from typing import Literal, Tuple
from filelock import FileLock from filelock import FileLock
from ._compat.typing import Literal, assert_never from ._compat.typing import assert_never
from .architecture import Architecture from .architecture import Architecture
from .environment import ParsedEnvironment from .environment import ParsedEnvironment
from .logger import log from .logger import log
+1 -2
View File
@@ -14,9 +14,8 @@ from collections.abc import Mapping, Sequence
from dataclasses import dataclass from dataclasses import dataclass
from pathlib import Path, PurePath, PurePosixPath from pathlib import Path, PurePath, PurePosixPath
from types import TracebackType from types import TracebackType
from typing import IO, Dict from typing import IO, Dict, Literal
from ._compat.typing import Literal
from .typing import PathOrStr, PopenBytes from .typing import PathOrStr, PopenBytes
from .util import CIProvider, detect_ci_provider, parse_key_value_string from .util import CIProvider, detect_ci_provider, parse_key_value_string
+2 -2
View File
@@ -12,12 +12,12 @@ import textwrap
import traceback import traceback
from collections.abc import Callable, Generator, Iterable, Iterator, Mapping, Set from collections.abc import Callable, Generator, Iterable, Iterator, Mapping, Set
from pathlib import Path from pathlib import Path
from typing import Any, Dict, List, Union from typing import Any, Dict, List, Literal, TypedDict, Union
from packaging.specifiers import SpecifierSet from packaging.specifiers import SpecifierSet
from ._compat import tomllib from ._compat import tomllib
from ._compat.typing import Literal, NotRequired, TypedDict from ._compat.typing import NotRequired
from .architecture import Architecture from .architecture import Architecture
from .environment import EnvironmentParseError, ParsedEnvironment, parse_environment from .environment import EnvironmentParseError, ParsedEnvironment, parse_environment
from .logger import log from .logger import log
+2 -16
View File
@@ -3,24 +3,10 @@ from __future__ import annotations
import ast import ast
import configparser import configparser
import contextlib import contextlib
import sys
from pathlib import Path from pathlib import Path
from typing import Any
from ._compat import tomllib from ._compat import tomllib
if sys.version_info < (3, 8):
Constant = ast.Str
def get_constant(x: ast.Str) -> str:
return x.s
else:
Constant = ast.Constant
def get_constant(x: ast.Constant) -> Any:
return x.value
class Analyzer(ast.NodeVisitor): class Analyzer(ast.NodeVisitor):
def __init__(self) -> None: def __init__(self) -> None:
@@ -39,9 +25,9 @@ class Analyzer(ast.NodeVisitor):
if ( if (
node.arg == "python_requires" node.arg == "python_requires"
and not hasattr(node.parent.parent.parent, "parent") # type: ignore[attr-defined] and not hasattr(node.parent.parent.parent, "parent") # type: ignore[attr-defined]
and isinstance(node.value, Constant) and isinstance(node.value, ast.Constant)
): ):
self.requires_python = get_constant(node.value) self.requires_python = node.value.value
def setup_py_python_requires(content: str) -> str | None: def setup_py_python_requires(content: str) -> str | None:
+1 -3
View File
@@ -3,9 +3,7 @@ from __future__ import annotations
import os import os
import subprocess import subprocess
import typing import typing
from typing import Union from typing import Final, Literal, Protocol, Union
from ._compat.typing import Final, Literal, Protocol
__all__ = ( __all__ = (
"PLATFORMS", "PLATFORMS",
+2 -4
View File
@@ -17,10 +17,10 @@ from collections import defaultdict
from collections.abc import Generator, Iterable, Mapping, Sequence from collections.abc import Generator, Iterable, Mapping, Sequence
from dataclasses import dataclass from dataclasses import dataclass
from enum import Enum from enum import Enum
from functools import lru_cache from functools import cached_property, lru_cache
from pathlib import Path, PurePath from pathlib import Path, PurePath
from time import sleep from time import sleep
from typing import Any, ClassVar, TextIO, TypeVar from typing import Any, ClassVar, Final, Literal, TextIO, TypeVar
import bracex import bracex
import certifi import certifi
@@ -32,8 +32,6 @@ from packaging.version import Version
from platformdirs import user_cache_path from platformdirs import user_cache_path
from ._compat import tomllib from ._compat import tomllib
from ._compat.functools import cached_property
from ._compat.typing import Final, Literal
from .typing import PathOrStr, PlatformName from .typing import PathOrStr, PlatformName
__all__ = [ __all__ = [
+3 -8
View File
@@ -7,7 +7,7 @@ build-backend = "setuptools.build_meta"
[tool.black] [tool.black]
line-length = 100 line-length = 100
target-version = ['py37', 'py38', 'py39', 'py310', 'py311'] target-version = ['py38', 'py39', 'py310', 'py311']
[tool.pytest.ini_options] [tool.pytest.ini_options]
@@ -20,7 +20,7 @@ log_cli_level = "info"
[tool.mypy] [tool.mypy]
python_version = 3.7 python_version = 3.8
files = [ files = [
"cibuildwheel/*.py", "cibuildwheel/*.py",
"test/**/*.py", "test/**/*.py",
@@ -79,7 +79,7 @@ ignore = [
] ]
[tool.pylint] [tool.pylint]
py-version = "3.7" py-version = "3.8"
jobs = "0" jobs = "0"
fail-on = ["E", "F"] fail-on = ["E", "F"]
fail-under = "9.8" fail-under = "9.8"
@@ -154,11 +154,6 @@ flake8-unused-arguments.ignore-variadic-names = true
"typing.Iterator".msg = "Use collections.abc.Iterator instead." "typing.Iterator".msg = "Use collections.abc.Iterator instead."
"typing.Sequence".msg = "Use collections.abc.Sequence instead." "typing.Sequence".msg = "Use collections.abc.Sequence instead."
"typing.Set".msg = "Use collections.abc.Set 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.NotRequired".msg = "Use cibuildwheel._compat.typing.NotRequired instead."
"typing.assert_never".msg = "Use cibuildwheel._compat.typing.assert_never instead." "typing.assert_never".msg = "Use cibuildwheel._compat.typing.assert_never instead."
"tomllib".msg = "Use cibuildwheel._compat.tomllib instead." "tomllib".msg = "Use cibuildwheel._compat.tomllib instead."
+1 -2
View File
@@ -16,7 +16,6 @@ classifiers =
Natural Language :: English Natural Language :: English
Programming Language :: Python :: 3 Programming Language :: Python :: 3
Programming Language :: Python :: 3 :: Only Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.7
Programming Language :: Python :: 3.8 Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9 Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10 Programming Language :: Python :: 3.10
@@ -39,7 +38,7 @@ install_requires =
platformdirs platformdirs
tomli;python_version < '3.11' tomli;python_version < '3.11'
typing-extensions>=4.1.0;python_version < '3.11' typing-extensions>=4.1.0;python_version < '3.11'
python_requires = >=3.7 python_requires = >=3.8
include_package_data = True include_package_data = True
zip_safe = False zip_safe = False