|
| 1 | +import os |
1 | 2 | import re
|
2 | 3 | import sys
|
| 4 | +import shutil |
3 | 5 | import subprocess
|
| 6 | +import venv |
| 7 | +import string |
| 8 | +from tempfile import TemporaryDirectory |
4 | 9 |
|
5 |
| -from paver.easy import task, path as Path |
| 10 | +from paver.easy import info, task, path as Path |
6 | 11 |
|
7 | 12 |
|
8 | 13 | def remove_all(paths):
|
@@ -67,4 +72,40 @@ def update_pkg_resources():
|
67 | 72 | def update_setuptools():
|
68 | 73 | vendor = Path('setuptools/_vendor')
|
69 | 74 | install(vendor)
|
| 75 | + install_validate_pyproject(vendor) |
70 | 76 | rewrite_packaging(vendor / 'packaging', 'setuptools.extern')
|
| 77 | + |
| 78 | + |
| 79 | +def install_validate_pyproject(vendor): |
| 80 | + """``validate-pyproject`` can be vendorized to remove all dependencies""" |
| 81 | + req = next( |
| 82 | + (x for x in (vendor / "vendored.txt").lines() if 'validate-pyproject' in x), |
| 83 | + "validate-pyproject[all]" |
| 84 | + ) |
| 85 | + |
| 86 | + pkg, _, _ = req.strip(string.whitespace + "#").partition("#") |
| 87 | + pkg = pkg.strip() |
| 88 | + |
| 89 | + opts = {} |
| 90 | + if sys.version_info[:2] >= (3, 10): |
| 91 | + opts["ignore_cleanup_errors"] = True |
| 92 | + |
| 93 | + with TemporaryDirectory(**opts) as tmp: |
| 94 | + venv.create(tmp, with_pip=True) |
| 95 | + path = os.pathsep.join(Path(tmp).glob("*")) |
| 96 | + venv_python = shutil.which("python", path=path) |
| 97 | + info(f"Temporarily installing {pkg!r}...") |
| 98 | + subprocess.check_call([venv_python, "-m", "pip", "install", pkg]) |
| 99 | + cmd = [ |
| 100 | + venv_python, |
| 101 | + "-m", |
| 102 | + "validate_pyproject.vendoring", |
| 103 | + "--output-dir", |
| 104 | + str(vendor / "_validate_pyproject"), |
| 105 | + "--enable-plugins", |
| 106 | + "setuptools", |
| 107 | + "distutils", |
| 108 | + "--very-verbose" |
| 109 | + ] |
| 110 | + subprocess.check_output(cmd) |
| 111 | + info(f"{pkg!r} vendorized") |
0 commit comments