1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
# These tests check the sdist, path, and wheel of build to ensure that all are valid.
from __future__ import annotations
import subprocess
import sys
import tarfile
import zipfile
from pathlib import Path, PurePosixPath
import pytest
DIR = Path(__file__).parent.resolve()
MAIN_DIR = DIR.parent
sdist_files = {
'.dockerignore',
'.gitignore',
'CHANGELOG.rst',
'LICENSE',
'PKG-INFO',
'README.md',
'docs/conf.py',
'pyproject.toml',
'src/build/py.typed',
'tests/constraints.txt',
'tests/packages/test-cant-build-via-sdist/some-file-that-is-needed-for-build.txt',
'tests/packages/test-no-project/empty.txt',
'tests/packages/test-setuptools/MANIFEST.in',
'tox.ini',
}
sdist_patterns = {
'docs/*.rst',
'src/build/*.py',
'src/build/_compat/*.py',
'tests/*.py',
'tests/packages/*/*.py',
'tests/packages/*/*/*.py',
'tests/packages/*/pyproject.toml',
'tests/packages/*/setup.*',
}
sdist_files |= {str(PurePosixPath(p.relative_to(MAIN_DIR))) for path in sdist_patterns for p in MAIN_DIR.glob(path)}
wheel_files = {
'build/__init__.py',
'build/__main__.py',
'build/_builder.py',
'build/_compat/__init__.py',
'build/_compat/importlib.py',
'build/_compat/tarfile.py',
'build/_compat/tomllib.py',
'build/_ctx.py',
'build/_exceptions.py',
'build/_types.py',
'build/_util.py',
'build/env.py',
'build/py.typed',
'build/util.py',
'dist-info/licenses/LICENSE',
'dist-info/METADATA',
'dist-info/RECORD',
'dist-info/WHEEL',
'dist-info/entry_points.txt',
}
@pytest.mark.network
def test_build_sdist(monkeypatch, tmpdir):
monkeypatch.chdir(MAIN_DIR)
subprocess.run(
[
sys.executable,
'-m',
'build',
'--sdist',
'--outdir',
str(tmpdir),
],
check=True,
)
(sdist,) = tmpdir.visit('*.tar.gz')
with tarfile.open(str(sdist), 'r:gz') as tar:
simpler = {n.split('/', 1)[-1] for n in tar.getnames()}
assert simpler == sdist_files
@pytest.mark.network
@pytest.mark.parametrize('args', ((), ('--wheel',)), ids=('from_sdist', 'direct'))
def test_build_wheel(monkeypatch, tmpdir, args):
monkeypatch.chdir(MAIN_DIR)
subprocess.run(
[
sys.executable,
'-m',
'build',
*args,
'--outdir',
str(tmpdir),
],
check=True,
)
(wheel,) = tmpdir.visit('*.whl')
with zipfile.ZipFile(str(wheel)) as z:
names = z.namelist()
trimmed = {n for n in names if 'dist-info' not in n}
trimmed |= {f'dist-info/{n.split("/", 1)[-1]}' for n in names if 'dist-info' in n}
assert trimmed == wheel_files
|