From 118edbb2b715c96620b51018c1d28e81f2318053 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Thu, 2 Nov 2017 21:19:39 +0100 Subject: easy_install: add support for installing from wheels Note: wheels are installed as eggs, so each install is self-contained and multiple versions of the same package can be installed at the same time. Limitations: - headers are not supported - resulting egg metadata requirements have their markers stripped --- setuptools/tests/test_wheel.py | 430 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 430 insertions(+) create mode 100644 setuptools/tests/test_wheel.py (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py new file mode 100644 index 00000000..a0c16c53 --- /dev/null +++ b/setuptools/tests/test_wheel.py @@ -0,0 +1,430 @@ +"""wheel tests +""" + +from distutils.sysconfig import get_config_var +from distutils.util import get_platform +import contextlib +import glob +import inspect +import os +import subprocess +import sys + +import pytest + +from pkg_resources import Distribution, PathMetadata, PY_MAJOR +from setuptools.wheel import Wheel + +from .contexts import tempdir +from .files import build_files +from .textwrap import DALS + + +WHEEL_INFO_TESTS = ( + ('invalid.whl', ValueError), + ('simplewheel-2.0-1-py2.py3-none-any.whl', { + 'project_name': 'simplewheel', + 'version': '2.0', + 'build': '1', + 'py_version': 'py2.py3', + 'abi': 'none', + 'platform': 'any', + }), + ('simple.dist-0.1-py2.py3-none-any.whl', { + 'project_name': 'simple.dist', + 'version': '0.1', + 'build': None, + 'py_version': 'py2.py3', + 'abi': 'none', + 'platform': 'any', + }), + ('example_pkg_a-1-py3-none-any.whl', { + 'project_name': 'example_pkg_a', + 'version': '1', + 'build': None, + 'py_version': 'py3', + 'abi': 'none', + 'platform': 'any', + }), + ('PyQt5-5.9-5.9.1-cp35.cp36.cp37-abi3-manylinux1_x86_64.whl', { + 'project_name': 'PyQt5', + 'version': '5.9', + 'build': '5.9.1', + 'py_version': 'cp35.cp36.cp37', + 'abi': 'abi3', + 'platform': 'manylinux1_x86_64', + }), +) + +@pytest.mark.parametrize( + ('filename', 'info'), WHEEL_INFO_TESTS, + ids=[t[0] for t in WHEEL_INFO_TESTS] +) +def test_wheel_info(filename, info): + if inspect.isclass(info): + with pytest.raises(info): + Wheel(filename) + return + w = Wheel(filename) + assert {k: getattr(w, k) for k in info.keys()} == info + + +@contextlib.contextmanager +def build_wheel(extra_file_defs=None, **kwargs): + file_defs = { + 'setup.py': DALS( + ''' + from setuptools import setup + import setuptools + setup(**%r) + ''' + ) % kwargs, + } + if extra_file_defs: + file_defs.update(extra_file_defs) + with tempdir() as source_dir: + build_files(file_defs, source_dir) + subprocess.check_call((sys.executable, 'setup.py', + '-q', 'bdist_wheel'), cwd=source_dir) + yield glob.glob(os.path.join(source_dir, 'dist', '*.whl'))[0] + + +def tree(root): + def depth(path): + return len(path.split(os.path.sep)) + def prefix(path_depth): + if not path_depth: + return '' + return '| ' * (path_depth - 1) + '|-- ' + lines = [] + root_depth = depth(root) + for dirpath, dirnames, filenames in os.walk(root): + dirnames.sort() + filenames.sort() + dir_depth = depth(dirpath) - root_depth + if dir_depth > 0: + lines.append('%s%s/' % (prefix(dir_depth - 1), + os.path.basename(dirpath))) + for f in filenames: + lines.append('%s%s' % (prefix(dir_depth), f)) + return '\n'.join(lines) + '\n' + + +def _check_wheel_install(filename, install_dir, install_tree, + project_name, version, requires_txt): + w = Wheel(filename) + egg_path = os.path.join(install_dir, w.egg_name()) + w.install_as_egg(egg_path) + if install_tree is not None: + install_tree = install_tree.format( + py_version=PY_MAJOR, + platform=get_platform(), + shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO') + ) + assert install_tree == tree(install_dir) + metadata = PathMetadata(egg_path, os.path.join(egg_path, 'EGG-INFO')) + dist = Distribution.from_filename(egg_path, metadata=metadata) + assert dist.project_name == project_name + assert dist.version == version + if requires_txt is None: + assert not dist.has_metadata('requires.txt') + else: + assert requires_txt == dist.get_metadata('requires.txt').lstrip() + + +class Record(object): + + def __init__(self, id, **kwargs): + self._id = id + self._fields = kwargs + + def __repr__(self): + return '%s(**%r)' % (self._id, self._fields) + + +WHEEL_INSTALL_TESTS = ( + + dict( + id='basic', + file_defs={ + 'foo': { + '__init__.py': '' + } + }, + setup_kwargs=dict( + packages=['foo'], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- top_level.txt + |-- foo/ + | |-- __init__.py + ''' + ), + ), + + dict( + id='data', + file_defs={ + 'data.txt': DALS( + ''' + Some data... + ''' + ), + }, + setup_kwargs=dict( + data_files=[('data_dir', ['data.txt'])], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- top_level.txt + |-- data_dir/ + | |-- data.txt + ''' + ), + ), + + dict( + id='extension', + file_defs={ + 'extension.c': DALS( + ''' + #include "Python.h" + + #if PY_MAJOR_VERSION >= 3 + + static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "extension", + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL + }; + + #define INITERROR return NULL + + PyMODINIT_FUNC PyInit_extension(void) + + #else + + #define INITERROR return + + void initextension(void) + + #endif + { + #if PY_MAJOR_VERSION >= 3 + PyObject *module = PyModule_Create(&moduledef); + #else + PyObject *module = Py_InitModule("extension", NULL); + #endif + if (module == NULL) + INITERROR; + #if PY_MAJOR_VERSION >= 3 + return module; + #endif + } + ''' + ), + }, + setup_kwargs=dict( + ext_modules=[ + Record('setuptools.Extension', + name='extension', + sources=['extension.c']) + ], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}-{platform}.egg/ + |-- extension{shlib_ext} + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- top_level.txt + ''' + ), + ), + + dict( + id='header', + file_defs={ + 'header.h': DALS( + ''' + ''' + ), + }, + setup_kwargs=dict( + headers=['header.h'], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- header.h + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- top_level.txt + ''' + ), + ), + + dict( + id='script', + file_defs={ + 'script.py': DALS( + ''' + #/usr/bin/python + print('hello world!') + ''' + ), + 'script.sh': DALS( + ''' + #/bin/sh + echo 'hello world!' + ''' + ), + }, + setup_kwargs=dict( + scripts=['script.py', 'script.sh'], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- top_level.txt + | |-- scripts/ + | | |-- script.py + | | |-- script.sh + ''' + ), + ), + + dict( + id='requires1', + install_requires='foobar==2.0', + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- requires.txt + | |-- top_level.txt + '''), + requires_txt=DALS( + ''' + foobar==2.0 + ''' + ), + ), + + dict( + id='requires2', + install_requires=''' + bar + foo<=2.0; %r in sys_platform + ''' % sys.platform, + requires_txt=DALS( + ''' + bar + foo<=2.0 + ''' + ), + ), + + dict( + id='requires3', + install_requires=''' + bar; %r != sys_platform + ''' % sys.platform, + ), + + dict( + id='requires4', + install_requires=''' + foo + ''', + extras_require={ + 'extra': 'foobar>3', + }, + requires_txt=DALS( + ''' + foo + + [extra] + foobar>3 + ''' + ), + ), + + dict( + id='requires5', + extras_require={ + 'extra': 'foobar; %r != sys_platform' % sys.platform, + }, + requires_txt=DALS( + ''' + [extra] + ''' + ), + ), + +) + +@pytest.mark.parametrize( + 'params', WHEEL_INSTALL_TESTS, + ids=list(params['id'] for params in WHEEL_INSTALL_TESTS), +) +def test_wheel_install(params): + project_name = params.get('name', 'foo') + version = params.get('version', '1.0') + install_requires = params.get('install_requires', []) + extras_require = params.get('extras_require', {}) + requires_txt = params.get('requires_txt', None) + install_tree = params.get('install_tree') + file_defs = params.get('file_defs', {}) + setup_kwargs = params.get('setup_kwargs', {}) + with build_wheel( + name=project_name, + version=version, + install_requires=install_requires, + extras_require=extras_require, + extra_file_defs=file_defs, + **setup_kwargs + ) as filename, tempdir() as install_dir: + _check_wheel_install(filename, install_dir, + install_tree, project_name, + version, requires_txt) -- cgit v1.2.1 From e72afd6243713cd0d3f8a5bc5b50fb59934d7ff8 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Sun, 26 Nov 2017 23:11:14 +0100 Subject: fix encoding handling of wheels metadata --- setuptools/tests/test_wheel.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index a0c16c53..2e857253 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- + """wheel tests """ @@ -72,13 +74,14 @@ def test_wheel_info(filename, info): @contextlib.contextmanager def build_wheel(extra_file_defs=None, **kwargs): file_defs = { - 'setup.py': DALS( + 'setup.py': (DALS( ''' + # -*- coding: utf-8 -*- from setuptools import setup import setuptools setup(**%r) ''' - ) % kwargs, + ) % kwargs).encode('utf-8'), } if extra_file_defs: file_defs.update(extra_file_defs) @@ -170,6 +173,13 @@ WHEEL_INSTALL_TESTS = ( ), ), + dict( + id='utf-8', + setup_kwargs=dict( + description='Description accentuée', + ) + ), + dict( id='data', file_defs={ -- cgit v1.2.1 From da1c78f354fac3ce177e2869828a34b3e6df1820 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 27 Nov 2017 13:25:04 +0100 Subject: fix namespace packages handling of wheels --- setuptools/tests/test_wheel.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index 2e857253..408c3576 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -412,6 +412,38 @@ WHEEL_INSTALL_TESTS = ( ), ), + dict( + id='namespace_package', + file_defs={ + 'foo': { + 'bar': { + '__init__.py': '' + }, + }, + }, + setup_kwargs=dict( + namespace_packages=['foo'], + packages=['foo.bar'], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- foo-1.0-py{py_version}-nspkg.pth + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- namespace_packages.txt + | |-- top_level.txt + |-- foo/ + | |-- __init__.py + | |-- bar/ + | | |-- __init__.py + '''), + ), + ) @pytest.mark.parametrize( -- cgit v1.2.1 From 35c0e9c2d67cbda4033ba0e0b1c20e4df8c24ce7 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Thu, 30 Nov 2017 19:46:16 +0100 Subject: fix `data_files` handling when installing from wheel --- setuptools/tests/test_wheel.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index 408c3576..b6be6f1f 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -444,6 +444,42 @@ WHEEL_INSTALL_TESTS = ( '''), ), + dict( + id='data_in_package', + file_defs={ + 'foo': { + '__init__.py': '', + 'data_dir': { + 'data.txt': DALS( + ''' + Some data... + ''' + ), + } + } + }, + setup_kwargs=dict( + packages=['foo'], + data_files=[('foo/data_dir', ['foo/data_dir/data.txt'])], + ), + install_tree=DALS( + ''' + foo-1.0-py{py_version}.egg/ + |-- EGG-INFO/ + | |-- DESCRIPTION.rst + | |-- PKG-INFO + | |-- RECORD + | |-- WHEEL + | |-- metadata.json + | |-- top_level.txt + |-- foo/ + | |-- __init__.py + | |-- data_dir/ + | | |-- data.txt + ''' + ), + ), + ) @pytest.mark.parametrize( -- cgit v1.2.1 From 41882016dbd6b334e6e10e2c3ac5afb9f5793ede Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Fri, 6 Apr 2018 17:07:44 -0400 Subject: Update wheel tests to reflect latest version --- setuptools/tests/test_wheel.py | 16 ---------------- 1 file changed, 16 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index b6be6f1f..d8d5ddb2 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -161,11 +161,9 @@ WHEEL_INSTALL_TESTS = ( ''' foo-1.0-py{py_version}.egg/ |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- top_level.txt |-- foo/ | |-- __init__.py @@ -196,11 +194,9 @@ WHEEL_INSTALL_TESTS = ( ''' foo-1.0-py{py_version}.egg/ |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- top_level.txt |-- data_dir/ | |-- data.txt @@ -267,11 +263,9 @@ WHEEL_INSTALL_TESTS = ( foo-1.0-py{py_version}-{platform}.egg/ |-- extension{shlib_ext} |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- top_level.txt ''' ), @@ -293,11 +287,9 @@ WHEEL_INSTALL_TESTS = ( foo-1.0-py{py_version}.egg/ |-- header.h |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- top_level.txt ''' ), @@ -326,11 +318,9 @@ WHEEL_INSTALL_TESTS = ( ''' foo-1.0-py{py_version}.egg/ |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- top_level.txt | |-- scripts/ | | |-- script.py @@ -346,11 +336,9 @@ WHEEL_INSTALL_TESTS = ( ''' foo-1.0-py{py_version}.egg/ |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- requires.txt | |-- top_level.txt '''), @@ -430,11 +418,9 @@ WHEEL_INSTALL_TESTS = ( foo-1.0-py{py_version}.egg/ |-- foo-1.0-py{py_version}-nspkg.pth |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- namespace_packages.txt | |-- top_level.txt |-- foo/ @@ -466,11 +452,9 @@ WHEEL_INSTALL_TESTS = ( ''' foo-1.0-py{py_version}.egg/ |-- EGG-INFO/ - | |-- DESCRIPTION.rst | |-- PKG-INFO | |-- RECORD | |-- WHEEL - | |-- metadata.json | |-- top_level.txt |-- foo/ | |-- __init__.py -- cgit v1.2.1 From ed3762fc7d16174a54b2fa83af1996decafd756f Mon Sep 17 00:00:00 2001 From: Paul Ganssle Date: Sat, 7 Apr 2018 13:38:31 -0400 Subject: Switch test_wheel over to subset-based test This is both compatible with the old version of wheel (last one supported under Python 3.3) and is more in line with our commitment, which is that the wheel install provides at least these files. --- setuptools/tests/test_wheel.py | 268 ++++++++++++++++++++++------------------- 1 file changed, 142 insertions(+), 126 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index d8d5ddb2..150ac4c1 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -92,39 +92,49 @@ def build_wheel(extra_file_defs=None, **kwargs): yield glob.glob(os.path.join(source_dir, 'dist', '*.whl'))[0] -def tree(root): - def depth(path): - return len(path.split(os.path.sep)) - def prefix(path_depth): - if not path_depth: - return '' - return '| ' * (path_depth - 1) + '|-- ' - lines = [] - root_depth = depth(root) +def tree_set(root): + contents = set() for dirpath, dirnames, filenames in os.walk(root): - dirnames.sort() - filenames.sort() - dir_depth = depth(dirpath) - root_depth - if dir_depth > 0: - lines.append('%s%s/' % (prefix(dir_depth - 1), - os.path.basename(dirpath))) - for f in filenames: - lines.append('%s%s' % (prefix(dir_depth), f)) - return '\n'.join(lines) + '\n' - - -def _check_wheel_install(filename, install_dir, install_tree, + for filename in filenames: + contents.add(os.path.join(os.path.relpath(dirpath, root), + filename)) + return contents + + +def flatten_tree(tree): + """Flatten nested dicts and lists into a full list of paths""" + output = set() + for node, contents in tree.items(): + if isinstance(contents, dict): + contents = flatten_tree(contents) + + for elem in contents: + if isinstance(elem, dict): + output |= {os.path.join(node, val) + for val in flatten_tree(elem)} + else: + output.add(os.path.join(node, elem)) + return output + + +def format_install_tree(tree): + return {x.format( + py_version=PY_MAJOR, + platform=get_platform(), + shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO')) + for x in tree} + + +def _check_wheel_install(filename, install_dir, install_tree_includes, project_name, version, requires_txt): w = Wheel(filename) egg_path = os.path.join(install_dir, w.egg_name()) w.install_as_egg(egg_path) - if install_tree is not None: - install_tree = install_tree.format( - py_version=PY_MAJOR, - platform=get_platform(), - shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO') - ) - assert install_tree == tree(install_dir) + if install_tree_includes is not None: + install_tree = format_install_tree(install_tree_includes) + exp = tree_set(install_dir) + assert install_tree.issubset(exp), (install_tree - exp) + metadata = PathMetadata(egg_path, os.path.join(egg_path, 'EGG-INFO')) dist = Distribution.from_filename(egg_path, metadata=metadata) assert dist.project_name == project_name @@ -157,18 +167,17 @@ WHEEL_INSTALL_TESTS = ( setup_kwargs=dict( packages=['foo'], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- top_level.txt - |-- foo/ - | |-- __init__.py - ''' - ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': { + 'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'top_level.txt' + ], + 'foo': ['__init__.py'] + } + }), ), dict( @@ -190,18 +199,19 @@ WHEEL_INSTALL_TESTS = ( setup_kwargs=dict( data_files=[('data_dir', ['data.txt'])], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- top_level.txt - |-- data_dir/ - | |-- data.txt - ''' - ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': { + 'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'top_level.txt' + ], + 'data_dir': [ + 'data.txt' + ] + } + }), ), dict( @@ -258,17 +268,17 @@ WHEEL_INSTALL_TESTS = ( sources=['extension.c']) ], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}-{platform}.egg/ - |-- extension{shlib_ext} - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- top_level.txt - ''' - ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}-{platform}.egg': [ + 'extension{shlib_ext}', + {'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'top_level.txt', + ]}, + ] + }), ), dict( @@ -282,17 +292,17 @@ WHEEL_INSTALL_TESTS = ( setup_kwargs=dict( headers=['header.h'], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- header.h - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- top_level.txt - ''' - ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': [ + 'header.h', + {'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'top_level.txt', + ]}, + ] + }), ), dict( @@ -314,34 +324,37 @@ WHEEL_INSTALL_TESTS = ( setup_kwargs=dict( scripts=['script.py', 'script.sh'], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- top_level.txt - | |-- scripts/ - | | |-- script.py - | | |-- script.sh - ''' - ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': { + 'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'top_level.txt', + {'scripts': [ + 'script.py', + 'script.sh' + ]} + + ] + } + }) ), dict( id='requires1', install_requires='foobar==2.0', - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- requires.txt - | |-- top_level.txt - '''), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': { + 'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'requires.txt', + 'top_level.txt', + ] + } + }), requires_txt=DALS( ''' foobar==2.0 @@ -413,21 +426,22 @@ WHEEL_INSTALL_TESTS = ( namespace_packages=['foo'], packages=['foo.bar'], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- foo-1.0-py{py_version}-nspkg.pth - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- namespace_packages.txt - | |-- top_level.txt - |-- foo/ - | |-- __init__.py - | |-- bar/ - | | |-- __init__.py - '''), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': [ + 'foo-1.0-py{py_version}-nspkg.pth', + {'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'namespace_packages.txt', + 'top_level.txt', + ]}, + {'foo': [ + '__init__.py', + {'bar': ['__init__.py']}, + ]}, + ] + }), ), dict( @@ -448,20 +462,22 @@ WHEEL_INSTALL_TESTS = ( packages=['foo'], data_files=[('foo/data_dir', ['foo/data_dir/data.txt'])], ), - install_tree=DALS( - ''' - foo-1.0-py{py_version}.egg/ - |-- EGG-INFO/ - | |-- PKG-INFO - | |-- RECORD - | |-- WHEEL - | |-- top_level.txt - |-- foo/ - | |-- __init__.py - | |-- data_dir/ - | | |-- data.txt - ''' - ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': { + 'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'top_level.txt', + ], + 'foo': [ + '__init__.py', + {'data_dir': [ + 'data.txt', + ]} + ] + } + }), ), ) -- cgit v1.2.1 From 593b409fb66efcabe046e240a868b7dbcf1fc01b Mon Sep 17 00:00:00 2001 From: Arnon Yaari Date: Mon, 14 May 2018 17:10:29 +0300 Subject: Use canonicalize_name to look for .dist-info in wheel files Fixes issue #1350 --- setuptools/tests/test_wheel.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index 150ac4c1..cf650868 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -9,12 +9,15 @@ import contextlib import glob import inspect import os +import shutil import subprocess import sys +import zipfile import pytest from pkg_resources import Distribution, PathMetadata, PY_MAJOR +from setuptools.extern.packaging.utils import canonicalize_name from setuptools.wheel import Wheel from .contexts import tempdir @@ -506,3 +509,33 @@ def test_wheel_install(params): _check_wheel_install(filename, install_dir, install_tree, project_name, version, requires_txt) + + +def test_wheel_install_pep_503(): + project_name = 'Foo_Bar' # PEP 503 canonicalized name is "foo-bar" + version = '1.0' + with build_wheel( + name=project_name, + version=version, + ) as filename, tempdir() as install_dir: + new_filename = filename.replace(project_name, + canonicalize_name(project_name)) + shutil.move(filename, new_filename) + _check_wheel_install(new_filename, install_dir, None, + canonicalize_name(project_name), + version, None) + + +def test_wheel_no_dist_dir(): + project_name = 'nodistinfo' + version = '1.0' + wheel_name = '{0}-{1}-py2.py3-none-any.whl'.format(project_name, version) + with tempdir() as source_dir: + wheel_path = os.path.join(source_dir, wheel_name) + # create an empty zip file + zipfile.ZipFile(wheel_path, 'w').close() + with tempdir() as install_dir: + with pytest.raises(ValueError): + _check_wheel_install(wheel_path, install_dir, None, + project_name, + version, None) -- cgit v1.2.1 From cca86c7f1d4040834c3265ccecdd9e21b4036df5 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 3 Jun 2018 09:50:25 -0400 Subject: Use Python 3 syntax for new-style clasess --- setuptools/tests/test_wheel.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index cf650868..6db5fa11 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -24,6 +24,8 @@ from .contexts import tempdir from .files import build_files from .textwrap import DALS +__metaclass__ = type + WHEEL_INFO_TESTS = ( ('invalid.whl', ValueError), @@ -148,7 +150,7 @@ def _check_wheel_install(filename, install_dir, install_tree_includes, assert requires_txt == dist.get_metadata('requires.txt').lstrip() -class Record(object): +class Record: def __init__(self, id, **kwargs): self._id = id -- cgit v1.2.1 From 5cd86987530892bfb01f68ad5f1a2b997a3d01e7 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 26 Jan 2019 20:20:12 -0500 Subject: Feed the hobgoblins (delint). --- setuptools/tests/test_wheel.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index 6db5fa11..e85a4a7e 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -63,6 +63,7 @@ WHEEL_INFO_TESTS = ( }), ) + @pytest.mark.parametrize( ('filename', 'info'), WHEEL_INFO_TESTS, ids=[t[0] for t in WHEEL_INFO_TESTS] @@ -487,6 +488,7 @@ WHEEL_INSTALL_TESTS = ( ) + @pytest.mark.parametrize( 'params', WHEEL_INSTALL_TESTS, ids=list(params['id'] for params in WHEEL_INSTALL_TESTS), -- cgit v1.2.1 From 16a3ef93fc66373f6c5f4da12303dd111403fcb1 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 17 Sep 2018 23:40:12 +0200 Subject: wheel: fix installation of empty namespace package --- setuptools/tests/test_wheel.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index e85a4a7e..d50816c2 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -450,6 +450,34 @@ WHEEL_INSTALL_TESTS = ( }), ), + dict( + id='empty_namespace_package', + file_defs={ + 'foobar': { + '__init__.py': "__import__('pkg_resources').declare_namespace(__name__)", + }, + }, + setup_kwargs=dict( + namespace_packages=['foobar'], + packages=['foobar'], + ), + install_tree=flatten_tree({ + 'foo-1.0-py{py_version}.egg': [ + 'foo-1.0-py{py_version}-nspkg.pth', + {'EGG-INFO': [ + 'PKG-INFO', + 'RECORD', + 'WHEEL', + 'namespace_packages.txt', + 'top_level.txt', + ]}, + {'foobar': [ + '__init__.py', + ]}, + ] + }), + ), + dict( id='data_in_package', file_defs={ -- cgit v1.2.1 From 926c80f5e84823f48103f3695f55f23949cc5d37 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Mon, 25 Nov 2019 11:24:10 +0100 Subject: wheel: fix `is_compatible` implementation --- setuptools/tests/test_wheel.py | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index d50816c2..55d346c6 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -18,6 +18,7 @@ import pytest from pkg_resources import Distribution, PathMetadata, PY_MAJOR from setuptools.extern.packaging.utils import canonicalize_name +from setuptools.extern.packaging.tags import parse_tag from setuptools.wheel import Wheel from .contexts import tempdir @@ -571,3 +572,11 @@ def test_wheel_no_dist_dir(): _check_wheel_install(wheel_path, install_dir, None, project_name, version, None) + + +def test_wheel_is_compatible(monkeypatch): + def sys_tags(): + for t in parse_tag('cp36-cp36m-manylinux1_x86_64'): + yield t + monkeypatch.setattr('setuptools.wheel.sys_tags', sys_tags) + assert Wheel('onnxruntime-0.1.2-cp36-cp36m-manylinux1_x86_64.whl').is_compatible() -- cgit v1.2.1 From 3d4d8b9dde61b87271861b8c7ebeb168ac4fa72b Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 19 Jan 2020 12:46:30 -0500 Subject: =?UTF-8?q?=F0=9F=91=B9=20Feed=20the=20hobgoblins=20(delint).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setuptools/tests/test_wheel.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index 55d346c6..39eb06ee 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -455,7 +455,8 @@ WHEEL_INSTALL_TESTS = ( id='empty_namespace_package', file_defs={ 'foobar': { - '__init__.py': "__import__('pkg_resources').declare_namespace(__name__)", + '__init__.py': + "__import__('pkg_resources').declare_namespace(__name__)", }, }, setup_kwargs=dict( @@ -579,4 +580,5 @@ def test_wheel_is_compatible(monkeypatch): for t in parse_tag('cp36-cp36m-manylinux1_x86_64'): yield t monkeypatch.setattr('setuptools.wheel.sys_tags', sys_tags) - assert Wheel('onnxruntime-0.1.2-cp36-cp36m-manylinux1_x86_64.whl').is_compatible() + assert Wheel( + 'onnxruntime-0.1.2-cp36-cp36m-manylinux1_x86_64.whl').is_compatible() -- cgit v1.2.1 From 5ce9e5f343ca14f9875106f37f16ad498b294183 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 19 Jan 2020 13:25:45 -0500 Subject: =?UTF-8?q?=F0=9F=91=B9=20Feed=20the=20hobgoblins=20(delint).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- setuptools/tests/test_wheel.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index 39eb06ee..f72ccbbf 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -125,11 +125,12 @@ def flatten_tree(tree): def format_install_tree(tree): - return {x.format( - py_version=PY_MAJOR, - platform=get_platform(), - shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO')) - for x in tree} + return { + x.format( + py_version=PY_MAJOR, + platform=get_platform(), + shlib_ext=get_config_var('EXT_SUFFIX') or get_config_var('SO')) + for x in tree} def _check_wheel_install(filename, install_dir, install_tree_includes, -- cgit v1.2.1 From fb7ab81a3d080422687bad71f9ae9d36eeefbee2 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sun, 16 Aug 2020 00:29:24 -0400 Subject: Remove Python 2 compatibility --- setuptools/tests/test_wheel.py | 2 -- 1 file changed, 2 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index f72ccbbf..e56eac14 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -25,8 +25,6 @@ from .contexts import tempdir from .files import build_files from .textwrap import DALS -__metaclass__ = type - WHEEL_INFO_TESTS = ( ('invalid.whl', ValueError), -- cgit v1.2.1 From 5c57b5cc1e1d247fec64858d8cc4e93b5ffb11a3 Mon Sep 17 00:00:00 2001 From: "Jason R. Coombs" Date: Sat, 20 Feb 2021 12:31:39 -0500 Subject: Switch to jaraco.path for building files --- setuptools/tests/test_wheel.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'setuptools/tests/test_wheel.py') diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py index e56eac14..7345b135 100644 --- a/setuptools/tests/test_wheel.py +++ b/setuptools/tests/test_wheel.py @@ -15,6 +15,7 @@ import sys import zipfile import pytest +from jaraco import path from pkg_resources import Distribution, PathMetadata, PY_MAJOR from setuptools.extern.packaging.utils import canonicalize_name @@ -22,7 +23,6 @@ from setuptools.extern.packaging.tags import parse_tag from setuptools.wheel import Wheel from .contexts import tempdir -from .files import build_files from .textwrap import DALS @@ -91,7 +91,7 @@ def build_wheel(extra_file_defs=None, **kwargs): if extra_file_defs: file_defs.update(extra_file_defs) with tempdir() as source_dir: - build_files(file_defs, source_dir) + path.build(file_defs, source_dir) subprocess.check_call((sys.executable, 'setup.py', '-q', 'bdist_wheel'), cwd=source_dir) yield glob.glob(os.path.join(source_dir, 'dist', '*.whl'))[0] -- cgit v1.2.1