Skip to content

Commit

Permalink
Refactor class hierarchy
Browse files Browse the repository at this point in the history
Removes unnecessary overlap in functionality
  • Loading branch information
joerick committed Jun 15, 2022
1 parent 4bffacc commit 860b14f
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 15 deletions.
2 changes: 1 addition & 1 deletion cibuildwheel/options.py
Expand Up @@ -387,7 +387,7 @@ def globals(self) -> GlobalOptions:
requires_python=requires_python,
prerelease_pythons=prerelease_pythons,
)
test_selector = TestSelector(skip_config=test_skip, prerelease_pythons=prerelease_pythons)
test_selector = TestSelector(skip_config=test_skip)

archs_config_str = args.archs or self.reader.get("archs", sep=" ")
architectures = Architecture.parse_config(archs_config_str, platform=self.platform)
Expand Down
28 changes: 14 additions & 14 deletions cibuildwheel/util.py
Expand Up @@ -234,21 +234,20 @@ def selector_matches(patterns: str, string: str) -> bool:

# Once we require Python 3.10+, we can add kw_only=True
@dataclasses.dataclass
class IdentifierSelector:
class BuildSelector:
"""
This class holds a set of build/skip patterns. You call an instance with a
build identifier, and it returns True if that identifier should be
included. Only call this on valid identifiers, ones that have at least 2
numeric digits before the first dash. If a pre-release version X.Y is present,
you can filter it with prerelease="XY".
numeric digits before the first dash.
"""

# a pattern that skips prerelease versions, when include_prereleases is False.
PRERELEASE_SKIP: ClassVar[str] = "cp311-*"

skip_config: str
build_config: str
skip_config: str
requires_python: Optional[SpecifierSet] = None

# a pattern that skips prerelease versions, when include_prereleases is False.
PRERELEASE_SKIP: ClassVar[str] = "cp311-*"
prerelease_pythons: bool = False

def __call__(self, build_id: str) -> bool:
Expand All @@ -272,15 +271,16 @@ def __call__(self, build_id: str) -> bool:


@dataclasses.dataclass
class BuildSelector(IdentifierSelector):
pass
class TestSelector:
"""
A build selector that can only skip tests according to a skip pattern.
"""

skip_config: str

# Note that requires-python is not needed for TestSelector, as you can't test
# what you can't build.
@dataclasses.dataclass
class TestSelector(IdentifierSelector):
build_config: str = "*"
def __call__(self, build_id: str) -> bool:
should_skip = selector_matches(self.skip_config, build_id)
return not should_skip


# Taken from https://stackoverflow.com/a/107717
Expand Down
11 changes: 11 additions & 0 deletions unit_test/build_selector_test.py
Expand Up @@ -136,3 +136,14 @@ def test_build_limited_python_patch():

assert build_selector("cp36-manylinux_x86_64")
assert build_selector("cp37-manylinux_x86_64")


def test_testing_selector():
# local import to avoid pytest trying to collect this as a test class!
from cibuildwheel.util import TestSelector

test_selector = TestSelector(skip_config="cp36-*")

assert not test_selector("cp36-win_amd64")
assert test_selector("cp37-manylinux_x86_64")
assert test_selector("cp311-manylinux_x86_64")

0 comments on commit 860b14f

Please sign in to comment.