aboutsummaryrefslogtreecommitdiffstats
path: root/setuptools/tests/test_easy_install.py
diff options
context:
space:
mode:
Diffstat (limited to 'setuptools/tests/test_easy_install.py')
-rw-r--r--setuptools/tests/test_easy_install.py141
1 files changed, 103 insertions, 38 deletions
diff --git a/setuptools/tests/test_easy_install.py b/setuptools/tests/test_easy_install.py
index a90ae23f..8c797d55 100644
--- a/setuptools/tests/test_easy_install.py
+++ b/setuptools/tests/test_easy_install.py
@@ -19,8 +19,10 @@ from setuptools.command.easy_install import (
from setuptools.command.easy_install import PthDistributions
from setuptools.command import easy_install as easy_install_pkg
from setuptools.dist import Distribution
+from pkg_resources import working_set, VersionConflict
from pkg_resources import Distribution as PRDistribution
import setuptools.tests.server
+import pkg_resources
class FakeDist(object):
def get_entry_map(self, group):
@@ -230,47 +232,15 @@ class TestUserInstallTest(unittest.TestCase):
SandboxViolation.
"""
- test_setup_attrs = {
- 'name': 'test_pkg', 'version': '0.0',
- 'setup_requires': ['foobar'],
- 'dependency_links': [os.path.abspath(self.dir)]
- }
-
- test_pkg = os.path.join(self.dir, 'test_pkg')
+ test_pkg = create_setup_requires_package(self.dir)
test_setup_py = os.path.join(test_pkg, 'setup.py')
- os.mkdir(test_pkg)
-
- f = open(test_setup_py, 'w')
- f.write(textwrap.dedent("""\
- import setuptools
- setuptools.setup(**%r)
- """ % test_setup_attrs))
- f.close()
- foobar_path = os.path.join(self.dir, 'foobar-0.1.tar.gz')
- make_trivial_sdist(
- foobar_path,
- textwrap.dedent("""\
- import setuptools
- setuptools.setup(
- name='foobar',
- version='0.1'
- )
- """))
-
- old_stdout = sys.stdout
- old_stderr = sys.stderr
- sys.stdout = StringIO()
- sys.stderr = StringIO()
try:
- try:
+ with quiet_context():
with reset_setup_stop_context():
run_setup(test_setup_py, ['install'])
- except SandboxViolation:
- self.fail('Installation caused SandboxViolation')
- finally:
- sys.stdout = old_stdout
- sys.stderr = old_stderr
+ except SandboxViolation:
+ self.fail('Installation caused SandboxViolation')
class TestSetupRequires(unittest.TestCase):
@@ -290,8 +260,10 @@ class TestSetupRequires(unittest.TestCase):
# Some platforms (Jython) don't find a port to which to bind,
# so skip this test for them.
return
- # create an sdist that has a build-time dependency.
- with TestSetupRequires.create_sdist() as dist_file:
+ with quiet_context():
+ # TODO: correct indentation here
+ # create an sdist that has a build-time dependency.
+ with TestSetupRequires.create_sdist() as dist_file:
with tempdir_context() as temp_install_dir:
with environment_context(PYTHONPATH=temp_install_dir):
ei_params = ['--index-url', p_index.url,
@@ -330,6 +302,81 @@ class TestSetupRequires(unittest.TestCase):
""").lstrip())
yield dist_path
+ def test_setup_requires_overrides_version_conflict(self):
+ """
+ Regression test for issue #323.
+
+ Ensures that a distribution's setup_requires requirements can still be
+ installed and used locally even if a conflicting version of that
+ requirement is already on the path.
+ """
+
+ pr_state = pkg_resources.__getstate__()
+ fake_dist = PRDistribution('does-not-matter', project_name='foobar',
+ version='0.0')
+ working_set.add(fake_dist)
+
+ def setup_and_run(temp_dir):
+ test_pkg = create_setup_requires_package(temp_dir)
+ test_setup_py = os.path.join(test_pkg, 'setup.py')
+ try:
+ stdout, stderr = quiet_context(
+ lambda: reset_setup_stop_context(
+ # Don't even need to install the package, just running
+ # the setup.py at all is sufficient
+ lambda: run_setup(test_setup_py, ['--name'])
+ ))
+ except VersionConflict:
+ self.fail('Installing setup.py requirements caused '
+ 'VersionConflict')
+
+ lines = stdout.splitlines()
+ self.assertTrue(len(lines) > 0)
+ self.assertTrue(lines[-1].strip(), 'test_pkg')
+
+ try:
+ tempdir_context(setup_and_run)
+ finally:
+ pkg_resources.__setstate__(pr_state)
+
+
+def create_setup_requires_package(path):
+ """Creates a source tree under path for a trivial test package that has a
+ single requirement in setup_requires--a tarball for that requirement is
+ also created and added to the dependency_links argument.
+ """
+
+ test_setup_attrs = {
+ 'name': 'test_pkg', 'version': '0.0',
+ 'setup_requires': ['foobar==0.1'],
+ 'dependency_links': [os.path.abspath(path)]
+ }
+
+ test_pkg = os.path.join(path, 'test_pkg')
+ test_setup_py = os.path.join(test_pkg, 'setup.py')
+ test_setup_cfg = os.path.join(test_pkg, 'setup.cfg')
+ os.mkdir(test_pkg)
+
+ f = open(test_setup_py, 'w')
+ f.write(textwrap.dedent("""\
+ import setuptools
+ setuptools.setup(**%r)
+ """ % test_setup_attrs))
+ f.close()
+
+ foobar_path = os.path.join(path, 'foobar-0.1.tar.gz')
+ make_trivial_sdist(
+ foobar_path,
+ textwrap.dedent("""\
+ import setuptools
+ setuptools.setup(
+ name='foobar',
+ version='0.1'
+ )
+ """))
+
+ return test_pkg
+
def make_trivial_sdist(dist_path, setup_py):
"""Create a simple sdist tarball at dist_path, containing just a
@@ -392,3 +439,21 @@ def reset_setup_stop_context():
distutils.core._setup_stop_after = None
yield
distutils.core._setup_stop_after = setup_stop_after
+
+
+@contextlib.contextmanager
+def quiet_context():
+ """
+ Redirect stdout/stderr to StringIO objects to prevent console output from
+ distutils commands.
+ """
+
+ old_stdout = sys.stdout
+ old_stderr = sys.stderr
+ new_stdout = sys.stdout = StringIO.StringIO()
+ new_stderr = sys.stderr = StringIO.StringIO()
+ try:
+ yield new_stdout, new_stderr
+ finally:
+ sys.stdout = old_stdout
+ sys.stderr = old_stderr