| import re | |
| from paver.easy import task, path as Path | |
| import pip | |
| def remove_all(paths): | |
| for path in paths: | |
| path.rmtree() if path.isdir() else path.remove() | |
| @task | |
| def update_vendored(): | |
| update_pkg_resources() | |
| update_setuptools() | |
| def rewrite_packaging(pkg_files, new_root): | |
| """ | |
| Rewrite imports in packaging to redirect to vendored copies. | |
| """ | |
| for file in pkg_files.glob('*.py'): | |
| text = file.text() | |
| text = re.sub(r' (pyparsing|six)', rf' {new_root}.\1', text) | |
| file.write_text(text) | |
| def clean(vendor): | |
| """ | |
| Remove all files out of the vendor directory except the meta | |
| data (as pip uninstall doesn't support -t). | |
| """ | |
| remove_all( | |
| path | |
| for path in vendor.glob('*') | |
| if path.basename() != 'vendored.txt' | |
| ) | |
| def install(vendor): | |
| clean(vendor) | |
| install_args = [ | |
| 'install', | |
| '-r', str(vendor / 'vendored.txt'), | |
| '-t', str(vendor), | |
| ] | |
| pip.main(install_args) | |
| remove_all(vendor.glob('*.dist-info')) | |
| remove_all(vendor.glob('*.egg-info')) | |
| (vendor / '__init__.py').write_text('') | |
| def update_pkg_resources(): | |
| vendor = Path('pkg_resources/_vendor') | |
| install(vendor) | |
| rewrite_packaging(vendor / 'packaging', 'pkg_resources.extern') | |
| def update_setuptools(): | |
| vendor = Path('setuptools/_vendor') | |
| install(vendor) | |
| rewrite_packaging(vendor / 'packaging', 'setuptools.extern') |