diff options
Diffstat (limited to 'pavement.py')
-rw-r--r-- | pavement.py | 84 |
1 files changed, 54 insertions, 30 deletions
diff --git a/pavement.py b/pavement.py index 1ef6a2a5..f255dc9b 100644 --- a/pavement.py +++ b/pavement.py @@ -1,17 +1,21 @@ import re from textwrap import dedent +import sys + from paver.easy import task, path as Path import pip +del sys.path[0] + + def remove_all(paths): for path in paths: path.rmtree() if path.isdir() else path.remove() -def patch_pkg_resources(vendor): - pkg_resources = vendor / 'pkg_resources' +def rewrite_pkg_resources(pkg_resources, new_root): for file in pkg_resources.glob('__init__.py'): text = file.text() text = text.replace(dedent(""" @@ -20,51 +24,71 @@ def patch_pkg_resources(vendor): import packaging.specifiers import packaging.requirements import packaging.markers - """), dedent(""" - from setuptools.extern import appdirs - from setuptools.extern import packaging - __import__('setuptools.extern.packaging.version') - __import__('setuptools.extern.packaging.specifiers') - __import__('setuptools.extern.packaging.requirements') - __import__('setuptools.extern.packaging.markers') + """), dedent(f""" + from {new_root} import appdirs + from {new_root} import packaging + __import__('{new_root}.packaging.version') + __import__('{new_root}.packaging.specifiers') + __import__('{new_root}.packaging.requirements') + __import__('{new_root}.packaging.markers') """), ) text = text.replace(dedent(""" import six from six.moves import urllib, map, filter - """), dedent(""" - from setuptools.extern import six - from setuptools.extern.six import urllib, map, filter + """), dedent(f""" + from {new_root} import six + from {new_root}.six import urllib, map, filter """), ) file.write_text(text) - remove_all(vendor.glob('setuptools/_vendor/pkg_resources/_vendor')) - remove_all(vendor.glob('setuptools/_vendor/pkg_resources/extern')) - remove_all(vendor.glob('setuptools/_vendor/pkg_resources/tests')) + remove_all(pkg_resources.glob('_vendor')) + remove_all(pkg_resources.glob('extern')) + remove_all(pkg_resources.glob('tests')) @task def update_vendored(): - vendor = Path('setuptools/_vendor') - # pip uninstall doesn't support -t, so do it manually - remove_all(vendor.glob('packaging*')) - remove_all(vendor.glob('six*')) - remove_all(vendor.glob('pyparsing*')) - remove_all(vendor.glob('appdirs*')) - remove_all(vendor.glob('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) - packaging = vendor / 'packaging' - for file in packaging.glob('*.py'): - text = file.text() - text = re.sub(r' (pyparsing|six)', r' setuptools.extern.\1', text) - file.write_text(text) - - patch_pkg_resources(vendor) - remove_all(vendor.glob('*.dist-info')) remove_all(vendor.glob('*.egg-info')) + (vendor / '__init__.py').write_text('') + + +def update_setuptools(): + vendor = Path('setuptools/_vendor') + install(vendor) + rewrite_packaging(vendor / 'packaging', 'setuptools.extern') + rewrite_pkg_resources(vendor / 'pkg_resources', 'setuptools.extern') |