feat: requires-python (#536)

* feat: requires-python

refactor: updating to current proposal

fix: add tests and fix a few issues

docs: Update mostly from @joerick

docs: update README from readthedocs

* refactor: pull out config file reading

* fix: always assume highest Python patch version

* refactor: try new design

* refactor: function and bump MyPy to 0.800

* fix: tighten AST to call only, add docs

* fix: address review points from @joerick
This commit is contained in:
Henry Schreiner
2021-01-31 17:14:15 -05:00
committed by GitHub
parent b95dca50aa
commit eb700a164c
17 changed files with 591 additions and 30 deletions
View File
+2 -2
View File
@@ -51,8 +51,8 @@ def test_build_selector(platform, intercepted_build_args, monkeypatch, allow_emp
intercepted_build_selector = intercepted_build_args.args[0].build_selector
assert isinstance(intercepted_build_selector, BuildSelector)
assert intercepted_build_selector('build-this')
assert not intercepted_build_selector('skip-that')
assert intercepted_build_selector('build24-this')
assert not intercepted_build_selector('skip65-that')
# This unit test is just testing the options of 'main'
# Unit tests for BuildSelector are in build_selector_test.py
+3 -2
View File
@@ -1,10 +1,11 @@
import sys
import pytest
from conftest import MOCK_PACKAGE_DIR # noqa: I100
from cibuildwheel.__main__ import main
from cibuildwheel.util import Architecture
from cibuildwheel.architecture import Architecture
from .conftest import MOCK_PACKAGE_DIR
def test_unknown_platform_non_ci(monkeypatch, capsys):
@@ -0,0 +1,103 @@
import sys
import textwrap
import pytest
from packaging.specifiers import SpecifierSet
from cibuildwheel.__main__ import main
@pytest.fixture(autouse=True, scope="function")
def fake_package_dir(monkeypatch, tmp_path):
'''
Set up a fake project
'''
local_path = tmp_path / "tmp_project"
local_path.mkdir()
local_path.joinpath("setup.py").touch()
monkeypatch.setattr(sys, 'argv', ['cibuildwheel', str(local_path)])
return local_path
def test_no_override(platform, monkeypatch, intercepted_build_args):
main()
intercepted_build_selector = intercepted_build_args.args[0].build_selector
assert intercepted_build_selector('cp39-win32')
assert intercepted_build_selector('cp36-win32')
assert intercepted_build_selector.requires_python is None
def test_override_env(platform, monkeypatch, intercepted_build_args):
monkeypatch.setenv('CIBW_PROJECT_REQUIRES_PYTHON', '>=3.8')
main()
intercepted_build_selector = intercepted_build_args.args[0].build_selector
assert intercepted_build_selector.requires_python == SpecifierSet(">=3.8")
assert intercepted_build_selector('cp39-win32')
assert not intercepted_build_selector('cp36-win32')
def test_override_setup_cfg(platform, monkeypatch, intercepted_build_args, fake_package_dir):
fake_package_dir.joinpath("setup.cfg").write_text(textwrap.dedent("""
[options]
python_requires = >=3.8
"""))
main()
intercepted_build_selector = intercepted_build_args.args[0].build_selector
assert intercepted_build_selector.requires_python == SpecifierSet(">=3.8")
assert intercepted_build_selector('cp39-win32')
assert not intercepted_build_selector('cp36-win32')
def test_override_pyproject_toml(platform, monkeypatch, intercepted_build_args, fake_package_dir):
fake_package_dir.joinpath("pyproject.toml").write_text(textwrap.dedent("""
[project]
requires-python = ">=3.8"
"""))
main()
intercepted_build_selector = intercepted_build_args.args[0].build_selector
assert intercepted_build_selector.requires_python == SpecifierSet(">=3.8")
assert intercepted_build_selector('cp39-win32')
assert not intercepted_build_selector('cp36-win32')
def test_override_setup_py_simple(platform, monkeypatch, intercepted_build_args, fake_package_dir):
fake_package_dir.joinpath("setup.py").write_text(textwrap.dedent("""
from setuptools import setup
setup(
name = "other",
python_requires = ">=3.7",
)
"""))
main()
intercepted_build_selector = intercepted_build_args.args[0].build_selector
assert intercepted_build_selector.requires_python == SpecifierSet(">=3.7")
assert intercepted_build_selector('cp39-win32')
assert not intercepted_build_selector('cp36-win32')