Merge pull request #1476 from henryiii/henryiii/chore/ruff_ex
chore: ruff and typing updates
This commit is contained in:
@@ -15,8 +15,8 @@ the results without the `--online` setting.
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import ast
|
import ast
|
||||||
|
from collections.abc import Iterable, Iterator
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Iterator
|
|
||||||
|
|
||||||
import click
|
import click
|
||||||
import yaml
|
import yaml
|
||||||
@@ -97,7 +97,7 @@ class MaybeRemote:
|
|||||||
with open(filename, "w") as f:
|
with open(filename, "w") as f:
|
||||||
yaml.safe_dump(self.contents, f, default_flow_style=False)
|
yaml.safe_dump(self.contents, f, default_flow_style=False)
|
||||||
|
|
||||||
def on_each(self, repos: list[str]) -> Iterator[tuple[str, str, str | None]]:
|
def on_each(self, repos: Iterable[str]) -> Iterator[tuple[str, str, str | None]]:
|
||||||
for repo in repos:
|
for repo in repos:
|
||||||
print(f"[bold]{repo}:")
|
print(f"[bold]{repo}:")
|
||||||
for filename in sorted(self.contents, reverse=True):
|
for filename in sorted(self.contents, reverse=True):
|
||||||
|
|||||||
Regular → Executable
+5
-4
@@ -16,6 +16,7 @@ import functools
|
|||||||
import textwrap
|
import textwrap
|
||||||
import urllib.request
|
import urllib.request
|
||||||
import xml.dom.minidom
|
import xml.dom.minidom
|
||||||
|
from collections.abc import Iterable, Mapping, Sequence
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@@ -42,7 +43,7 @@ ICONS = (
|
|||||||
class Project:
|
class Project:
|
||||||
NAME: int = 0
|
NAME: int = 0
|
||||||
|
|
||||||
def __init__(self, config: dict[str, Any], github: Github | None = None):
|
def __init__(self, config: Mapping[str, Any], github: Github | None = None):
|
||||||
try:
|
try:
|
||||||
self.name: str = config["name"]
|
self.name: str = config["name"]
|
||||||
self.gh: str = config["gh"]
|
self.gh: str = config["gh"]
|
||||||
@@ -149,7 +150,7 @@ def path_for_icon(icon_name: str, relative_to: Path | None = None) -> Path:
|
|||||||
|
|
||||||
|
|
||||||
def get_projects(
|
def get_projects(
|
||||||
config: list[dict[str, Any]],
|
config: Iterable[Mapping[str, Any]],
|
||||||
*,
|
*,
|
||||||
online: bool = True,
|
online: bool = True,
|
||||||
auth: str | None = None,
|
auth: str | None = None,
|
||||||
@@ -163,7 +164,7 @@ def get_projects(
|
|||||||
return sorted((Project(item, github) for item in config), reverse=online)
|
return sorted((Project(item, github) for item in config), reverse=online)
|
||||||
|
|
||||||
|
|
||||||
def render_projects(projects: list[Project], *, dest_path: Path, include_info: bool = True):
|
def render_projects(projects: Sequence[Project], *, dest_path: Path, include_info: bool = True):
|
||||||
io = StringIO()
|
io = StringIO()
|
||||||
print = functools.partial(builtins.print, file=io)
|
print = functools.partial(builtins.print, file=io)
|
||||||
|
|
||||||
@@ -191,7 +192,7 @@ def render_projects(projects: list[Project], *, dest_path: Path, include_info: b
|
|||||||
def insert_projects_table(
|
def insert_projects_table(
|
||||||
file: Path,
|
file: Path,
|
||||||
*,
|
*,
|
||||||
projects: list[Project],
|
projects: Sequence[Project],
|
||||||
input_filename: str,
|
input_filename: str,
|
||||||
include_info: bool = True,
|
include_info: bool = True,
|
||||||
):
|
):
|
||||||
|
|||||||
Regular → Executable
@@ -6,6 +6,7 @@ import copy
|
|||||||
import difflib
|
import difflib
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
from collections.abc import Mapping, MutableMapping
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Union
|
from typing import Any, Union
|
||||||
|
|
||||||
@@ -93,7 +94,7 @@ class WindowsVersions:
|
|||||||
unsorted_versions = spec.filter(self.version_dict)
|
unsorted_versions = spec.filter(self.version_dict)
|
||||||
versions = sorted(unsorted_versions, reverse=True)
|
versions = sorted(unsorted_versions, reverse=True)
|
||||||
|
|
||||||
log.debug(f"Windows {self.arch} {spec} has {', '.join(str(v) for v in versions)}")
|
log.debug("Windows %s %s has %s", self.arch, spec, ", ".join(str(v) for v in versions))
|
||||||
|
|
||||||
if not versions:
|
if not versions:
|
||||||
return None
|
return None
|
||||||
@@ -124,7 +125,7 @@ class PyPyVersions:
|
|||||||
]
|
]
|
||||||
self.arch = arch_str
|
self.arch = arch_str
|
||||||
|
|
||||||
def get_arch_file(self, release: dict[str, Any]) -> str:
|
def get_arch_file(self, release: Mapping[str, Any]) -> str:
|
||||||
urls: list[str] = [
|
urls: list[str] = [
|
||||||
rf["download_url"]
|
rf["download_url"]
|
||||||
for rf in release["files"]
|
for rf in release["files"]
|
||||||
@@ -250,11 +251,11 @@ class AllVersions:
|
|||||||
self.macos_pypy = PyPyVersions("64")
|
self.macos_pypy = PyPyVersions("64")
|
||||||
self.macos_pypy_arm64 = PyPyVersions("ARM64")
|
self.macos_pypy_arm64 = PyPyVersions("ARM64")
|
||||||
|
|
||||||
def update_config(self, config: dict[str, str]) -> None:
|
def update_config(self, config: MutableMapping[str, str]) -> None:
|
||||||
identifier = config["identifier"]
|
identifier = config["identifier"]
|
||||||
version = Version(config["version"])
|
version = Version(config["version"])
|
||||||
spec = Specifier(f"=={version.major}.{version.minor}.*")
|
spec = Specifier(f"=={version.major}.{version.minor}.*")
|
||||||
log.info(f"Reading in '{identifier}' -> {spec} @ {version}")
|
log.info("Reading in %r -> %s @ %s", str(identifier), spec, version)
|
||||||
orig_config = copy.copy(config)
|
orig_config = copy.copy(config)
|
||||||
config_update: AnyConfig | None = None
|
config_update: AnyConfig | None = None
|
||||||
|
|
||||||
@@ -282,7 +283,7 @@ class AllVersions:
|
|||||||
config.update(**config_update)
|
config.update(**config_update)
|
||||||
|
|
||||||
if config != orig_config:
|
if config != orig_config:
|
||||||
log.info(f" Updated {orig_config} to {config}")
|
log.info(" Updated %s to %s", orig_config, config)
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
|
|||||||
@@ -54,14 +54,14 @@ def git_ls_remote_versions(url) -> list[VersionTuple]:
|
|||||||
try:
|
try:
|
||||||
version = Version(version_string)
|
version = Version(version_string)
|
||||||
if version.is_devrelease:
|
if version.is_devrelease:
|
||||||
log.info(f"Ignoring development release '{version}'")
|
log.info("Ignoring development release %r", str(version))
|
||||||
continue
|
continue
|
||||||
if version.is_prerelease:
|
if version.is_prerelease:
|
||||||
log.info(f"Ignoring pre-release '{version}'")
|
log.info("Ignoring pre-release %r", str(version))
|
||||||
continue
|
continue
|
||||||
versions.append(VersionTuple(version, version_string))
|
versions.append(VersionTuple(version, version_string))
|
||||||
except InvalidVersion:
|
except InvalidVersion:
|
||||||
log.warning(f"Ignoring ref '{ref}'")
|
log.warning("Ignoring ref %r", ref)
|
||||||
versions.sort(reverse=True)
|
versions.sort(reverse=True)
|
||||||
return versions
|
return versions
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import sys
|
|||||||
import tarfile
|
import tarfile
|
||||||
import textwrap
|
import textwrap
|
||||||
import typing
|
import typing
|
||||||
from collections.abc import 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
|
||||||
|
|
||||||
@@ -337,7 +337,7 @@ def build_in_directory(args: CommandLineArguments) -> None:
|
|||||||
log.warning(f"Can't delete temporary folder '{tmp_path}'")
|
log.warning(f"Can't delete temporary folder '{tmp_path}'")
|
||||||
|
|
||||||
|
|
||||||
def print_preamble(platform: str, options: Options, identifiers: list[str]) -> None:
|
def print_preamble(platform: str, options: Options, identifiers: Sequence[str]) -> None:
|
||||||
print(
|
print(
|
||||||
textwrap.dedent(
|
textwrap.dedent(
|
||||||
"""
|
"""
|
||||||
@@ -377,7 +377,7 @@ def get_build_identifiers(
|
|||||||
return [config.identifier for config in python_configurations]
|
return [config.identifier for config in python_configurations]
|
||||||
|
|
||||||
|
|
||||||
def detect_warnings(*, options: Options, identifiers: list[str]) -> list[str]:
|
def detect_warnings(*, options: Options, identifiers: Iterable[str]) -> list[str]:
|
||||||
warnings = []
|
warnings = []
|
||||||
|
|
||||||
# warn about deprecated {python} and {pip}
|
# warn about deprecated {python} and {pip}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import functools
|
|||||||
import platform as platform_module
|
import platform as platform_module
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
from collections.abc import Set
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
from .typing import Final, Literal, PlatformName, assert_never
|
from .typing import Final, Literal, PlatformName, assert_never
|
||||||
@@ -132,7 +133,7 @@ class Architecture(Enum):
|
|||||||
|
|
||||||
def allowed_architectures_check(
|
def allowed_architectures_check(
|
||||||
platform: PlatformName,
|
platform: PlatformName,
|
||||||
architectures: set[Architecture],
|
architectures: Set[Architecture],
|
||||||
) -> None:
|
) -> None:
|
||||||
allowed_architectures = Architecture.all_archs(platform)
|
allowed_architectures = Architecture.all_archs(platform)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import subprocess
|
import subprocess
|
||||||
|
from collections.abc import Iterable, Mapping, Sequence
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Callable, Dict, List, Sequence
|
from typing import Callable, Dict, List # noqa: TID251
|
||||||
|
|
||||||
import bashlex
|
import bashlex
|
||||||
|
|
||||||
@@ -10,7 +11,7 @@ import bashlex
|
|||||||
EnvironmentExecutor = Callable[[List[str], Dict[str, str]], str]
|
EnvironmentExecutor = Callable[[List[str], Dict[str, str]], str]
|
||||||
|
|
||||||
|
|
||||||
def local_environment_executor(command: list[str], env: dict[str, str]) -> str:
|
def local_environment_executor(command: Sequence[str], env: Mapping[str, str]) -> str:
|
||||||
return subprocess.run(command, env=env, text=True, stdout=subprocess.PIPE, check=True).stdout
|
return subprocess.run(command, env=env, text=True, stdout=subprocess.PIPE, check=True).stdout
|
||||||
|
|
||||||
|
|
||||||
@@ -22,7 +23,7 @@ class NodeExecutionContext:
|
|||||||
|
|
||||||
|
|
||||||
def evaluate(
|
def evaluate(
|
||||||
value: str, environment: dict[str, str], executor: EnvironmentExecutor | None = None
|
value: str, environment: Mapping[str, str], executor: EnvironmentExecutor | None = None
|
||||||
) -> str:
|
) -> str:
|
||||||
if not value:
|
if not value:
|
||||||
# empty string evaluates to empty string
|
# empty string evaluates to empty string
|
||||||
@@ -40,7 +41,9 @@ def evaluate(
|
|||||||
return evaluate_node(
|
return evaluate_node(
|
||||||
value_word_node,
|
value_word_node,
|
||||||
context=NodeExecutionContext(
|
context=NodeExecutionContext(
|
||||||
environment=environment, input=value, executor=executor or local_environment_executor
|
environment=dict(environment),
|
||||||
|
input=value,
|
||||||
|
executor=executor or local_environment_executor,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -105,7 +108,7 @@ def evaluate_nodes_as_compound_command(
|
|||||||
|
|
||||||
|
|
||||||
def evaluate_nodes_as_simple_command(
|
def evaluate_nodes_as_simple_command(
|
||||||
nodes: list[bashlex.ast.node], context: NodeExecutionContext
|
nodes: Iterable[bashlex.ast.node], context: NodeExecutionContext
|
||||||
) -> str:
|
) -> str:
|
||||||
command = [evaluate_node(part, context=context) for part in nodes]
|
command = [evaluate_node(part, context=context) for part in nodes]
|
||||||
return context.executor(command, context.environment)
|
return context.executor(command, context.environment)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import dataclasses
|
import dataclasses
|
||||||
from typing import Any, Mapping, Sequence
|
from collections.abc import Mapping, Sequence
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
import bashlex
|
import bashlex
|
||||||
import bashlex.errors
|
import bashlex.errors
|
||||||
@@ -54,7 +55,7 @@ class EnvironmentAssignment(Protocol):
|
|||||||
def evaluated_value(
|
def evaluated_value(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
environment: dict[str, str],
|
environment: Mapping[str, str],
|
||||||
executor: bashlex_eval.EnvironmentExecutor | None = None,
|
executor: bashlex_eval.EnvironmentExecutor | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""Returns the value of this assignment, as evaluated in the environment"""
|
"""Returns the value of this assignment, as evaluated in the environment"""
|
||||||
@@ -91,7 +92,7 @@ class EnvironmentAssignmentBash:
|
|||||||
|
|
||||||
def evaluated_value(
|
def evaluated_value(
|
||||||
self,
|
self,
|
||||||
environment: dict[str, str],
|
environment: Mapping[str, str],
|
||||||
executor: bashlex_eval.EnvironmentExecutor | None = None,
|
executor: bashlex_eval.EnvironmentExecutor | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
return bashlex_eval.evaluate(self.value, environment=environment, executor=executor)
|
return bashlex_eval.evaluate(self.value, environment=environment, executor=executor)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ These are utilities for the `/bin` scripts, not for the `cibuildwheel` program.
|
|||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from collections.abc import Mapping, Sequence
|
||||||
from io import StringIO
|
from io import StringIO
|
||||||
|
|
||||||
from .typing import Protocol
|
from .typing import Protocol
|
||||||
@@ -16,7 +17,9 @@ class Printable(Protocol):
|
|||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
def dump_python_configurations(inp: dict[str, dict[str, list[dict[str, Printable]]]]) -> str:
|
def dump_python_configurations(
|
||||||
|
inp: Mapping[str, Mapping[str, Sequence[Mapping[str, Printable]]]]
|
||||||
|
) -> str:
|
||||||
output = StringIO()
|
output = StringIO()
|
||||||
for header, values in inp.items():
|
for header, values in inp.items():
|
||||||
output.write(f"[{header}]\n")
|
output.write(f"[{header}]\n")
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import typing
|
||||||
|
from collections.abc import Callable
|
||||||
from threading import RLock
|
from threading import RLock
|
||||||
from typing import Any, Callable, Generic, TypeVar, overload
|
from typing import Any, Generic, TypeVar
|
||||||
|
|
||||||
__all__ = ["cached_property"]
|
__all__ = ["cached_property"]
|
||||||
|
|
||||||
@@ -24,11 +26,11 @@ class cached_property(Generic[_T]):
|
|||||||
msg = f"Cannot assign the same cached_property to two different names ({self.attrname!r} and {name!r})."
|
msg = f"Cannot assign the same cached_property to two different names ({self.attrname!r} and {name!r})."
|
||||||
raise TypeError(msg)
|
raise TypeError(msg)
|
||||||
|
|
||||||
@overload
|
@typing.overload
|
||||||
def __get__(self, instance: None, owner: type[Any] | None = ...) -> cached_property[_T]:
|
def __get__(self, instance: None, owner: type[Any] | None = ...) -> cached_property[_T]:
|
||||||
...
|
...
|
||||||
|
|
||||||
@overload
|
@typing.overload
|
||||||
def __get__(self, instance: object, owner: type[Any] | None = ...) -> _T:
|
def __get__(self, instance: object, owner: type[Any] | None = ...) -> _T:
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ from __future__ import annotations
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
from collections.abc import 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 Iterator, Tuple
|
from typing import Tuple
|
||||||
|
|
||||||
from .architecture import Architecture
|
from .architecture import Architecture
|
||||||
from .logger import log
|
from .logger import log
|
||||||
@@ -113,7 +113,7 @@ def get_build_steps(
|
|||||||
|
|
||||||
|
|
||||||
def check_all_python_exist(
|
def check_all_python_exist(
|
||||||
*, platform_configs: list[PythonConfiguration], container: OCIContainer
|
*, platform_configs: Iterable[PythonConfiguration], container: OCIContainer
|
||||||
) -> None:
|
) -> None:
|
||||||
exist = True
|
exist = True
|
||||||
messages = []
|
messages = []
|
||||||
@@ -138,7 +138,7 @@ def check_all_python_exist(
|
|||||||
def build_in_container(
|
def build_in_container(
|
||||||
*,
|
*,
|
||||||
options: Options,
|
options: Options,
|
||||||
platform_configs: list[PythonConfiguration],
|
platform_configs: Sequence[PythonConfiguration],
|
||||||
container: OCIContainer,
|
container: OCIContainer,
|
||||||
container_project_path: PurePath,
|
container_project_path: PurePath,
|
||||||
container_package_dir: PurePath,
|
container_package_dir: PurePath,
|
||||||
@@ -438,7 +438,7 @@ def build(options: Options, tmp_path: Path) -> None: # noqa: ARG001
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def _matches_prepared_command(error_cmd: list[str], command_template: str) -> bool:
|
def _matches_prepared_command(error_cmd: Sequence[str], command_template: str) -> bool:
|
||||||
if len(error_cmd) < 3 or error_cmd[0:2] != ["sh", "-c"]:
|
if len(error_cmd) < 3 or error_cmd[0:2] != ["sh", "-c"]:
|
||||||
return False
|
return False
|
||||||
command_prefix = command_template.split("{", maxsplit=1)[0].strip()
|
command_prefix = command_template.split("{", maxsplit=1)[0].strip()
|
||||||
|
|||||||
@@ -8,10 +8,11 @@ import re
|
|||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
from collections.abc import Set
|
import typing
|
||||||
|
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 Sequence, Tuple, cast
|
from typing import Tuple
|
||||||
|
|
||||||
from filelock import FileLock
|
from filelock import FileLock
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ def get_macos_version() -> tuple[int, int]:
|
|||||||
"""
|
"""
|
||||||
version_str, _, _ = platform.mac_ver()
|
version_str, _, _ = platform.mac_ver()
|
||||||
version = tuple(map(int, version_str.split(".")[:2]))
|
version = tuple(map(int, version_str.split(".")[:2]))
|
||||||
return cast(Tuple[int, int], version)
|
return typing.cast(Tuple[int, int], version)
|
||||||
|
|
||||||
|
|
||||||
def get_macos_sdks() -> list[str]:
|
def get_macos_sdks() -> list[str]:
|
||||||
|
|||||||
@@ -8,10 +8,12 @@ import shlex
|
|||||||
import shutil
|
import shutil
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import typing
|
||||||
import uuid
|
import uuid
|
||||||
|
from collections.abc import Mapping, Sequence
|
||||||
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, Sequence, cast
|
from typing import IO, Dict
|
||||||
|
|
||||||
from cibuildwheel.util import CIProvider, detect_ci_provider
|
from cibuildwheel.util import CIProvider, detect_ci_provider
|
||||||
|
|
||||||
@@ -239,7 +241,7 @@ class OCIContainer:
|
|||||||
def call(
|
def call(
|
||||||
self,
|
self,
|
||||||
args: Sequence[PathOrStr],
|
args: Sequence[PathOrStr],
|
||||||
env: dict[str, str] | None = None,
|
env: Mapping[str, str] | None = None,
|
||||||
capture_output: bool = False,
|
capture_output: bool = False,
|
||||||
cwd: PathOrStr | None = None,
|
cwd: PathOrStr | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
@@ -329,9 +331,9 @@ class OCIContainer:
|
|||||||
capture_output=True,
|
capture_output=True,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return cast(Dict[str, str], env)
|
return typing.cast(Dict[str, str], env)
|
||||||
|
|
||||||
def environment_executor(self, command: list[str], environment: dict[str, str]) -> str:
|
def environment_executor(self, command: Sequence[str], environment: dict[str, str]) -> str:
|
||||||
# used as an EnvironmentExecutor to evaluate commands and capture output
|
# used as an EnvironmentExecutor to evaluate commands and capture output
|
||||||
return self.call(command, env=environment, capture_output=True)
|
return self.call(command, env=environment, capture_output=True)
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,10 @@ import shlex
|
|||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
import traceback
|
import traceback
|
||||||
|
import typing
|
||||||
|
from collections.abc import Callable, Generator, Iterable, Iterator, Mapping, Set
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Any, Callable, Dict, Generator, Iterator, List, Mapping, Union, cast
|
from typing import Any, Dict, List, Union
|
||||||
|
|
||||||
if sys.version_info >= (3, 11):
|
if sys.version_info >= (3, 11):
|
||||||
import tomllib
|
import tomllib
|
||||||
@@ -193,7 +195,7 @@ class OptionsReader:
|
|||||||
*,
|
*,
|
||||||
platform: PlatformName,
|
platform: PlatformName,
|
||||||
env: Mapping[str, str],
|
env: Mapping[str, str],
|
||||||
disallow: dict[str, set[str]] | None = None,
|
disallow: Mapping[str, Set[str]] | None = None,
|
||||||
) -> None:
|
) -> None:
|
||||||
self.platform = platform
|
self.platform = platform
|
||||||
self.env = env
|
self.env = env
|
||||||
@@ -462,7 +464,7 @@ class Options:
|
|||||||
print(msg, file=sys.stderr)
|
print(msg, file=sys.stderr)
|
||||||
sys.exit(2)
|
sys.exit(2)
|
||||||
|
|
||||||
container_engine = cast(ContainerEngine, container_engine_str)
|
container_engine = typing.cast(ContainerEngine, container_engine_str)
|
||||||
|
|
||||||
return GlobalOptions(
|
return GlobalOptions(
|
||||||
package_dir=package_dir,
|
package_dir=package_dir,
|
||||||
@@ -599,7 +601,7 @@ class Options:
|
|||||||
config_settings=config_settings,
|
config_settings=config_settings,
|
||||||
)
|
)
|
||||||
|
|
||||||
def check_for_invalid_configuration(self, identifiers: list[str]) -> None:
|
def check_for_invalid_configuration(self, identifiers: Iterable[str]) -> None:
|
||||||
if self.platform in {"macos", "windows"}:
|
if self.platform in {"macos", "windows"}:
|
||||||
before_all_values = {self.build_options(i).before_all for i in identifiers}
|
before_all_values = {self.build_options(i).before_all for i in identifiers}
|
||||||
|
|
||||||
@@ -631,7 +633,7 @@ class Options:
|
|||||||
read_config_file=False,
|
read_config_file=False,
|
||||||
)
|
)
|
||||||
|
|
||||||
def summary(self, identifiers: list[str]) -> str:
|
def summary(self, identifiers: Iterable[str]) -> str:
|
||||||
lines = []
|
lines = []
|
||||||
global_option_names = sorted(f.name for f in dataclasses.fields(self.globals))
|
global_option_names = sorted(f.name for f in dataclasses.fields(self.globals))
|
||||||
|
|
||||||
@@ -669,7 +671,7 @@ class Options:
|
|||||||
option_name: str,
|
option_name: str,
|
||||||
option_value: Any,
|
option_value: Any,
|
||||||
default_value: Any,
|
default_value: Any,
|
||||||
overrides: dict[str, Any] | None = None,
|
overrides: Mapping[str, Any] | None = None,
|
||||||
) -> str:
|
) -> str:
|
||||||
"""
|
"""
|
||||||
Return a summary of the option value, including any overrides, with
|
Return a summary of the option value, including any overrides, with
|
||||||
|
|||||||
+13
-19
@@ -11,23 +11,15 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
import time
|
import time
|
||||||
|
import typing
|
||||||
import urllib.request
|
import urllib.request
|
||||||
|
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 lru_cache
|
||||||
from pathlib import Path, PurePath
|
from pathlib import Path, PurePath
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from typing import (
|
from typing import Any, ClassVar, TextIO, TypeVar
|
||||||
Any,
|
|
||||||
ClassVar,
|
|
||||||
Generator,
|
|
||||||
Iterable,
|
|
||||||
Sequence,
|
|
||||||
TextIO,
|
|
||||||
TypeVar,
|
|
||||||
cast,
|
|
||||||
overload,
|
|
||||||
)
|
|
||||||
|
|
||||||
import bracex
|
import bracex
|
||||||
import certifi
|
import certifi
|
||||||
@@ -107,20 +99,20 @@ CIBW_CACHE_PATH: Final[Path] = Path(
|
|||||||
IS_WIN: Final[bool] = sys.platform.startswith("win")
|
IS_WIN: Final[bool] = sys.platform.startswith("win")
|
||||||
|
|
||||||
|
|
||||||
@overload
|
@typing.overload
|
||||||
def call(
|
def call(
|
||||||
*args: PathOrStr,
|
*args: PathOrStr,
|
||||||
env: dict[str, str] | None = None,
|
env: Mapping[str, str] | None = None,
|
||||||
cwd: PathOrStr | None = None,
|
cwd: PathOrStr | None = None,
|
||||||
capture_stdout: Literal[False] = ...,
|
capture_stdout: Literal[False] = ...,
|
||||||
) -> None:
|
) -> None:
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|
||||||
@overload
|
@typing.overload
|
||||||
def call(
|
def call(
|
||||||
*args: PathOrStr,
|
*args: PathOrStr,
|
||||||
env: dict[str, str] | None = None,
|
env: Mapping[str, str] | None = None,
|
||||||
cwd: PathOrStr | None = None,
|
cwd: PathOrStr | None = None,
|
||||||
capture_stdout: Literal[True],
|
capture_stdout: Literal[True],
|
||||||
) -> str:
|
) -> str:
|
||||||
@@ -129,7 +121,7 @@ def call(
|
|||||||
|
|
||||||
def call(
|
def call(
|
||||||
*args: PathOrStr,
|
*args: PathOrStr,
|
||||||
env: dict[str, str] | None = None,
|
env: Mapping[str, str] | None = None,
|
||||||
cwd: PathOrStr | None = None,
|
cwd: PathOrStr | None = None,
|
||||||
capture_stdout: bool = False,
|
capture_stdout: bool = False,
|
||||||
) -> str | None:
|
) -> str | None:
|
||||||
@@ -149,10 +141,12 @@ def call(
|
|||||||
result = subprocess.run(args_, check=True, shell=IS_WIN, env=env, cwd=cwd, **kwargs)
|
result = subprocess.run(args_, check=True, shell=IS_WIN, env=env, cwd=cwd, **kwargs)
|
||||||
if not capture_stdout:
|
if not capture_stdout:
|
||||||
return None
|
return None
|
||||||
return cast(str, result.stdout)
|
return typing.cast(str, result.stdout)
|
||||||
|
|
||||||
|
|
||||||
def shell(*commands: str, env: dict[str, str] | None = None, cwd: PathOrStr | None = None) -> None:
|
def shell(
|
||||||
|
*commands: str, env: Mapping[str, str] | None = None, cwd: PathOrStr | None = None
|
||||||
|
) -> None:
|
||||||
command = " ".join(commands)
|
command = " ".join(commands)
|
||||||
print(f"+ {command}")
|
print(f"+ {command}")
|
||||||
subprocess.run(command, env=env, cwd=cwd, shell=True, check=True)
|
subprocess.run(command, env=env, cwd=cwd, shell=True, check=True)
|
||||||
@@ -507,7 +501,7 @@ def print_new_wheels(msg: str, output_dir: Path) -> Generator[None, None, None]:
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_pip_version(env: dict[str, str]) -> str:
|
def get_pip_version(env: Mapping[str, str]) -> str:
|
||||||
versions_output_text = call(
|
versions_output_text = call(
|
||||||
"python", "-m", "pip", "freeze", "--all", capture_stdout=True, env=env
|
"python", "-m", "pip", "freeze", "--all", capture_stdout=True, env=env
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,12 +6,11 @@ import shutil
|
|||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
from collections.abc import Set
|
from collections.abc import MutableMapping, Sequence, Set
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Sequence
|
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
from filelock import FileLock
|
from filelock import FileLock
|
||||||
@@ -138,7 +137,7 @@ def setup_setuptools_cross_compile(
|
|||||||
tmp: Path,
|
tmp: Path,
|
||||||
python_configuration: PythonConfiguration,
|
python_configuration: PythonConfiguration,
|
||||||
python_libs_base: Path,
|
python_libs_base: Path,
|
||||||
env: dict[str, str],
|
env: MutableMapping[str, str],
|
||||||
) -> None:
|
) -> None:
|
||||||
distutils_cfg = tmp / "extra-setup.cfg"
|
distutils_cfg = tmp / "extra-setup.cfg"
|
||||||
env["DIST_EXTRA_CONFIG"] = str(distutils_cfg)
|
env["DIST_EXTRA_CONFIG"] = str(distutils_cfg)
|
||||||
@@ -186,7 +185,7 @@ def setup_rust_cross_compile(
|
|||||||
tmp: Path, # noqa: ARG001
|
tmp: Path, # noqa: ARG001
|
||||||
python_configuration: PythonConfiguration,
|
python_configuration: PythonConfiguration,
|
||||||
python_libs_base: Path, # noqa: ARG001
|
python_libs_base: Path, # noqa: ARG001
|
||||||
env: dict[str, str],
|
env: MutableMapping[str, str],
|
||||||
) -> None:
|
) -> None:
|
||||||
# Assume that MSVC will be used, because we already know that we are
|
# Assume that MSVC will be used, because we already know that we are
|
||||||
# cross-compiling. MinGW users can set CARGO_BUILD_TARGET themselves
|
# cross-compiling. MinGW users can set CARGO_BUILD_TARGET themselves
|
||||||
|
|||||||
+13
-3
@@ -121,25 +121,29 @@ messages_control.disable = [
|
|||||||
[tool.ruff]
|
[tool.ruff]
|
||||||
select = [
|
select = [
|
||||||
"E", "F", "W", # flake8
|
"E", "F", "W", # flake8
|
||||||
"B", "B904", # flake8-bugbear
|
"B", # flake8-bugbear
|
||||||
"I", # isort
|
"I", # isort
|
||||||
"ARG", # flake8-unused-arguments
|
"ARG", # flake8-unused-arguments
|
||||||
"C4", # flake8-comprehensions
|
"C4", # flake8-comprehensions
|
||||||
"EM", # flake8-errmsg
|
"EM", # flake8-errmsg
|
||||||
"ICN", # flake8-import-conventions
|
"ICN", # flake8-import-conventions
|
||||||
"ISC", # flake8-implicit-str-concat
|
"ISC", # flake8-implicit-str-concat
|
||||||
|
"G", # flake8-logging-format
|
||||||
"PGH", # pygrep-hooks
|
"PGH", # pygrep-hooks
|
||||||
"PIE", # flake8-pie
|
"PIE", # flake8-pie
|
||||||
"PLC", "PLE", "PLW", # pylint
|
"PL", # pylint
|
||||||
"PT", # flake8-pytest-style
|
"PT", # flake8-pytest-style
|
||||||
"RET", # flake8-return
|
"RET", # flake8-return
|
||||||
"RUF", # Ruff-specific
|
"RUF", # Ruff-specific
|
||||||
"SIM", # flake8-simplify
|
"SIM", # flake8-simplify
|
||||||
|
"TID251", # flake8-tidy-imports.banned-api
|
||||||
"UP", # pyupgrade
|
"UP", # pyupgrade
|
||||||
"YTT", # flake8-2020
|
"YTT", # flake8-2020
|
||||||
|
"EXE", # flake8-executable
|
||||||
]
|
]
|
||||||
extend-ignore = [
|
extend-ignore = [
|
||||||
"PLR2004", "E501",
|
"PLR", # Design related pylint codes
|
||||||
|
"E501", # Line too long
|
||||||
"RET504", "RET505", "RET508", # else after control flow
|
"RET504", "RET505", "RET508", # else after control flow
|
||||||
"PT004", # Rename suggested for returnless fixtures
|
"PT004", # Rename suggested for returnless fixtures
|
||||||
"PT007", # False positive (fixed upstream)
|
"PT007", # False positive (fixed upstream)
|
||||||
@@ -148,6 +152,12 @@ target-version = "py37"
|
|||||||
typing-modules = ["cibuildwheel.typing"]
|
typing-modules = ["cibuildwheel.typing"]
|
||||||
flake8-unused-arguments.ignore-variadic-names = true
|
flake8-unused-arguments.ignore-variadic-names = true
|
||||||
|
|
||||||
|
[tool.ruff.flake8-tidy-imports.banned-api]
|
||||||
|
"typing.Mapping".msg = "Use collections.abc.Mapping instead."
|
||||||
|
"typing.Callable".msg = "Use collections.abc.Callable instead."
|
||||||
|
"typing.Iterator".msg = "Use collections.abc.Iterator instead."
|
||||||
|
"typing.Sequence".msg = "Use collections.abc.Sequence instead."
|
||||||
|
"typing.Set".msg = "Use collections.abc.Set instead."
|
||||||
|
|
||||||
[tool.ruff.per-file-ignores]
|
[tool.ruff.per-file-ignores]
|
||||||
"unit_test/*" = ["PLC1901"]
|
"unit_test/*" = ["PLC1901"]
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ from __future__ import annotations
|
|||||||
import platform as platform_module
|
import platform as platform_module
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
import typing
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from pathlib import PurePosixPath
|
from pathlib import PurePosixPath
|
||||||
from typing import cast
|
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
@@ -52,7 +52,7 @@ def test_build_default_launches(monkeypatch):
|
|||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
build_in_container = cast(mock.Mock, linux.build_in_container)
|
build_in_container = typing.cast(mock.Mock, linux.build_in_container)
|
||||||
|
|
||||||
assert build_in_container.call_count == 4
|
assert build_in_container.call_count == 4
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ before-all = "true"
|
|||||||
|
|
||||||
main()
|
main()
|
||||||
|
|
||||||
build_in_container = cast(mock.Mock, linux.build_in_container)
|
build_in_container = typing.cast(mock.Mock, linux.build_in_container)
|
||||||
|
|
||||||
assert build_in_container.call_count == 6
|
assert build_in_container.call_count == 6
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user