feat: support brace expansion in BUILD/SKIP (#527)
* wip: try wcmatch * feat: expand braces * docs: mention brace expansion * docs: more reasonable examples of brackets * Update docs/options.md Co-authored-by: Joe Rickerby <joerick@mac.com> Co-authored-by: Joe Rickerby <joerick@mac.com>
This commit is contained in:
co-authored by
Joe Rickerby
parent
d394386318
commit
e91d8d82a2
@@ -1,4 +1,6 @@
|
|||||||
|
import fnmatch
|
||||||
import functools
|
import functools
|
||||||
|
import itertools
|
||||||
import os
|
import os
|
||||||
import platform as platform_module
|
import platform as platform_module
|
||||||
import re
|
import re
|
||||||
@@ -7,11 +9,11 @@ import sys
|
|||||||
import textwrap
|
import textwrap
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from fnmatch import fnmatch
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from time import sleep
|
from time import sleep
|
||||||
from typing import Dict, List, NamedTuple, Optional, Set
|
from typing import Dict, List, NamedTuple, Optional, Set
|
||||||
|
|
||||||
|
import bracex
|
||||||
import certifi
|
import certifi
|
||||||
import toml
|
import toml
|
||||||
|
|
||||||
@@ -61,9 +63,12 @@ class BuildSelector:
|
|||||||
self.skip_patterns = skip_config.split()
|
self.skip_patterns = skip_config.split()
|
||||||
|
|
||||||
def __call__(self, build_id: str) -> bool:
|
def __call__(self, build_id: str) -> bool:
|
||||||
def match_any(patterns: List[str]) -> bool:
|
build_patterns = itertools.chain.from_iterable(bracex.expand(p) for p in self.build_patterns)
|
||||||
return any(fnmatch(build_id, pattern) for pattern in patterns)
|
skip_patterns = itertools.chain.from_iterable(bracex.expand(p) for p in self.skip_patterns)
|
||||||
return match_any(self.build_patterns) and not match_any(self.skip_patterns)
|
|
||||||
|
build: bool = any(fnmatch.fnmatch(build_id, pat) for pat in build_patterns)
|
||||||
|
skip: bool = any(fnmatch.fnmatch(build_id, pat) for pat in skip_patterns)
|
||||||
|
return build and not skip
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
if not self.skip_patterns:
|
if not self.skip_patterns:
|
||||||
|
|||||||
+5
-5
@@ -75,7 +75,7 @@ Space-separated list of builds to build and skip. Each build has an identifier l
|
|||||||
|
|
||||||
When both options are specified, both conditions are applied and only builds with a tag that matches `CIBW_BUILD` and does not match `CIBW_SKIP` will be built.
|
When both options are specified, both conditions are applied and only builds with a tag that matches `CIBW_BUILD` and does not match `CIBW_SKIP` will be built.
|
||||||
|
|
||||||
When setting the options, you can use shell-style globbing syntax (as per [`fnmatch`](https://docs.python.org/3/library/fnmatch.html)). All the build identifiers supported by cibuildwheel are shown below:
|
When setting the options, you can use shell-style globbing syntax, as per [`fnmatch`](https://docs.python.org/3/library/fnmatch.html) with the addition of curly bracket syntax `{option1,option2}`, provided by [`bracex`](https://pypi.org/project/bracex/). All the build identifiers supported by cibuildwheel are shown below:
|
||||||
|
|
||||||
<div class="build-id-table-marker"></div>
|
<div class="build-id-table-marker"></div>
|
||||||
|
|
||||||
@@ -89,7 +89,7 @@ When setting the options, you can use shell-style globbing syntax (as per [`fnma
|
|||||||
| Python 3.9 | cp39-macosx_x86_64 | cp39-manylinux_x86_64 | cp39-manylinux_i686 | cp39-win_amd64 | cp39-win32 | cp39-manylinux_aarch64 | cp39-manylinux_ppc64le | cp39-manylinux_s390x |
|
| Python 3.9 | cp39-macosx_x86_64 | cp39-manylinux_x86_64 | cp39-manylinux_i686 | cp39-win_amd64 | cp39-win32 | cp39-manylinux_aarch64 | cp39-manylinux_ppc64le | cp39-manylinux_s390x |
|
||||||
| PyPy 2.7 v7.3.3 | pp27-macosx_x86_64 | pp27-manylinux_x86_64 | | | pp27-win32 | | | |
|
| PyPy 2.7 v7.3.3 | pp27-macosx_x86_64 | pp27-manylinux_x86_64 | | | pp27-win32 | | | |
|
||||||
| PyPy 3.6 v7.3.3 | pp36-macosx_x86_64 | pp36-manylinux_x86_64 | | | pp36-win32 | | | |
|
| PyPy 3.6 v7.3.3 | pp36-macosx_x86_64 | pp36-manylinux_x86_64 | | | pp36-win32 | | | |
|
||||||
| PyPy 3.7 (beta) v7.3.3 | pp37-macosx_x86_64 | pp37-manylinux_x86_64 | | | pp37-win32 | | | |
|
| PyPy 3.7 (beta) v7.3.3 | pp37-macosx_x86_64 | pp37-manylinux_x86_64 | | | pp37-win32 | | | |
|
||||||
|
|
||||||
|
|
||||||
The list of supported and currently selected build identifiers can also be retrieved by passing the `--print-build-identifiers` flag to `cibuildwheel`.
|
The list of supported and currently selected build identifiers can also be retrieved by passing the `--print-build-identifiers` flag to `cibuildwheel`.
|
||||||
@@ -124,12 +124,12 @@ CIBW_SKIP: cp27-* cp35-*
|
|||||||
# Skip Python 3.6 on Linux
|
# Skip Python 3.6 on Linux
|
||||||
CIBW_SKIP: cp36-manylinux*
|
CIBW_SKIP: cp36-manylinux*
|
||||||
|
|
||||||
# Only build on Python 3 and skip 32-bit builds
|
# Only build on Python 3 (ready for 3.10 when it comes) and skip 32-bit builds
|
||||||
CIBW_BUILD: cp3?-*
|
CIBW_BUILD: {cp,pp}3*-*
|
||||||
CIBW_SKIP: "*-win32 *-manylinux_i686"
|
CIBW_SKIP: "*-win32 *-manylinux_i686"
|
||||||
|
|
||||||
# Only build PyPy and CPython 3
|
# Only build PyPy and CPython 3
|
||||||
CIBW_BUILD: pp* cp3?-*
|
CIBW_BUILD: pp* cp3*-*
|
||||||
|
|
||||||
# Disable building PyPy wheels on all platforms
|
# Disable building PyPy wheels on all platforms
|
||||||
CIBW_SKIP: pp*
|
CIBW_SKIP: pp*
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ install_requires =
|
|||||||
bashlex!=0.13
|
bashlex!=0.13
|
||||||
toml
|
toml
|
||||||
certifi
|
certifi
|
||||||
|
bracex
|
||||||
typing_extensions; python_version < '3.8'
|
typing_extensions; python_version < '3.8'
|
||||||
importlib_resources>=1.4; python_version < '3.9'
|
importlib_resources>=1.4; python_version < '3.9'
|
||||||
|
|
||||||
@@ -119,6 +120,9 @@ ignore_missing_imports = True
|
|||||||
[mypy-toml.*]
|
[mypy-toml.*]
|
||||||
ignore_missing_imports = True
|
ignore_missing_imports = True
|
||||||
|
|
||||||
|
[mypy-bracex.*]
|
||||||
|
ignore_missing_imports = True
|
||||||
|
|
||||||
[tool:isort]
|
[tool:isort]
|
||||||
profile=black
|
profile=black
|
||||||
multi_line_output=3
|
multi_line_output=3
|
||||||
|
|||||||
@@ -59,3 +59,13 @@ def test_build_and_skip():
|
|||||||
assert not build_selector('cp27-win_amd64')
|
assert not build_selector('cp27-win_amd64')
|
||||||
assert build_selector('cp36-win_amd64')
|
assert build_selector('cp36-win_amd64')
|
||||||
assert not build_selector('cp37-win_amd64')
|
assert not build_selector('cp37-win_amd64')
|
||||||
|
|
||||||
|
|
||||||
|
def test_build_braces():
|
||||||
|
build_selector = BuildSelector(build_config="cp{36,37}*", skip_config="")
|
||||||
|
|
||||||
|
assert not build_selector('cp27-manylinux1_x86_64')
|
||||||
|
assert build_selector('cp36-manylinux1_x86_64')
|
||||||
|
assert build_selector('cp37-manylinux1_x86_64')
|
||||||
|
assert not build_selector('cp38-manylinux1_x86_64')
|
||||||
|
assert not build_selector('cp39-manylinux1_x86_64')
|
||||||
|
|||||||
Reference in New Issue
Block a user