Skip to content

Commit 7b94bcd

Browse files
committed
optimise unit tests - a specific platform module API for all configs
Unit test time: 26.2s -> 13.1s
1 parent b1037d4 commit 7b94bcd

File tree

6 files changed

+47
-40
lines changed

6 files changed

+47
-40
lines changed

cibuildwheel/__main__.py

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -448,20 +448,36 @@ def detect_warnings(*, options: Options, identifiers: Iterable[str]) -> list[str
448448
build_selector = options.globals.build_selector
449449
test_selector = options.globals.test_selector
450450

451+
all_valid_identifiers = [
452+
config.identifier
453+
for module in ALL_PLATFORM_MODULES.values()
454+
for config in module.all_python_configurations()
455+
]
456+
457+
enabled_selector = BuildSelector(
458+
build_config="*", skip_config="", enable=options.globals.build_selector.enable
459+
)
460+
all_enabled_identifiers = [
461+
identifier for identifier in all_valid_identifiers if enabled_selector(identifier)
462+
]
463+
451464
warnings += check_for_invalid_selectors(
452465
selector_name="build",
453466
selector_value=build_selector.build_config,
454-
enable=options.globals.build_selector.enable,
467+
all_valid_identifiers=all_valid_identifiers,
468+
all_enabled_identifiers=all_enabled_identifiers,
455469
)
456470
warnings += check_for_invalid_selectors(
457471
selector_name="skip",
458472
selector_value=build_selector.skip_config,
459-
enable=options.globals.build_selector.enable,
473+
all_valid_identifiers=all_valid_identifiers,
474+
all_enabled_identifiers=all_enabled_identifiers,
460475
)
461476
warnings += check_for_invalid_selectors(
462477
selector_name="test_skip",
463478
selector_value=test_selector.skip_config,
464-
enable=options.globals.build_selector.enable,
479+
all_valid_identifiers=all_valid_identifiers,
480+
all_enabled_identifiers=all_enabled_identifiers,
465481
)
466482

467483
return warnings
@@ -471,32 +487,11 @@ def check_for_invalid_selectors(
471487
*,
472488
selector_name: Literal["build", "skip", "test_skip"],
473489
selector_value: str,
474-
enable: frozenset[EnableGroup],
490+
all_valid_identifiers: Sequence[str],
491+
all_enabled_identifiers: Sequence[str],
475492
) -> list[str]:
476493
warnings = []
477494

478-
all_enabled_identifiers = [
479-
identifier
480-
for name, module in ALL_PLATFORM_MODULES.items()
481-
for identifier in get_build_identifiers(
482-
platform_module=module,
483-
architectures=Architecture.all_archs(name),
484-
build_selector=BuildSelector(build_config="*", skip_config="", enable=enable),
485-
)
486-
]
487-
488-
all_valid_identifiers = [
489-
identifier
490-
for name, module in ALL_PLATFORM_MODULES.items()
491-
for identifier in get_build_identifiers(
492-
platform_module=module,
493-
architectures=Architecture.all_archs(name),
494-
build_selector=BuildSelector(
495-
build_config="*", skip_config="", enable=EnableGroup.all_groups()
496-
),
497-
)
498-
]
499-
500495
for selector in selector_value.split():
501496
if not any(selector_matches(selector, i) for i in all_enabled_identifiers):
502497
msg = f"Invalid {selector_name} selector: {selector!r}. "

cibuildwheel/platforms/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
class PlatformModule(Protocol):
1515
# note that as per PEP544, the self argument is ignored when the protocol
1616
# is applied to a module
17+
def all_python_configurations(self) -> Sequence[GenericPythonConfiguration]: ...
18+
1719
def get_python_configurations(
1820
self, build_selector: BuildSelector, architectures: set[Architecture]
1921
) -> Sequence[GenericPythonConfiguration]: ...

cibuildwheel/platforms/linux.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,16 @@ class BuildStep:
5454
container_image: str
5555

5656

57+
def all_python_configurations() -> list[PythonConfiguration]:
58+
config_dicts = resources.read_python_configs("linux")
59+
return [PythonConfiguration(**item) for item in config_dicts]
60+
61+
5762
def get_python_configurations(
5863
build_selector: BuildSelector,
5964
architectures: Set[Architecture],
6065
) -> list[PythonConfiguration]:
61-
full_python_configs = resources.read_python_configs("linux")
62-
63-
python_configurations = [PythonConfiguration(**item) for item in full_python_configs]
66+
python_configurations = all_python_configurations()
6467

6568
# return all configurations whose arch is in our `architectures` set,
6669
# and match the build/skip rules

cibuildwheel/platforms/macos.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,15 @@ class PythonConfiguration:
8686
url: str
8787

8888

89+
def all_python_configurations() -> list[PythonConfiguration]:
90+
config_dicts = resources.read_python_configs("macos")
91+
return [PythonConfiguration(**item) for item in config_dicts]
92+
93+
8994
def get_python_configurations(
9095
build_selector: BuildSelector, architectures: Set[Architecture]
9196
) -> list[PythonConfiguration]:
92-
full_python_configs = resources.read_python_configs("macos")
93-
94-
python_configurations = [PythonConfiguration(**item) for item in full_python_configs]
97+
python_configurations = all_python_configurations()
9598

9699
# filter out configs that don't match any of the selected architectures
97100
python_configurations = [

cibuildwheel/platforms/pyodide.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,16 @@ def setup_python(
217217
return env
218218

219219

220+
def all_python_configurations() -> list[PythonConfiguration]:
221+
full_python_configs = resources.read_python_configs("pyodide")
222+
return [PythonConfiguration(**item) for item in full_python_configs]
223+
224+
220225
def get_python_configurations(
221226
build_selector: BuildSelector,
222227
architectures: Set[Architecture], # noqa: ARG001
223228
) -> list[PythonConfiguration]:
224-
full_python_configs = resources.read_python_configs("pyodide")
225-
226-
python_configurations = [PythonConfiguration(**item) for item in full_python_configs]
227-
python_configurations = [c for c in python_configurations if build_selector(c.identifier)]
228-
return python_configurations
229+
return [c for c in all_python_configurations() if build_selector(c.identifier)]
229230

230231

231232
def build(options: Options, tmp_path: Path) -> None:

cibuildwheel/platforms/windows.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,16 @@ class PythonConfiguration:
6262
url: str | None = None
6363

6464

65+
def all_python_configurations() -> list[PythonConfiguration]:
66+
config_dicts = resources.read_python_configs("windows")
67+
return [PythonConfiguration(**item) for item in config_dicts]
68+
69+
6570
def get_python_configurations(
6671
build_selector: BuildSelector,
6772
architectures: Set[Architecture],
6873
) -> list[PythonConfiguration]:
69-
full_python_configs = resources.read_python_configs("windows")
70-
71-
python_configurations = [PythonConfiguration(**item) for item in full_python_configs]
74+
python_configurations = all_python_configurations()
7275

7376
map_arch = {"32": Architecture.x86, "64": Architecture.AMD64, "ARM64": Architecture.ARM64}
7477

0 commit comments

Comments
 (0)