Commit bb0ac205 authored by Reinout van Rees's avatar Reinout van Rees Committed by GitHub

Merge pull request #428 from buildout/reinout-wheel-via-setuptools

Install wheels via setuptools, fixes #425
parents e2f9963a d36999fd
...@@ -4,7 +4,16 @@ Change History ...@@ -4,7 +4,16 @@ Change History
2.9.7 (unreleased) 2.9.7 (unreleased)
================== ==================
- Nothing changed yet. - Setuptools 38.2.0 started supporting wheels. Through setuptools, buildout
now also supports wheels! You need at least version 38.2.3 to get proper
namespace support.
This setuptools change interfered with buildout's recent support for
`buildout.wheel <https://github.com/buildout/buildout.wheel>`_, resulting in
a sudden "Wheels are not supported" error message (see `issue 435
<https://github.com/buildout/buildout/issues/425>`_). Fixed by making
setuptools the default, though you can still use the buildout.wheel if you
want.
2.9.6 (2017-12-01) 2.9.6 (2017-12-01)
......
...@@ -37,6 +37,16 @@ import tempfile ...@@ -37,6 +37,16 @@ import tempfile
import zc.buildout import zc.buildout
import warnings import warnings
try:
from setuptools.wheel import Wheel # This is the important import
from setuptools import __version__ as setuptools_version
# Now we need to check if we have at least 38.2.3 for namespace support.
SETUPTOOLS_SUPPORTS_WHEELS = (
pkg_resources.SetuptoolsVersion(setuptools_version) >=
pkg_resources.SetuptoolsVersion('38.2.3'))
except ImportError:
SETUPTOOLS_SUPPORTS_WHEELS = False
warnings.filterwarnings( warnings.filterwarnings(
'ignore', '.+is being parsed as a legacy, non PEP 440, version') 'ignore', '.+is being parsed as a legacy, non PEP 440, version')
...@@ -83,9 +93,6 @@ setuptools_path = buildout_and_setuptools_path ...@@ -83,9 +93,6 @@ setuptools_path = buildout_and_setuptools_path
FILE_SCHEME = re.compile('file://', re.I).match FILE_SCHEME = re.compile('file://', re.I).match
DUNDER_FILE_PATTERN = re.compile(r"__file__ = '(?P<filename>.+)'$") DUNDER_FILE_PATTERN = re.compile(r"__file__ = '(?P<filename>.+)'$")
def wheel_to_egg(dist, dest):
raise zc.buildout.UserError("Wheels are not supported")
class _Monkey(object): class _Monkey(object):
def __init__(self, module, **kw): def __init__(self, module, **kw):
mdict = self._mdict = module.__dict__ mdict = self._mdict = module.__dict__
...@@ -1619,25 +1626,19 @@ def unpack_egg(location, dest): ...@@ -1619,25 +1626,19 @@ def unpack_egg(location, dest):
setuptools.archive_util.unpack_archive(location, dest) setuptools.archive_util.unpack_archive(location, dest)
WHEEL_TO_EGG_WARNING = """ WHEEL_WARNING = """
Using unpack_wheel() shim over the deprecated wheel_to_egg() hook. *.whl file detected (%s), you'll need setuptools >= 38.2.3 for that
Please update your wheel extension implementation for one that installs a .whl or an extension like buildout.wheel > 0.2.0.
handler in %s.UNPACKERS """
""".strip() % (__name__,)
def unpack_wheel(location, dest): def unpack_wheel(location, dest):
# Deprecated backward compatibility shim. Please do not use. if SETUPTOOLS_SUPPORTS_WHEELS:
logger.warning(WHEEL_TO_EGG_WARNING) wheel = Wheel(location)
basename = os.path.basename(location) wheel.install_as_egg(os.path.join(dest, wheel.egg_name()))
dists = setuptools.package_index.distros_for_location(location, basename) else:
# `wheel_to_egg()` might generate zipped eggs, so we have to make sure we raise zc.buildout.UserError(WHEEL_WARNING % location)
# get unpacked eggs in the end:
tmp_dest = tempfile.mkdtemp(dir=dest)
wheel_to_egg(list(dists)[0], tmp_dest)
[egg] = glob.glob(os.path.join(tmp_dest, '*.egg'))
unpack_egg(egg, dest)
shutil.rmtree(tmp_dest)
UNPACKERS = { UNPACKERS = {
'.egg': unpack_egg, '.egg': unpack_egg,
......
...@@ -3144,52 +3144,6 @@ def test_buildout_doesnt_keep_adding_itself_to_versions(): ...@@ -3144,52 +3144,6 @@ def test_buildout_doesnt_keep_adding_itself_to_versions():
if sys.platform == 'win32': if sys.platform == 'win32':
del buildout_honors_umask # umask on dohs is academic del buildout_honors_umask # umask on dohs is academic
class UnitTests(unittest.TestCase):
@property
def globs(self):
return self.__dict__
def setUp(self):
easy_install_SetUp(self)
import setuptools.package_index
setuptools.package_index.EXTENSIONS.append('.whl')
import zc.buildout.easy_install
self.orig_wheel_to_egg = zc.buildout.easy_install.wheel_to_egg
def tearDown(self):
import zc.buildout.easy_install
zc.buildout.testing.buildoutTearDown(self)
import setuptools.package_index
setuptools.package_index.EXTENSIONS.remove('.whl')
zc.buildout.easy_install.wheel_to_egg = self.orig_wheel_to_egg
def test_wheel_to_egg(self):
[egg_name] = [n for n in os.listdir(self.sample_eggs)
if n.startswith('demo-0.3-')]
path = os.path.join(self.sample_eggs, egg_name)
os.rename(path, os.path.join(self.sample_eggs, 'demo-0.3.whl'))
import zc.buildout.easy_install
installer = zc.buildout.easy_install.Installer(
os.path.join(self.sample_buildout, 'eggs'),
index = self.sample_eggs)
# Can't install because the original hook is in place:
with self.assertRaises(zc.buildout.UserError):
installer.install(['demo'])
def wheel_to_egg(dist, dest):
newloc = os.path.join(dest, egg_name)
shutil.copy(dist.location, newloc)
return pkg_resources.Distribution.from_filename(newloc)
zc.buildout.easy_install.wheel_to_egg = wheel_to_egg
egg_dir = os.path.join(self.sample_buildout, 'eggs')
self.assertFalse(egg_name in os.listdir(egg_dir))
installer.install(['demo'])
self.assertTrue(egg_name in os.listdir(egg_dir))
###################################################################### ######################################################################
def create_sample_eggs(test, executable=sys.executable): def create_sample_eggs(test, executable=sys.executable):
...@@ -3769,7 +3723,6 @@ def test_suite(): ...@@ -3769,7 +3723,6 @@ def test_suite():
]) ])
), ),
doctest.DocFileSuite('testing_bugfix.txt'), doctest.DocFileSuite('testing_bugfix.txt'),
unittest.makeSuite(UnitTests),
] ]
docdir = os.path.join(ancestor(__file__, 4), 'doc') docdir = os.path.join(ancestor(__file__, 4), 'doc')
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment