40f6765e0e
The hook is optional, see https://www.python.org/dev/peps/pep-0517/#prepare-metadata-for-build-wheel > If a build frontend needs this information and the method is not defined, > it should call build_wheel and look at the resulting metadata directly. This is not yet automatically detected because the feature is provisional. Use `%pyproject_buildrequires -w` to opt-in. Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2076994
86 lines
2.8 KiB
Python
86 lines
2.8 KiB
Python
from pathlib import Path
|
|
import importlib.metadata
|
|
|
|
import pytest
|
|
import yaml
|
|
|
|
from pyproject_buildrequires import generate_requires
|
|
|
|
|
|
testcases = {}
|
|
with Path(__file__).parent.joinpath('pyproject_buildrequires_testcases.yaml').open() as f:
|
|
testcases = yaml.safe_load(f)
|
|
|
|
|
|
@pytest.mark.parametrize('case_name', testcases)
|
|
def test_data(case_name, capfd, tmp_path, monkeypatch):
|
|
case = testcases[case_name]
|
|
|
|
cwd = tmp_path.joinpath('cwd')
|
|
cwd.mkdir()
|
|
monkeypatch.chdir(cwd)
|
|
wheeldir = cwd.joinpath('wheeldir')
|
|
wheeldir.mkdir()
|
|
|
|
if case.get('xfail'):
|
|
pytest.xfail(case.get('xfail'))
|
|
|
|
for filename in case:
|
|
file_types = ('.toml', '.py', '.in', '.ini', '.txt')
|
|
if filename.endswith(file_types):
|
|
cwd.joinpath(filename).write_text(case[filename])
|
|
|
|
for name, value in case.get('environ', {}).items():
|
|
monkeypatch.setenv(name, value)
|
|
|
|
def get_installed_version(dist_name):
|
|
try:
|
|
return str(case['installed'][dist_name])
|
|
except (KeyError, TypeError):
|
|
raise importlib.metadata.PackageNotFoundError(
|
|
f'info not found for {dist_name}'
|
|
)
|
|
requirement_files = case.get('requirement_files', [])
|
|
requirement_files = [open(f) for f in requirement_files]
|
|
use_build_system = case.get('use_build_system', True)
|
|
try:
|
|
generate_requires(
|
|
get_installed_version=get_installed_version,
|
|
include_runtime=case.get('include_runtime', use_build_system),
|
|
build_wheel=case.get('build_wheel', False),
|
|
wheeldir=str(wheeldir),
|
|
extras=case.get('extras', []),
|
|
toxenv=case.get('toxenv', None),
|
|
generate_extras=case.get('generate_extras', False),
|
|
requirement_files=requirement_files,
|
|
use_build_system=use_build_system,
|
|
)
|
|
except SystemExit as e:
|
|
assert e.code == case['result']
|
|
except Exception as e:
|
|
if 'except' not in case:
|
|
raise
|
|
assert type(e).__name__ == case['except']
|
|
else:
|
|
assert 0 == case['result']
|
|
|
|
# this prevents us from accidentally writing "empty" tests
|
|
# if we ever need to do that, we can remove the check or change it:
|
|
assert 'expected' in case or 'stderr_contains' in case
|
|
|
|
out, err = capfd.readouterr()
|
|
|
|
if 'expected' in case:
|
|
assert out == case['expected']
|
|
|
|
# stderr_contains may be a string or list of strings
|
|
stderr_contains = case.get('stderr_contains')
|
|
if stderr_contains is not None:
|
|
if isinstance(stderr_contains, str):
|
|
stderr_contains = [stderr_contains]
|
|
for expected_substring in stderr_contains:
|
|
assert expected_substring.format(**locals()) in err
|
|
finally:
|
|
for req in requirement_files:
|
|
req.close()
|