Refactor tests.lib

* Move virtualenv creation out of TestPipEnvironment
* Remove global state and force explicit use of TestPipEnvironment
  instances
* Remove "backup" virtualenv copying and instead create new
  virtual environments each time.
* Remove the monkeypatched "PyPICache" functionality
* Remove things that were not being used anymore and were dead
  weight
* Remove sitecustomize support which was primarily used to
  monkeypatch the "PyPICache" but was used in one or two other
  tests.
This commit is contained in:
Donald Stufft 2013-08-21 05:16:07 -04:00
parent 30934fede2
commit 9894c8baac
30 changed files with 958 additions and 1366 deletions

View File

@ -2,7 +2,7 @@ import zipfile
import textwrap
from os.path import abspath, exists, join
from pip.download import path_to_url2
from tests.lib import tests_data, reset_env, run_pip, write_file
from tests.lib import tests_data, reset_env
from tests.lib.path import Path
from tests.lib.local_repos import local_checkout
@ -14,16 +14,16 @@ def test_create_bundle():
index (pip itself).
"""
env = reset_env()
script = reset_env()
fspkg = path_to_url2(Path(tests_data)/'packages'/'FSPkg')
run_pip('install', '-e', fspkg)
script.pip('install', '-e', fspkg)
pkg_lines = textwrap.dedent('''\
-e %s
-e %s#egg=initools-dev
pip''' % (fspkg, local_checkout('svn+http://svn.colorstudy.com/INITools/trunk')))
write_file('bundle-req.txt', pkg_lines)
script.scratch_path.join("bundle-req.txt").write(pkg_lines)
# Create a bundle in env.scratch_path/ test.pybundle
result = run_pip('bundle', '-r', env.scratch_path/ 'bundle-req.txt', env.scratch_path/ 'test.pybundle')
result = script.pip('bundle', '-r', script.scratch_path/ 'bundle-req.txt', script.scratch_path/ 'test.pybundle')
bundle = result.files_after.get(join('scratch', 'test.pybundle'), None)
assert bundle is not None
@ -38,15 +38,15 @@ def test_cleanup_after_create_bundle():
Test clean up after making a bundle. Make sure (build|src)-bundle/ dirs are removed but not src/.
"""
env = reset_env()
script = reset_env()
# Install an editable to create a src/ dir.
args = ['install']
args.extend(['-e',
'%s#egg=pip-test-package' %
local_checkout('git+http://github.com/pypa/pip-test-package.git')])
run_pip(*args)
build = env.venv_path/"build"
src = env.venv_path/"src"
script.pip(*args)
build = script.venv_path/"build"
src = script.venv_path/"src"
assert not exists(build), "build/ dir still exists: %s" % build
assert exists(src), "expected src/ dir doesn't exist: %s" % src
@ -56,13 +56,13 @@ def test_cleanup_after_create_bundle():
-e %s
-e %s#egg=initools-dev
pip''' % (fspkg, local_checkout('svn+http://svn.colorstudy.com/INITools/trunk')))
write_file('bundle-req.txt', pkg_lines)
run_pip('bundle', '-r', 'bundle-req.txt', 'test.pybundle')
build_bundle = env.scratch_path/"build-bundle"
src_bundle = env.scratch_path/"src-bundle"
script.scratch_path.join("bundle-req.txt").write(pkg_lines)
script.pip('bundle', '-r', 'bundle-req.txt', 'test.pybundle')
build_bundle = script.scratch_path/"build-bundle"
src_bundle = script.scratch_path/"src-bundle"
assert not exists(build_bundle), "build-bundle/ dir still exists: %s" % build_bundle
assert not exists(src_bundle), "src-bundle/ dir still exists: %s" % src_bundle
env.assert_no_temp()
script.assert_no_temp()
# Make sure previously created src/ from editable still exists
assert exists(src), "expected src dir doesn't exist: %s" % src

View File

@ -1,12 +1,12 @@
import os
from tests.lib import reset_env, run_pip, get_env
from tests.lib import reset_env
def test_completion_for_bash():
"""
Test getting completion for bash shell
"""
reset_env()
script = reset_env()
bash_completion = """\
_pip_completion()
{
@ -16,7 +16,7 @@ _pip_completion()
}
complete -o default -F _pip_completion pip"""
result = run_pip('completion', '--bash')
result = script.pip('completion', '--bash')
assert bash_completion in result.stdout, 'bash completion is wrong'
@ -24,7 +24,7 @@ def test_completion_for_zsh():
"""
Test getting completion for zsh shell
"""
reset_env()
script = reset_env()
zsh_completion = """\
function _pip_completion {
local words cword
@ -36,7 +36,7 @@ function _pip_completion {
}
compctl -K _pip_completion pip"""
result = run_pip('completion', '--zsh')
result = script.pip('completion', '--zsh')
assert zsh_completion in result.stdout, 'zsh completion is wrong'
@ -44,9 +44,9 @@ def test_completion_for_unknown_shell():
"""
Test getting completion for an unknown shell
"""
reset_env()
script = reset_env()
error_msg = 'no such option: --myfooshell'
result = run_pip('completion', '--myfooshell', expect_error=True)
result = script.pip('completion', '--myfooshell', expect_error=True)
assert error_msg in result.stderr, 'tests for an unknown shell failed'
@ -54,25 +54,24 @@ def test_completion_alone():
"""
Test getting completion for none shell, just pip completion
"""
reset_env()
result = run_pip('completion', expect_error=True)
script = reset_env()
result = script.pip('completion', expect_error=True)
assert 'ERROR: You must pass --bash or --zsh' in result.stderr, \
'completion alone failed -- ' + result.stderr
def setup_completion(words, cword):
environ = os.environ.copy()
reset_env(environ)
script = reset_env(environ)
environ['PIP_AUTO_COMPLETE'] = '1'
environ['COMP_WORDS'] = words
environ['COMP_CWORD'] = cword
env = get_env()
# expect_error is True because autocomplete exists with 1 status code
result = env.run('python', '-c', 'import pip;pip.autocomplete()',
result = script.run('python', '-c', 'import pip;pip.autocomplete()',
expect_error=True)
return result, env
return result, script
def test_completion_for_un_snippet():

View File

@ -2,7 +2,7 @@ import sys
import re
import textwrap
from doctest import OutputChecker, ELLIPSIS
from tests.lib import reset_env, run_pip, write_file, get_env, pyversion, pip_install_local
from tests.lib import reset_env
from tests.lib.local_repos import local_checkout, local_repo
@ -42,14 +42,14 @@ def test_freeze_basic():
currently it is not).
"""
env = reset_env()
write_file('initools-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("initools-req.txt").write(textwrap.dedent("""\
simple==2.0
# and something else to test out:
simple2<=3.0
"""))
result = pip_install_local('-r', env.scratch_path/'initools-req.txt')
result = run_pip('freeze', expect_stderr=True)
result = script.pip_install_local('-r', script.scratch_path/'initools-req.txt')
result = script.pip('freeze', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: pip freeze
-- stdout: --------------------
@ -66,13 +66,13 @@ def test_freeze_svn():
#svn internally stores windows drives as uppercase; we'll match that.
checkout_path = checkout_path.replace('c:', 'C:')
env = reset_env()
result = env.run('svn', 'co', '-r10',
script = reset_env()
result = script.run('svn', 'co', '-r10',
local_repo('svn+http://svn.colorstudy.com/INITools/trunk'),
'initools-trunk')
result = env.run('python', 'setup.py', 'develop',
cwd=env.scratch_path/ 'initools-trunk', expect_stderr=True)
result = run_pip('freeze', expect_stderr=True)
result = script.run('python', 'setup.py', 'develop',
cwd=script.scratch_path/ 'initools-trunk', expect_stderr=True)
result = script.pip('freeze', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: ...pip freeze
-- stdout: --------------------
@ -86,13 +86,13 @@ def test_freeze_git_clone():
Test freezing a Git clone.
"""
env = reset_env()
result = env.run('git', 'clone', local_repo('git+http://github.com/pypa/pip-test-package.git'), 'pip-test-package')
result = env.run('git', 'checkout', '7d654e66c8fa7149c165ddeffa5b56bc06619458',
cwd=env.scratch_path / 'pip-test-package', expect_stderr=True)
result = env.run('python', 'setup.py', 'develop',
cwd=env.scratch_path / 'pip-test-package')
result = run_pip('freeze', expect_stderr=True)
script = reset_env()
result = script.run('git', 'clone', local_repo('git+http://github.com/pypa/pip-test-package.git'), 'pip-test-package')
result = script.run('git', 'checkout', '7d654e66c8fa7149c165ddeffa5b56bc06619458',
cwd=script.scratch_path / 'pip-test-package', expect_stderr=True)
result = script.run('python', 'setup.py', 'develop',
cwd=script.scratch_path / 'pip-test-package')
result = script.pip('freeze', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: ...pip freeze
-- stdout: --------------------
@ -100,7 +100,7 @@ def test_freeze_git_clone():
...""" % local_checkout('git+http://github.com/pypa/pip-test-package.git'))
_check_output(result, expected)
result = run_pip('freeze', '-f',
result = script.pip('freeze', '-f',
'%s#egg=pip_test_package' % local_checkout('git+http://github.com/pypa/pip-test-package.git'),
expect_stderr=True)
expected = textwrap.dedent("""\
@ -117,15 +117,14 @@ def test_freeze_mercurial_clone():
Test freezing a Mercurial clone.
"""
reset_env()
env = get_env()
result = env.run('hg', 'clone',
script = reset_env()
result = script.run('hg', 'clone',
'-r', 'c9963c111e7c',
local_repo('hg+http://bitbucket.org/pypa/pip-test-package'),
'pip-test-package')
result = env.run('python', 'setup.py', 'develop',
cwd=env.scratch_path/'pip-test-package', expect_stderr=True)
result = run_pip('freeze', expect_stderr=True)
result = script.run('python', 'setup.py', 'develop',
cwd=script.scratch_path/'pip-test-package', expect_stderr=True)
result = script.pip('freeze', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: ...pip freeze
-- stdout: --------------------
@ -133,7 +132,7 @@ def test_freeze_mercurial_clone():
...""" % local_checkout('hg+http://bitbucket.org/pypa/pip-test-package'))
_check_output(result, expected)
result = run_pip('freeze', '-f',
result = script.pip('freeze', '-f',
'%s#egg=pip_test_package' % local_checkout('hg+http://bitbucket.org/pypa/pip-test-package'),
expect_stderr=True)
expected = textwrap.dedent("""\
@ -155,14 +154,13 @@ def test_freeze_bazaar_clone():
#bzr internally stores windows drives as uppercase; we'll match that.
checkout_pathC = checkout_path.replace('c:', 'C:')
reset_env()
env = get_env()
result = env.run('bzr', 'checkout', '-r', '174',
script = reset_env()
result = script.run('bzr', 'checkout', '-r', '174',
local_repo('bzr+http://bazaar.launchpad.net/%7Edjango-wikiapp/django-wikiapp/release-0.1'),
'django-wikiapp')
result = env.run('python', 'setup.py', 'develop',
cwd=env.scratch_path/'django-wikiapp')
result = run_pip('freeze', expect_stderr=True)
result = script.run('python', 'setup.py', 'develop',
cwd=script.scratch_path/'django-wikiapp')
result = script.pip('freeze', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: ...pip freeze
-- stdout: --------------------
@ -170,7 +168,7 @@ def test_freeze_bazaar_clone():
...""" % checkout_pathC)
_check_output(result, expected)
result = run_pip('freeze', '-f',
result = script.pip('freeze', '-f',
'%s/#egg=django-wikiapp' % checkout_path,
expect_stderr=True)
expected = textwrap.dedent("""\
@ -187,9 +185,9 @@ def test_freeze_with_local_option():
Test that wsgiref (from global site-packages) is reported normally, but not with --local.
"""
reset_env()
result = run_pip('install', 'initools==0.2')
result = run_pip('freeze', expect_stderr=True)
script = reset_env()
result = script.pip('install', 'initools==0.2')
result = script.pip('freeze', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: ...pip freeze
-- stdout: --------------------
@ -204,7 +202,7 @@ def test_freeze_with_local_option():
# _check_output(result, expected)
result = run_pip('freeze', '--local', expect_stderr=True)
result = script.pip('freeze', '--local', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: ...pip freeze --local
-- stdout: --------------------
@ -218,7 +216,7 @@ def test_freeze_with_requirement_option():
Test that new requirements are created correctly with --requirement hints
"""
reset_env()
script = reset_env()
ignores = textwrap.dedent("""\
# Unchanged requirements below this line
-r ignore.txt
@ -231,13 +229,13 @@ def test_freeze_with_requirement_option():
--find-links http://ignore
--index-url http://ignore
""")
write_file('hint.txt', textwrap.dedent("""\
script.scratch_path.join("hint.txt").write(textwrap.dedent("""\
INITools==0.1
NoExist==4.2
""") + ignores)
result = run_pip('install', 'initools==0.2')
result = pip_install_local('simple')
result = run_pip('freeze', '--requirement', 'hint.txt', expect_stderr=True)
result = script.pip('install', 'initools==0.2')
result = script.pip_install_local('simple')
result = script.pip('freeze', '--requirement', 'hint.txt', expect_stderr=True)
expected = textwrap.dedent("""\
Script result: pip freeze --requirement hint.txt
-- stderr: --------------------

View File

@ -6,7 +6,7 @@ from pip.basecommand import ERROR, SUCCESS
from pip.commands.help import HelpCommand
from pip.commands import commands
from mock import Mock
from tests.lib import run_pip, reset_env
from tests.lib import reset_env
def test_run_method_should_return_sucess_when_finds_command_name():
@ -47,8 +47,8 @@ def test_help_command_should_exit_status_ok_when_command_exists():
"""
Test `help` command for existing command
"""
reset_env()
result = run_pip('help', 'freeze')
script = reset_env()
result = script.pip('help', 'freeze')
assert result.returncode == SUCCESS
@ -56,8 +56,8 @@ def test_help_command_should_exit_status_ok_when_no_command_is_specified():
"""
Test `help` command for no command
"""
reset_env()
result = run_pip('help')
script = reset_env()
result = script.pip('help')
assert result.returncode == SUCCESS
@ -65,18 +65,18 @@ def test_help_command_should_exit_status_error_when_command_does_not_exist():
"""
Test `help` command for non-existing command
"""
reset_env()
result = run_pip('help', 'mycommand', expect_error=True)
script = reset_env()
result = script.pip('help', 'mycommand', expect_error=True)
assert result.returncode == ERROR
def test_help_commands_equally_functional():
"""
Test if `pip help` and 'pip --help' behave the same way.
"""
reset_env()
script = reset_env()
results = list(map(run_pip, ('help', '--help')))
results.append(run_pip())
results = list(map(script.pip, ('help', '--help')))
results.append(script.pip())
out = map(lambda x: x.stdout, results)
ret = map(lambda x: x.returncode, results)
@ -87,7 +87,5 @@ def test_help_commands_equally_functional():
for name, cls in commands.items():
if cls.hidden: continue
assert run_pip('help', name).stdout == \
run_pip(name, '--help').stdout
assert script.pip('help', name).stdout == \
script.pip(name, '--help').stdout

View File

@ -7,7 +7,7 @@ from os.path import abspath, join, curdir, pardir
import pytest
from pip.util import rmtree
from tests.lib import tests_data, reset_env, run_pip, pyversion, mkdir, pip_install_local, write_file, find_links
from tests.lib import tests_data, reset_env, pyversion, find_links
from tests.lib.local_repos import local_checkout
from tests.lib.path import Path
@ -16,13 +16,13 @@ def test_pip_second_command_line_interface_works():
"""
Check if ``pip<PYVERSION>`` commands behaves equally
"""
e = reset_env()
script = reset_env()
args = ['pip%s' % pyversion]
args.extend(['install', 'INITools==0.2'])
result = e.run(*args)
egg_info_folder = e.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = e.site_packages / 'initools'
result = script.run(*args)
egg_info_folder = script.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = script.site_packages / 'initools'
assert egg_info_folder in result.files_created, str(result)
assert initools_folder in result.files_created, str(result)
@ -31,10 +31,10 @@ def test_install_from_pypi():
"""
Test installing a package from PyPI.
"""
e = reset_env()
result = run_pip('install', '-vvv', 'INITools==0.2')
egg_info_folder = e.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = e.site_packages / 'initools'
script = reset_env()
result = script.pip('install', '-vvv', 'INITools==0.2')
egg_info_folder = script.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = script.site_packages / 'initools'
assert egg_info_folder in result.files_created, str(result)
assert initools_folder in result.files_created, str(result)
@ -43,8 +43,8 @@ def test_editable_install():
"""
Test editable installation.
"""
reset_env()
result = run_pip('install', '-e', 'INITools==0.2', expect_error=True)
script = reset_env()
result = script.pip('install', '-e', 'INITools==0.2', expect_error=True)
assert "INITools==0.2 should either by a path to a local project or a VCS url" in result.stdout
assert len(result.files_created) == 1, result.files_created
assert not result.files_updated, result.files_updated
@ -54,8 +54,8 @@ def test_install_editable_from_svn():
"""
Test checking out from svn.
"""
reset_env()
result = run_pip('install',
script = reset_env()
result = script.pip('install',
'-e',
'%s#egg=initools-dev' %
local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'))
@ -66,9 +66,9 @@ def test_download_editable_to_custom_path():
"""
Test downloading an editable using a relative custom src folder.
"""
reset_env()
mkdir('customdl')
result = run_pip('install',
script = reset_env()
script.scratch_path.join("customdl").mkdir()
result = script.pip('install',
'-e',
'%s#egg=initools-dev' %
local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'),
@ -90,16 +90,16 @@ def test_editable_no_install_followed_by_no_download():
"""
Test installing an editable in two steps (first with --no-install, then with --no-download).
"""
reset_env()
script = reset_env()
result = run_pip('install',
result = script.pip('install',
'-e',
'%s#egg=initools-dev' %
local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'),
'--no-install', expect_error=True)
result.assert_installed('INITools', without_egg_link=True, with_files=['.svn'])
result = run_pip('install',
result = script.pip('install',
'-e',
'%s#egg=initools-dev' %
local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'),
@ -111,19 +111,19 @@ def test_no_install_followed_by_no_download():
"""
Test installing in two steps (first with --no-install, then with --no-download).
"""
env = reset_env()
script = reset_env()
egg_info_folder = env.site_packages/'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = env.site_packages/'initools'
build_dir = env.venv/'build'/'INITools'
egg_info_folder = script.site_packages/'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = script.site_packages/'initools'
build_dir = script.venv/'build'/'INITools'
result1 = run_pip('install', 'INITools==0.2', '--no-install', expect_error=True)
result1 = script.pip('install', 'INITools==0.2', '--no-install', expect_error=True)
assert egg_info_folder not in result1.files_created, str(result1)
assert initools_folder not in result1.files_created, sorted(result1.files_created)
assert build_dir in result1.files_created, result1.files_created
assert build_dir/'INITools.egg-info' in result1.files_created
result2 = run_pip('install', 'INITools==0.2', '--no-download', expect_error=True)
result2 = script.pip('install', 'INITools==0.2', '--no-download', expect_error=True)
assert egg_info_folder in result2.files_created, str(result2)
assert initools_folder in result2.files_created, sorted(result2.files_created)
assert build_dir not in result2.files_created
@ -134,8 +134,8 @@ def test_bad_install_with_no_download():
"""
Test that --no-download behaves sensibly if the package source can't be found.
"""
reset_env()
result = run_pip('install', 'INITools==0.2', '--no-download', expect_error=True)
script = reset_env()
result = script.pip('install', 'INITools==0.2', '--no-download', expect_error=True)
assert "perhaps --no-download was used without first running "\
"an equivalent install with --no-install?" in result.stdout
@ -144,24 +144,24 @@ def test_install_dev_version_from_pypi():
"""
Test using package==dev.
"""
e = reset_env()
result = run_pip('install', 'INITools==dev',
script = reset_env()
result = script.pip('install', 'INITools==dev',
'--allow-external', 'INITools',
'--allow-insecure', 'INITools',
expect_error=True)
assert (e.site_packages / 'initools') in result.files_created, str(result.stdout)
assert (script.site_packages / 'initools') in result.files_created, str(result.stdout)
def test_install_editable_from_git():
"""
Test cloning from Git.
"""
reset_env()
script = reset_env()
args = ['install']
args.extend(['-e',
'%s#egg=pip-test-package' %
local_checkout('git+http://github.com/pypa/pip-test-package.git')])
result = run_pip(*args, **{"expect_error": True})
result = script.pip(*args, **{"expect_error": True})
result.assert_installed('pip-test-package', with_files=['.git'])
@ -169,8 +169,8 @@ def test_install_editable_from_hg():
"""
Test cloning from Mercurial.
"""
reset_env()
result = run_pip('install', '-e',
script = reset_env()
result = script.pip('install', '-e',
'%s#egg=ScriptTest' %
local_checkout('hg+https://bitbucket.org/ianb/scripttest'),
expect_error=True)
@ -181,8 +181,8 @@ def test_vcs_url_final_slash_normalization():
"""
Test that presence or absence of final slash in VCS URL is normalized.
"""
reset_env()
result = run_pip('install', '-e',
script = reset_env()
result = script.pip('install', '-e',
'%s/#egg=ScriptTest' %
local_checkout('hg+https://bitbucket.org/ianb/scripttest'),
expect_error=True)
@ -193,8 +193,8 @@ def test_install_editable_from_bazaar():
"""
Test checking out from Bazaar.
"""
reset_env()
result = run_pip('install', '-e',
script = reset_env()
result = script.pip('install', '-e',
'%s/@174#egg=django-wikiapp' %
local_checkout('bzr+http://bazaar.launchpad.net/%7Edjango-wikiapp/django-wikiapp/release-0.1'),
expect_error=True)
@ -205,8 +205,8 @@ def test_vcs_url_urlquote_normalization():
"""
Test that urlquoted characters are normalized for repo URL comparison.
"""
reset_env()
result = run_pip('install', '-e',
script = reset_env()
result = script.pip('install', '-e',
'%s/#egg=django-wikiapp' %
local_checkout('bzr+http://bazaar.launchpad.net/%7Edjango-wikiapp/django-wikiapp/release-0.1'),
expect_error=True)
@ -217,11 +217,11 @@ def test_install_from_local_directory():
"""
Test installing from a local directory.
"""
env = reset_env()
script = reset_env()
to_install = abspath(join(tests_data, 'packages', 'FSPkg'))
result = run_pip('install', to_install, expect_error=False)
fspkg_folder = env.site_packages/'fspkg'
egg_info_folder = env.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion
result = script.pip('install', to_install, expect_error=False)
fspkg_folder = script.site_packages/'fspkg'
egg_info_folder = script.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion
assert fspkg_folder in result.files_created, str(result.stdout)
assert egg_info_folder in result.files_created, str(result)
@ -230,8 +230,8 @@ def test_install_from_local_directory_with_no_setup_py():
"""
Test installing from a local directory with no 'setup.py'.
"""
reset_env()
result = run_pip('install', tests_data, expect_error=True)
script = reset_env()
result = script.pip('install', tests_data, expect_error=True)
assert len(result.files_created) == 1, result.files_created
assert 'pip-log.txt' in result.files_created, result.files_created
assert "is not installable. File 'setup.py' not found." in result.stdout
@ -241,8 +241,8 @@ def test_editable_install_from_local_directory_with_no_setup_py():
"""
Test installing from a local directory with no 'setup.py'.
"""
reset_env()
result = run_pip('install', '-e', tests_data, expect_error=True)
script = reset_env()
result = script.pip('install', '-e', tests_data, expect_error=True)
assert len(result.files_created) == 1, result.files_created
assert 'pip-log.txt' in result.files_created, result.files_created
assert "is not installable. File 'setup.py' not found." in result.stdout
@ -252,11 +252,11 @@ def test_install_as_egg():
"""
Test installing as egg, instead of flat install.
"""
env = reset_env()
script = reset_env()
to_install = abspath(join(tests_data, 'packages', 'FSPkg'))
result = run_pip('install', to_install, '--egg', expect_error=False)
fspkg_folder = env.site_packages/'fspkg'
egg_folder = env.site_packages/'FSPkg-0.1dev-py%s.egg' % pyversion
result = script.pip('install', to_install, '--egg', expect_error=False)
fspkg_folder = script.site_packages/'fspkg'
egg_folder = script.site_packages/'FSPkg-0.1dev-py%s.egg' % pyversion
assert fspkg_folder not in result.files_created, str(result.stdout)
assert egg_folder in result.files_created, str(result)
assert join(egg_folder, 'fspkg') in result.files_created, str(result)
@ -266,15 +266,15 @@ def test_install_curdir():
"""
Test installing current directory ('.').
"""
env = reset_env()
script = reset_env()
run_from = abspath(join(tests_data, 'packages', 'FSPkg'))
# Python 2.4 Windows balks if this exists already
egg_info = join(run_from, "FSPkg.egg-info")
if os.path.isdir(egg_info):
rmtree(egg_info)
result = run_pip('install', curdir, cwd=run_from, expect_error=False)
fspkg_folder = env.site_packages/'fspkg'
egg_info_folder = env.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion
result = script.pip('install', curdir, cwd=run_from, expect_error=False)
fspkg_folder = script.site_packages/'fspkg'
egg_info_folder = script.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion
assert fspkg_folder in result.files_created, str(result.stdout)
assert egg_info_folder in result.files_created, str(result)
@ -283,11 +283,11 @@ def test_install_pardir():
"""
Test installing parent directory ('..').
"""
env = reset_env()
script = reset_env()
run_from = abspath(join(tests_data, 'packages', 'FSPkg', 'fspkg'))
result = run_pip('install', pardir, cwd=run_from, expect_error=False)
fspkg_folder = env.site_packages/'fspkg'
egg_info_folder = env.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion
result = script.pip('install', pardir, cwd=run_from, expect_error=False)
fspkg_folder = script.site_packages/'fspkg'
egg_info_folder = script.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion
assert fspkg_folder in result.files_created, str(result.stdout)
assert egg_info_folder in result.files_created, str(result)
@ -297,8 +297,8 @@ def test_install_global_option():
Test using global distutils options.
(In particular those that disable the actual install action)
"""
reset_env()
result = run_pip('install', '--global-option=--version', "INITools==0.1")
script = reset_env()
result = script.pip('install', '--global-option=--version', "INITools==0.1")
assert '0.1\n' in result.stdout
@ -306,18 +306,18 @@ def test_install_with_pax_header():
"""
test installing from a tarball with pax header for python<2.6
"""
reset_env()
script = reset_env()
run_from = abspath(join(tests_data, 'packages'))
run_pip('install', 'paxpkg.tar.bz2', cwd=run_from)
script.pip('install', 'paxpkg.tar.bz2', cwd=run_from)
def test_install_with_hacked_egg_info():
"""
test installing a package which defines its own egg_info class
"""
reset_env()
script = reset_env()
run_from = abspath(join(tests_data, 'packages', 'HackedEggInfo'))
result = run_pip('install', '.', cwd=run_from)
result = script.pip('install', '.', cwd=run_from)
assert 'Successfully installed hackedegginfo\n' in result.stdout
@ -325,14 +325,14 @@ def test_install_using_install_option_and_editable():
"""
Test installing a tool using -e and --install-option
"""
env = reset_env()
script = reset_env()
folder = 'script_folder'
mkdir(folder)
script.scratch_path.join(folder).mkdir()
url = 'git+git://github.com/pypa/virtualenv'
result = run_pip('install', '-e', '%s#egg=virtualenv' %
result = script.pip('install', '-e', '%s#egg=virtualenv' %
local_checkout(url),
'--install-option=--script-dir=%s' % folder)
virtualenv_bin = env.venv/'src'/'virtualenv'/folder/'virtualenv'+env.exe
virtualenv_bin = script.venv/'src'/'virtualenv'/folder/'virtualenv'+script.exe
assert virtualenv_bin in result.files_created
@ -340,9 +340,9 @@ def test_install_global_option_using_editable():
"""
Test using global distutils options, but in an editable installation
"""
reset_env()
script = reset_env()
url = 'hg+http://bitbucket.org/runeh/anyjson'
result = run_pip('install', '--global-option=--version',
result = script.pip('install', '--global-option=--version',
'-e', '%s@0.2.5#egg=anyjson' %
local_checkout(url))
assert '0.2.5\n' in result.stdout
@ -352,10 +352,10 @@ def test_install_package_with_same_name_in_curdir():
"""
Test installing a package with the same name of a local folder
"""
env = reset_env()
mkdir('mock==0.6')
result = run_pip('install', 'mock==0.6')
egg_folder = env.site_packages / 'mock-0.6.0-py%s.egg-info' % pyversion
script = reset_env()
script.scratch_path.join("mock==0.6").mkdir()
result = script.pip('install', 'mock==0.6')
egg_folder = script.site_packages / 'mock-0.6.0-py%s.egg-info' % pyversion
assert egg_folder in result.files_created, str(result)
@ -369,12 +369,12 @@ def test_install_folder_using_dot_slash():
"""
Test installing a folder using pip install ./foldername
"""
env = reset_env()
mkdir('mock')
pkg_path = env.scratch_path/'mock'
write_file('setup.py', mock100_setup_py, pkg_path)
result = run_pip('install', './mock')
egg_folder = env.site_packages / 'mock-100.1-py%s.egg-info' % pyversion
script = reset_env()
script.scratch_path.join("mock").mkdir()
pkg_path = script.scratch_path/'mock'
pkg_path.join("setup.py").write(mock100_setup_py)
result = script.pip('install', './mock')
egg_folder = script.site_packages / 'mock-100.1-py%s.egg-info' % pyversion
assert egg_folder in result.files_created, str(result)
@ -382,12 +382,12 @@ def test_install_folder_using_slash_in_the_end():
r"""
Test installing a folder using pip install foldername/ or foldername\
"""
env = reset_env()
mkdir('mock')
pkg_path = env.scratch_path/'mock'
write_file('setup.py', mock100_setup_py, pkg_path)
result = run_pip('install', 'mock' + os.path.sep)
egg_folder = env.site_packages / 'mock-100.1-py%s.egg-info' % pyversion
script = reset_env()
script.scratch_path.join("mock").mkdir()
pkg_path = script.scratch_path/'mock'
pkg_path.join("setup.py").write(mock100_setup_py)
result = script.pip('install', 'mock' + os.path.sep)
egg_folder = script.site_packages / 'mock-100.1-py%s.egg-info' % pyversion
assert egg_folder in result.files_created, str(result)
@ -395,13 +395,13 @@ def test_install_folder_using_relative_path():
"""
Test installing a folder using pip install folder1/folder2
"""
env = reset_env()
mkdir('initools')
mkdir(Path('initools')/'mock')
pkg_path = env.scratch_path/'initools'/'mock'
write_file('setup.py', mock100_setup_py, pkg_path)
result = run_pip('install', Path('initools')/'mock')
egg_folder = env.site_packages / 'mock-100.1-py%s.egg-info' % pyversion
script = reset_env()
script.scratch_path.join("initools").mkdir()
script.scratch_path.join("initools", "mock").mkdir()
pkg_path = script.scratch_path/'initools'/'mock'
pkg_path.join("setup.py").write(mock100_setup_py)
result = script.pip('install', Path('initools')/'mock')
egg_folder = script.site_packages / 'mock-100.1-py%s.egg-info' % pyversion
assert egg_folder in result.files_created, str(result)
@ -409,10 +409,10 @@ def test_install_package_which_contains_dev_in_name():
"""
Test installing package from pypi which contains 'dev' in name
"""
env = reset_env()
result = run_pip('install', 'django-devserver==0.0.4')
devserver_folder = env.site_packages/'devserver'
egg_info_folder = env.site_packages/'django_devserver-0.0.4-py%s.egg-info' % pyversion
script = reset_env()
result = script.pip('install', 'django-devserver==0.0.4')
devserver_folder = script.site_packages/'devserver'
egg_info_folder = script.site_packages/'django_devserver-0.0.4-py%s.egg-info' % pyversion
assert devserver_folder in result.files_created, str(result.stdout)
assert egg_info_folder in result.files_created, str(result)
@ -421,9 +421,9 @@ def test_install_package_with_target():
"""
Test installing a package using pip install --target
"""
env = reset_env()
target_dir = env.scratch_path/'target'
result = run_pip('install', '-t', target_dir, "initools==0.1")
script = reset_env()
target_dir = script.scratch_path/'target'
result = script.pip('install', '-t', target_dir, "initools==0.1")
assert Path('scratch')/'target'/'initools' in result.files_created, str(result)
@ -431,13 +431,13 @@ def test_install_package_with_root():
"""
Test installing a package using pip install --root
"""
env = reset_env()
root_dir = env.scratch_path/'root'
result = run_pip('install', '--root', root_dir, '-f', find_links, '--no-index', 'simple==1.0')
normal_install_path = env.root_path / env.site_packages / 'simple-1.0-py%s.egg-info' % pyversion
script = reset_env()
root_dir = script.scratch_path/'root'
result = script.pip('install', '--root', root_dir, '-f', find_links, '--no-index', 'simple==1.0')
normal_install_path = script.base_path / script.site_packages / 'simple-1.0-py%s.egg-info' % pyversion
#use distutils to change the root exactly how the --root option does it
from distutils.util import change_root
root_path = change_root(os.path.join(env.scratch, 'root'), normal_install_path)
root_path = change_root(os.path.join(script.scratch, 'root'), normal_install_path)
assert root_path in result.files_created, str(result)
@ -458,9 +458,9 @@ def test_install_package_that_emits_unicode():
Refs https://github.com/pypa/pip/issues/326
"""
env = reset_env()
script = reset_env()
to_install = os.path.abspath(os.path.join(tests_data, 'packages', 'BrokenEmitsUTF8'))
result = run_pip('install', to_install, expect_error=True, expect_temp=True, quiet=True)
result = script.pip('install', to_install, expect_error=True, expect_temp=True, quiet=True)
assert 'FakeError: this package designed to fail on install' in result.stdout
assert 'UnicodeDecodeError' not in result.stdout
@ -473,13 +473,12 @@ def test_url_req_case_mismatch():
tests/packages contains Upper-1.0.tar.gz and Upper-2.0.tar.gz
'requiresupper' has install_requires = ['upper']
"""
env = reset_env()
script = reset_env()
Upper = os.path.join(find_links, 'Upper-1.0.tar.gz')
result = run_pip('install', '--no-index', '-f', find_links, Upper, 'requiresupper')
result = script.pip('install', '--no-index', '-f', find_links, Upper, 'requiresupper')
#only Upper-1.0.tar.gz should get installed.
egg_folder = env.site_packages / 'Upper-1.0-py%s.egg-info' % pyversion
egg_folder = script.site_packages / 'Upper-1.0-py%s.egg-info' % pyversion
assert egg_folder in result.files_created, str(result)
egg_folder = env.site_packages / 'Upper-2.0-py%s.egg-info' % pyversion
egg_folder = script.site_packages / 'Upper-2.0-py%s.egg-info' % pyversion
assert egg_folder not in result.files_created, str(result)

View File

@ -1,11 +1,13 @@
import os
from tests.lib import reset_env, pip_install_local, packages
from tests.lib import reset_env, packages
def test_install_pybundle():
"""
Test intalling a *.pybundle file
"""
env = reset_env()
result = pip_install_local(os.path.join(packages, 'simplebundle.pybundle'), expect_temp=True)
script = reset_env()
result = script.pip_install_local(os.path.join(packages, 'simplebundle.pybundle'), expect_temp=True)
result.assert_installed('simple', editable=False)
result.assert_installed('simple2', editable=False)

View File

@ -1,8 +1,7 @@
import os
import textwrap
from os.path import abspath, exists, join
from tests.lib import (tests_data, reset_env, run_pip, pip_install_local,
write_file, mkdir, path_to_url, find_links)
from tests.lib import tests_data, reset_env, find_links
from tests.lib.local_repos import local_checkout
from tests.lib.path import Path
@ -11,21 +10,21 @@ def test_cleanup_after_install():
"""
Test clean up after installing a package.
"""
env = reset_env()
run_pip('install', '--no-index', '--find-links=%s' % find_links, 'simple')
build = env.venv_path/"build"
src = env.venv_path/"src"
script = reset_env()
script.pip('install', '--no-index', '--find-links=%s' % find_links, 'simple')
build = script.venv_path/"build"
src = script.venv_path/"src"
assert not exists(build), "build/ dir still exists: %s" % build
assert not exists(src), "unexpected src/ dir exists: %s" % src
env.assert_no_temp()
script.assert_no_temp()
def test_no_clean_option_blocks_cleaning_after_install():
"""
Test --no-clean option blocks cleaning after install
"""
env = reset_env()
result = run_pip('install', '--no-clean', '--no-index', '--find-links=%s' % find_links, 'simple')
build = env.venv_path/'build'/'simple'
script = reset_env()
result = script.pip('install', '--no-clean', '--no-index', '--find-links=%s' % find_links, 'simple')
build = script.venv_path/'build'/'simple'
assert exists(build), "build/simple should still exist %s" % str(result)
@ -34,17 +33,17 @@ def test_cleanup_after_install_editable_from_hg():
Test clean up after cloning from Mercurial.
"""
env = reset_env()
run_pip('install',
script = reset_env()
script.pip('install',
'-e',
'%s#egg=ScriptTest' %
local_checkout('hg+https://bitbucket.org/ianb/scripttest'),
expect_error=True)
build = env.venv_path/'build'
src = env.venv_path/'src'
build = script.venv_path/'build'
src = script.venv_path/'src'
assert not exists(build), "build/ dir still exists: %s" % build
assert exists(src), "expected src/ dir doesn't exist: %s" % src
env.assert_no_temp()
script.assert_no_temp()
def test_cleanup_after_install_from_local_directory():
@ -52,26 +51,26 @@ def test_cleanup_after_install_from_local_directory():
Test clean up after installing from a local directory.
"""
env = reset_env()
script = reset_env()
to_install = abspath(join(tests_data, 'packages', 'FSPkg'))
run_pip('install', to_install, expect_error=False)
build = env.venv_path/'build'
src = env.venv_path/'src'
script.pip('install', to_install, expect_error=False)
build = script.venv_path/'build'
src = script.venv_path/'src'
assert not exists(build), "unexpected build/ dir exists: %s" % build
assert not exists(src), "unexpected src/ dir exist: %s" % src
env.assert_no_temp()
script.assert_no_temp()
def test_no_install_and_download_should_not_leave_build_dir():
"""
It should remove build/ dir if it was pip that created
"""
env = reset_env()
mkdir('downloaded_packages')
assert not os.path.exists(env.venv_path/'/build')
result = run_pip('install', '--no-install', 'INITools==0.2', '-d', 'downloaded_packages')
script = reset_env()
script.scratch_path.join("downloaded_packages").mkdir()
assert not os.path.exists(script.venv_path/'/build')
result = script.pip('install', '--no-install', 'INITools==0.2', '-d', 'downloaded_packages')
assert Path('scratch')/'downloaded_packages/build' not in result.files_created, 'pip should not leave build/ dir'
assert not os.path.exists(env.venv_path/'/build'), "build/ dir should be deleted"
assert not os.path.exists(script.venv_path/'/build'), "build/ dir should be deleted"
def test_cleanup_req_satisifed_no_name():
@ -85,61 +84,58 @@ def test_cleanup_req_satisifed_no_name():
# 2) parent-0.1.tar.gz
dist = abspath(join(tests_data, 'packages', 'parent-0.1.tar.gz'))
env = reset_env()
result = run_pip('install', dist)
result = run_pip('install', dist)
build = env.venv_path/'build'
script = reset_env()
result = script.pip('install', dist)
result = script.pip('install', dist)
build = script.venv_path/'build'
assert not exists(build), "unexpected build/ dir exists: %s" % build
env.assert_no_temp()
script.assert_no_temp()
def test_download_should_not_delete_existing_build_dir():
"""
It should not delete build/ if existing before run the command
"""
env = reset_env()
mkdir(env.venv_path/'build')
f = open(env.venv_path/'build'/'somefile.txt', 'w')
f.write('I am not empty!')
f.close()
run_pip('install', '--no-install', 'INITools==0.2', '-d', '.')
f = open(env.venv_path/'build'/'somefile.txt')
content = f.read()
f.close()
assert os.path.exists(env.venv_path/'build'), "build/ should be left if it exists before pip run"
script = reset_env()
script.venv_path.join("build").mkdir()
script.venv_path.join("build", "somefile.txt").write("I am not empty!")
script.pip('install', '--no-install', 'INITools==0.2', '-d', '.')
with open(script.venv_path/'build'/'somefile.txt') as fp:
content = fp.read()
assert os.path.exists(script.venv_path/'build'), "build/ should be left if it exists before pip run"
assert content == 'I am not empty!', "it should not affect build/ and its content"
assert ['somefile.txt'] == os.listdir(env.venv_path/'build')
assert ['somefile.txt'] == os.listdir(script.venv_path/'build')
def test_cleanup_after_install_exception():
"""
Test clean up after a 'setup.py install' exception.
"""
env = reset_env()
script = reset_env()
#broken==0.2broken fails during install; see packages readme file
result = run_pip('install', '-f', find_links, '--no-index', 'broken==0.2broken', expect_error=True)
build = env.venv_path/'build'
result = script.pip('install', '-f', find_links, '--no-index', 'broken==0.2broken', expect_error=True)
build = script.venv_path/'build'
assert not exists(build), "build/ dir still exists: %s" % result.stdout
env.assert_no_temp()
script.assert_no_temp()
def test_cleanup_after_egg_info_exception():
"""
Test clean up after a 'setup.py egg_info' exception.
"""
env = reset_env()
script = reset_env()
#brokenegginfo fails during egg_info; see packages readme file
result = run_pip('install', '-f', find_links, '--no-index', 'brokenegginfo==0.1', expect_error=True)
build = env.venv_path/'build'
result = script.pip('install', '-f', find_links, '--no-index', 'brokenegginfo==0.1', expect_error=True)
build = script.venv_path/'build'
assert not exists(build), "build/ dir still exists: %s" % result.stdout
env.assert_no_temp()
script.assert_no_temp()
def test_cleanup_prevented_upon_build_dir_exception():
"""
Test no cleanup occurs after a PreviousBuildDirError
"""
env = reset_env()
build = env.venv_path/'build'/'simple'
script = reset_env()
build = script.venv_path/'build'/'simple'
os.makedirs(build)
write_file("setup.py", "#", dest=build)
result = run_pip('install', '-f', find_links, '--no-index', 'simple', expect_error=True)
build.join("setup.py").write("#")
result = script.pip('install', '-f', find_links, '--no-index', 'simple', expect_error=True)
assert "pip can't proceed" in result.stdout, result.stdout
assert exists(build)

View File

@ -3,8 +3,7 @@ Tests for compatibility workarounds.
"""
import os
from tests.lib import (tests_data, reset_env, run_pip, pyversion,
assert_all_changes)
from tests.lib import tests_data, reset_env, pyversion, assert_all_changes
def test_debian_egg_name_workaround():
@ -18,11 +17,11 @@ def test_debian_egg_name_workaround():
https://bitbucket.org/ianb/pip/issue/104/pip-uninstall-on-ubuntu-linux
"""
env = reset_env()
result = run_pip('install', 'INITools==0.2', expect_error=True)
script = reset_env()
result = script.pip('install', 'INITools==0.2', expect_error=True)
egg_info = os.path.join(
env.site_packages, "INITools-0.2-py%s.egg-info" % pyversion)
script.site_packages, "INITools-0.2-py%s.egg-info" % pyversion)
# Debian only removes pyversion for global installs, not inside a venv
# so even if this test runs on a Debian/Ubuntu system with broken setuptools,
@ -30,19 +29,19 @@ def test_debian_egg_name_workaround():
assert egg_info in result.files_created, "Couldn't find %s" % egg_info
# The Debian no-pyversion version of the .egg-info
mangled = os.path.join(env.site_packages, "INITools-0.2.egg-info")
mangled = os.path.join(script.site_packages, "INITools-0.2.egg-info")
assert mangled not in result.files_created, "Found unexpected %s" % mangled
# Simulate a Debian install by copying the .egg-info to their name for it
full_egg_info = os.path.join(env.root_path, egg_info)
full_egg_info = os.path.join(script.base_path, egg_info)
assert os.path.isdir(full_egg_info)
full_mangled = os.path.join(env.root_path, mangled)
full_mangled = os.path.join(script.base_path, mangled)
os.renames(full_egg_info, full_mangled)
assert os.path.isdir(full_mangled)
# Try the uninstall and verify that everything is removed.
result2 = run_pip("uninstall", "INITools", "-y")
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
result2 = script.pip("uninstall", "INITools", "-y")
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
def test_setup_py_with_dos_line_endings():
@ -51,6 +50,6 @@ def test_setup_py_with_dos_line_endings():
Refs https://github.com/pypa/pip/issues/237
"""
reset_env()
script = reset_env()
to_install = os.path.abspath(os.path.join(tests_data, 'packages', 'LineEndings'))
run_pip('install', to_install, expect_error=False)
script.pip('install', to_install, expect_error=False)

View File

@ -1,8 +1,8 @@
import os
import tempfile
import textwrap
from tests.lib import (reset_env, run_pip, clear_environ, write_file, path_to_url,
find_links)
from tests.lib import reset_env, clear_environ, path_to_url, find_links
def test_options_from_env_vars():
@ -12,8 +12,8 @@ def test_options_from_env_vars():
"""
environ = clear_environ(os.environ.copy())
environ['PIP_NO_INDEX'] = '1'
reset_env(environ)
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Ignoring indexes:" in result.stdout, str(result)
assert "DistributionNotFound: No distributions at all found for INITools" in result.stdout
@ -25,11 +25,11 @@ def test_command_line_options_override_env_vars():
"""
environ = clear_environ(os.environ.copy())
environ['PIP_INDEX_URL'] = 'http://b.pypi.python.org/simple/'
reset_env(environ)
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Getting page http://b.pypi.python.org/simple/INITools" in result.stdout
reset_env(environ)
result = run_pip('install', '-vvv', '--index-url', 'http://download.zope.org/ppix', 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', '--index-url', 'http://download.zope.org/ppix', 'INITools', expect_error=True)
assert "b.pypi.python.org" not in result.stdout
assert "Getting page http://download.zope.org/ppix" in result.stdout
@ -52,20 +52,20 @@ def test_env_vars_override_config_file():
def _test_env_vars_override_config_file(config_file):
environ = clear_environ(os.environ.copy())
environ['PIP_CONFIG_FILE'] = config_file # set this to make pip load it
reset_env(environ)
script = reset_env(environ)
# It's important that we test this particular config value ('no-index')
# because their is/was a bug which only shows up in cases in which
# 'config-item' and 'config_item' hash to the same value modulo the size
# of the config dictionary.
write_file(config_file, textwrap.dedent("""\
(script.scratch_path/config_file).write(textwrap.dedent("""\
[global]
no-index = 1
"""))
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "DistributionNotFound: No distributions at all found for INITools" in result.stdout
environ['PIP_NO_INDEX'] = '0'
reset_env(environ)
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Successfully installed INITools" in result.stdout
@ -76,11 +76,11 @@ def test_command_line_append_flags():
"""
environ = clear_environ(os.environ.copy())
environ['PIP_FIND_LINKS'] = 'http://pypi.pinaxproject.com'
reset_env(environ)
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Analyzing links from page http://pypi.pinaxproject.com" in result.stdout
reset_env(environ)
result = run_pip('install', '-vvv', '--find-links', find_links, 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', '--find-links', find_links, 'INITools', expect_error=True)
assert "Analyzing links from page http://pypi.pinaxproject.com" in result.stdout
assert "Skipping link %s" % find_links in result.stdout
@ -92,8 +92,8 @@ def test_command_line_appends_correctly():
"""
environ = clear_environ(os.environ.copy())
environ['PIP_FIND_LINKS'] = 'http://pypi.pinaxproject.com %s' % find_links
reset_env(environ)
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
script = reset_env(environ)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Analyzing links from page http://pypi.pinaxproject.com" in result.stdout, result.stdout
assert "Skipping link %s" % find_links in result.stdout
@ -118,23 +118,23 @@ def test_config_file_override_stack():
def _test_config_file_override_stack(config_file):
environ = clear_environ(os.environ.copy())
environ['PIP_CONFIG_FILE'] = config_file # set this to make pip load it
reset_env(environ)
write_file(config_file, textwrap.dedent("""\
script = reset_env(environ)
(script.scratch_path/config_file).write(textwrap.dedent("""\
[global]
index-url = http://download.zope.org/ppix
"""))
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Getting page http://download.zope.org/ppix/INITools" in result.stdout
reset_env(environ)
write_file(config_file, textwrap.dedent("""\
script = reset_env(environ)
(script.scratch_path/config_file).write(textwrap.dedent("""\
[global]
index-url = http://download.zope.org/ppix
[install]
index-url = http://pypi.appspot.com/
"""))
result = run_pip('install', '-vvv', 'INITools', expect_error=True)
result = script.pip('install', '-vvv', 'INITools', expect_error=True)
assert "Getting page http://pypi.appspot.com/INITools" in result.stdout
result = run_pip('install', '-vvv', '--index-url', 'http://pypi.python.org/simple', 'INITools', expect_error=True)
result = script.pip('install', '-vvv', '--index-url', 'http://pypi.python.org/simple', 'INITools', expect_error=True)
assert "Getting page http://download.zope.org/ppix/INITools" not in result.stdout
assert "Getting page http://pypi.appspot.com/INITools" not in result.stdout
assert "Getting page http://pypi.python.org/simple/INITools" in result.stdout

View File

@ -1,6 +1,6 @@
import textwrap
from tests.lib import reset_env, run_pip, write_file
from tests.lib import reset_env
from tests.lib.path import Path
@ -9,10 +9,10 @@ def test_download_if_requested():
It should download (in the scratch path) and not install if requested.
"""
env = reset_env()
result = run_pip('install', 'INITools==0.1', '-d', '.', expect_error=True)
script = reset_env()
result = script.pip('install', 'INITools==0.1', '-d', '.', expect_error=True)
assert Path('scratch')/ 'INITools-0.1.tar.gz' in result.files_created
assert env.site_packages/ 'initools' not in result.files_created
assert script.site_packages/ 'initools' not in result.files_created
def test_download_wheel():
@ -22,12 +22,12 @@ def test_download_wheel():
--find-links has a bug https://github.com/pypa/pip/issues/1111
"""
env = reset_env()
result = run_pip('install', '--use-wheel',
script = reset_env()
result = script.pip('install', '--use-wheel',
'-f', 'https://bitbucket.org/pypa/pip-test-package/downloads',
'-d', '.', 'pip-test-package')
assert Path('scratch')/ 'pip_test_package-0.1.1-py2.py3-none-any.whl' in result.files_created
assert env.site_packages/ 'piptestpackage' not in result.files_created
assert script.site_packages/ 'piptestpackage' not in result.files_created
def test_single_download_from_requirements_file():
@ -35,13 +35,13 @@ def test_single_download_from_requirements_file():
It should support download (in the scratch path) from PyPi from a requirements file
"""
env = reset_env()
write_file('test-req.txt', textwrap.dedent("""
script = reset_env()
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""
INITools==0.1
"""))
result = run_pip('install', '-r', env.scratch_path/ 'test-req.txt', '-d', '.', expect_error=True)
result = script.pip('install', '-r', script.scratch_path/ 'test-req.txt', '-d', '.', expect_error=True)
assert Path('scratch')/ 'INITools-0.1.tar.gz' in result.files_created
assert env.site_packages/ 'initools' not in result.files_created
assert script.site_packages/ 'initools' not in result.files_created
def test_download_should_download_dependencies():
@ -49,38 +49,38 @@ def test_download_should_download_dependencies():
It should download dependencies (in the scratch path)
"""
env = reset_env()
result = run_pip('install', 'Paste[openid]==1.7.5.1', '-d', '.', expect_error=True)
script = reset_env()
result = script.pip('install', 'Paste[openid]==1.7.5.1', '-d', '.', expect_error=True)
assert Path('scratch')/ 'Paste-1.7.5.1.tar.gz' in result.files_created
openid_tarball_prefix = str(Path('scratch')/ 'python-openid-')
assert any(path.startswith(openid_tarball_prefix) for path in result.files_created)
assert env.site_packages/ 'openid' not in result.files_created
assert script.site_packages/ 'openid' not in result.files_created
def test_download_should_skip_existing_files():
"""
It should not download files already existing in the scratch dir
"""
env = reset_env()
script = reset_env()
write_file('test-req.txt', textwrap.dedent("""
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""
INITools==0.1
"""))
result = run_pip('install', '-r', env.scratch_path/ 'test-req.txt', '-d', '.', expect_error=True)
result = script.pip('install', '-r', script.scratch_path/ 'test-req.txt', '-d', '.', expect_error=True)
assert Path('scratch')/ 'INITools-0.1.tar.gz' in result.files_created
assert env.site_packages/ 'initools' not in result.files_created
assert script.site_packages/ 'initools' not in result.files_created
# adding second package to test-req.txt
write_file('test-req.txt', textwrap.dedent("""
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""
INITools==0.1
python-openid==2.2.5
"""))
# only the second package should be downloaded
result = run_pip('install', '-r', env.scratch_path/ 'test-req.txt', '-d', '.', expect_error=True)
result = script.pip('install', '-r', script.scratch_path/ 'test-req.txt', '-d', '.', expect_error=True)
openid_tarball_prefix = str(Path('scratch')/ 'python-openid-')
assert any(path.startswith(openid_tarball_prefix) for path in result.files_created)
assert Path('scratch')/ 'INITools-0.1.tar.gz' not in result.files_created
assert env.site_packages/ 'initools' not in result.files_created
assert env.site_packages/ 'openid' not in result.files_created
assert script.site_packages/ 'initools' not in result.files_created
assert script.site_packages/ 'openid' not in result.files_created

View File

@ -1,15 +1,15 @@
from os.path import join
from tests.lib import reset_env, run_pip
from tests.lib import reset_env
def test_simple_extras_install_from_pypi():
"""
Test installing a package from PyPI using extras dependency Paste[openid].
"""
e = reset_env()
result = run_pip('install', 'Paste[openid]==1.7.5.1', expect_stderr=True)
initools_folder = e.site_packages / 'openid'
script = reset_env()
result = script.pip('install', 'Paste[openid]==1.7.5.1', expect_stderr=True)
initools_folder = script.site_packages / 'openid'
assert initools_folder in result.files_created, result.files_created
@ -17,11 +17,11 @@ def test_no_extras_uninstall():
"""
No extras dependency gets uninstalled when the root package is uninstalled
"""
env = reset_env()
result = run_pip('install', 'Paste[openid]==1.7.5.1', expect_stderr=True)
assert join(env.site_packages, 'paste') in result.files_created, sorted(result.files_created.keys())
assert join(env.site_packages, 'openid') in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('uninstall', 'Paste', '-y')
script = reset_env()
result = script.pip('install', 'Paste[openid]==1.7.5.1', expect_stderr=True)
assert join(script.site_packages, 'paste') in result.files_created, sorted(result.files_created.keys())
assert join(script.site_packages, 'openid') in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('uninstall', 'Paste', '-y')
# openid should not be uninstalled
initools_folder = env.site_packages / 'openid'
initools_folder = script.site_packages / 'openid'
assert not initools_folder in result2.files_deleted, result.files_deleted

View File

@ -2,41 +2,41 @@ import os
import textwrap
from pip.backwardcompat import urllib
from tests.lib import (reset_env, run_pip, pyversion, tests_data, write_file,
path_to_url)
from tests.lib import reset_env, pyversion, tests_data, path_to_url
def test_find_links_relative_path():
"""Test find-links as a relative path."""
e = reset_env()
result = run_pip(
script = reset_env()
result = script.pip(
'install',
'parent==0.1',
'--no-index',
'--find-links',
'packages/',
cwd=tests_data)
egg_info_folder = e.site_packages / 'parent-0.1-py%s.egg-info' % pyversion
initools_folder = e.site_packages / 'parent'
egg_info_folder = script.site_packages / 'parent-0.1-py%s.egg-info' % pyversion
initools_folder = script.site_packages / 'parent'
assert egg_info_folder in result.files_created, str(result)
assert initools_folder in result.files_created, str(result)
def test_find_links_requirements_file_relative_path():
"""Test find-links as a relative path to a reqs file."""
e = reset_env()
write_file('test-req.txt', textwrap.dedent("""
script = reset_env()
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""
--no-index
--find-links=../../../data/packages/
parent==0.1
"""))
result = run_pip(
result = script.pip(
'install',
'-r',
e.scratch_path / "test-req.txt",
script.scratch_path / "test-req.txt",
cwd=tests_data)
egg_info_folder = e.site_packages / 'parent-0.1-py%s.egg-info' % pyversion
initools_folder = e.site_packages / 'parent'
egg_info_folder = script.site_packages / 'parent-0.1-py%s.egg-info' % pyversion
initools_folder = script.site_packages / 'parent'
assert egg_info_folder in result.files_created, str(result)
assert initools_folder in result.files_created, str(result)
@ -45,10 +45,10 @@ def test_install_from_file_index_hash_link():
"""
Test that a pkg can be installed from a file:// index using a link with a hash
"""
env = reset_env()
script = reset_env()
index_url = path_to_url(os.path.join(tests_data, 'indexes', 'simple'))
result = run_pip('install', '-i', index_url, 'simple==1.0')
egg_info_folder = env.site_packages / 'simple-1.0-py%s.egg-info' % pyversion
result = script.pip('install', '-i', index_url, 'simple==1.0')
egg_info_folder = script.site_packages / 'simple-1.0-py%s.egg-info' % pyversion
assert egg_info_folder in result.files_created, str(result)
@ -57,7 +57,7 @@ def test_file_index_url_quoting():
Test url quoting of file index url with a space
"""
index_url = path_to_url(os.path.join(tests_data, 'indexes', urllib.quote('in dex')))
env = reset_env()
result = run_pip('install', '-vvv', '--index-url', index_url, 'simple', expect_error=False)
assert (env.site_packages/'simple') in result.files_created, str(result.stdout)
assert (env.site_packages/'simple-1.0-py%s.egg-info' % pyversion) in result.files_created, str(result)
script = reset_env()
result = script.pip('install', '-vvv', '--index-url', index_url, 'simple', expect_error=False)
assert (script.site_packages/'simple') in result.files_created, str(result.stdout)
assert (script.site_packages/'simple-1.0-py%s.egg-info' % pyversion) in result.files_created, str(result)

View File

@ -7,8 +7,8 @@ from mock import patch
from pip.backwardcompat import urllib
from pip.req import Requirements, parse_editable, parse_requirements
from tests.lib import (reset_env, run_pip, write_file, pyversion, tests_data,
path_to_url, find_links)
from tests.lib import reset_env, pyversion, tests_data, path_to_url, find_links
from tests.lib.local_repos import local_checkout
from tests.lib.path import Path
@ -19,18 +19,18 @@ def test_requirements_file():
"""
other_lib_name, other_lib_version = 'anyjson', '0.3'
env = reset_env()
write_file('initools-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("initools-req.txt").write(textwrap.dedent("""\
INITools==0.2
# and something else to test out:
%s<=%s
""" % (other_lib_name, other_lib_version)))
result = run_pip('install', '-r', env.scratch_path / 'initools-req.txt')
assert env.site_packages/'INITools-0.2-py%s.egg-info' % pyversion in result.files_created
assert env.site_packages/'initools' in result.files_created
assert result.files_created[env.site_packages/other_lib_name].dir
result = script.pip('install', '-r', script.scratch_path / 'initools-req.txt')
assert script.site_packages/'INITools-0.2-py%s.egg-info' % pyversion in result.files_created
assert script.site_packages/'initools' in result.files_created
assert result.files_created[script.site_packages/other_lib_name].dir
fn = '%s-%s-py%s.egg-info' % (other_lib_name, other_lib_version, pyversion)
assert result.files_created[env.site_packages/fn].dir
assert result.files_created[script.site_packages/fn].dir
def test_schema_check_in_requirements_file():
@ -38,13 +38,13 @@ def test_schema_check_in_requirements_file():
Test installing from a requirements file with an invalid vcs schema..
"""
env = reset_env()
write_file('file-egg-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("file-egg-req.txt").write(textwrap.dedent("""\
git://github.com/alex/django-fixture-generator.git#egg=fixture_generator
"""))
with pytest.raises(AssertionError):
run_pip("install", "-vvv", "-r", env.scratch_path / "file-egg-req.txt")
script.pip("install", "-vvv", "-r", script.scratch_path / "file-egg-req.txt")
def test_relative_requirements_file():
@ -53,13 +53,13 @@ def test_relative_requirements_file():
"""
url = path_to_url(os.path.join(tests_data, 'packages', '..', 'packages', 'FSPkg')) + '#egg=FSPkg'
env = reset_env()
write_file('file-egg-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("file-egg-req.txt").write(textwrap.dedent("""\
%s
""" % url))
result = run_pip('install', '-vvv', '-r', env.scratch_path / 'file-egg-req.txt')
assert (env.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion) in result.files_created, str(result)
assert (env.site_packages/'fspkg') in result.files_created, str(result.stdout)
result = script.pip('install', '-vvv', '-r', script.scratch_path / 'file-egg-req.txt')
assert (script.site_packages/'FSPkg-0.1dev-py%s.egg-info' % pyversion) in result.files_created, str(result)
assert (script.site_packages/'fspkg') in result.files_created, str(result.stdout)
def test_multiple_requirements_files():
@ -68,30 +68,30 @@ def test_multiple_requirements_files():
"""
other_lib_name, other_lib_version = 'anyjson', '0.3'
env = reset_env()
write_file('initools-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("initools-req.txt").write(textwrap.dedent("""\
-e %s@10#egg=INITools-dev
-r %s-req.txt""" % (local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'),
other_lib_name)))
write_file('%s-req.txt' % other_lib_name, textwrap.dedent("""\
script.scratch_path.join("%s-req.txt" % other_lib_name).write(textwrap.dedent("""\
%s<=%s
""" % (other_lib_name, other_lib_version)))
result = run_pip('install', '-r', env.scratch_path / 'initools-req.txt')
assert result.files_created[env.site_packages/other_lib_name].dir
result = script.pip('install', '-r', script.scratch_path / 'initools-req.txt')
assert result.files_created[script.site_packages/other_lib_name].dir
fn = '%s-%s-py%s.egg-info' % (other_lib_name, other_lib_version, pyversion)
assert result.files_created[env.site_packages/fn].dir
assert env.venv/'src'/'initools' in result.files_created
assert result.files_created[script.site_packages/fn].dir
assert script.venv/'src'/'initools' in result.files_created
def test_respect_order_in_requirements_file():
env = reset_env()
write_file('frameworks-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("frameworks-req.txt").write(textwrap.dedent("""\
parent
child
simple
"""))
result = run_pip('install', '--no-index', '-f', find_links, '-r', env.scratch_path / 'frameworks-req.txt')
result = script.pip('install', '--no-index', '-f', find_links, '-r', script.scratch_path / 'frameworks-req.txt')
downloaded = [line for line in result.stdout.split('\n')
if 'Downloading/unpacking' in line]
@ -106,13 +106,9 @@ def test_respect_order_in_requirements_file():
def test_install_local_editable_with_extras():
env = reset_env()
script = reset_env()
to_install = os.path.abspath(os.path.join(tests_data, 'packages', 'LocalExtras'))
res = run_pip('install', '-e', to_install + '[bar]', expect_error=False)
assert env.site_packages/'easy-install.pth' in res.files_updated, str(result)
assert env.site_packages/'LocalExtras.egg-link' in res.files_created, str(result)
assert env.site_packages/'simple' in res.files_created, str(result)
res = script.pip('install', '-e', to_install + '[bar]', expect_error=False)
assert script.site_packages/'easy-install.pth' in res.files_updated, str(result)
assert script.site_packages/'LocalExtras.egg-link' in res.files_created, str(result)
assert script.site_packages/'simple' in res.files_created, str(result)

View File

@ -6,9 +6,9 @@ from os.path import join
import pytest
from tests.lib import (reset_env, run_pip, assert_all_changes, src_folder,
write_file, pyversion, _create_test_package, pip_install_local,
_change_test_package_version, path_to_url, find_links)
from tests.lib import (reset_env, assert_all_changes, src_folder, pyversion,
_create_test_package, _change_test_package_version,
find_links)
from tests.lib.local_repos import local_checkout
@ -17,9 +17,9 @@ def test_no_upgrade_unless_requested():
No upgrade if not specifically requested.
"""
reset_env()
run_pip('install', 'INITools==0.1', expect_error=True)
result = run_pip('install', 'INITools', expect_error=True)
script = reset_env()
script.pip('install', 'INITools==0.1', expect_error=True)
result = script.pip('install', 'INITools', expect_error=True)
assert not result.files_created, 'pip install INITools upgraded when it should not have'
@ -28,12 +28,12 @@ def test_upgrade_to_specific_version():
It does upgrade to specific version requested.
"""
env = reset_env()
run_pip('install', 'INITools==0.1', expect_error=True)
result = run_pip('install', 'INITools==0.2', expect_error=True)
script = reset_env()
script.pip('install', 'INITools==0.1', expect_error=True)
result = script.pip('install', 'INITools==0.2', expect_error=True)
assert result.files_created, 'pip install with specific version did not upgrade'
assert env.site_packages/'INITools-0.1-py%s.egg-info' % pyversion in result.files_deleted
assert env.site_packages/'INITools-0.2-py%s.egg-info' % pyversion in result.files_created
assert script.site_packages/'INITools-0.1-py%s.egg-info' % pyversion in result.files_deleted
assert script.site_packages/'INITools-0.2-py%s.egg-info' % pyversion in result.files_created
def test_upgrade_if_requested():
@ -41,11 +41,11 @@ def test_upgrade_if_requested():
And it does upgrade if requested.
"""
env = reset_env()
run_pip('install', 'INITools==0.1', expect_error=True)
result = run_pip('install', '--upgrade', 'INITools', expect_error=True)
script = reset_env()
script.pip('install', 'INITools==0.1', expect_error=True)
result = script.pip('install', '--upgrade', 'INITools', expect_error=True)
assert result.files_created, 'pip install --upgrade did not upgrade'
assert env.site_packages/'INITools-0.1-py%s.egg-info' % pyversion not in result.files_created
assert script.site_packages/'INITools-0.1-py%s.egg-info' % pyversion not in result.files_created
def test_upgrade_with_newest_already_installed():
@ -54,9 +54,9 @@ def test_upgrade_with_newest_already_installed():
not be reinstalled and the user should be informed.
"""
env = reset_env()
run_pip('install', '-f', find_links, '--no-index', 'simple')
result = run_pip('install', '--upgrade', '-f', find_links, '--no-index', 'simple')
script = reset_env()
script.pip('install', '-f', find_links, '--no-index', 'simple')
result = script.pip('install', '--upgrade', '-f', find_links, '--no-index', 'simple')
assert not result.files_created, 'simple upgraded when it should not have'
assert 'already up-to-date' in result.stdout, result.stdout
@ -67,13 +67,13 @@ def test_upgrade_force_reinstall_newest():
version if --force-reinstall is supplied.
"""
env = reset_env()
result = run_pip('install', 'INITools')
assert env.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('install', '--upgrade', '--force-reinstall', 'INITools')
script = reset_env()
result = script.pip('install', 'INITools')
assert script.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('install', '--upgrade', '--force-reinstall', 'INITools')
assert result2.files_updated, 'upgrade to INITools 0.3 failed'
result3 = run_pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [env.venv/'build', 'cache'])
result3 = script.pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [script.venv/'build', 'cache'])
def test_uninstall_before_upgrade():
@ -81,13 +81,13 @@ def test_uninstall_before_upgrade():
Automatic uninstall-before-upgrade.
"""
env = reset_env()
result = run_pip('install', 'INITools==0.2', expect_error=True)
assert env.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('install', 'INITools==0.3', expect_error=True)
script = reset_env()
result = script.pip('install', 'INITools==0.2', expect_error=True)
assert script.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('install', 'INITools==0.3', expect_error=True)
assert result2.files_created, 'upgrade to INITools 0.3 failed'
result3 = run_pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [env.venv/'build', 'cache'])
result3 = script.pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [script.venv/'build', 'cache'])
def test_uninstall_before_upgrade_from_url():
@ -95,13 +95,13 @@ def test_uninstall_before_upgrade_from_url():
Automatic uninstall-before-upgrade from URL.
"""
env = reset_env()
result = run_pip('install', 'INITools==0.2', expect_error=True)
assert env.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('install', 'http://pypi.python.org/packages/source/I/INITools/INITools-0.3.tar.gz', expect_error=True)
script = reset_env()
result = script.pip('install', 'INITools==0.2', expect_error=True)
assert script.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('install', 'http://pypi.python.org/packages/source/I/INITools/INITools-0.3.tar.gz', expect_error=True)
assert result2.files_created, 'upgrade to INITools 0.3 failed'
result3 = run_pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [env.venv/'build', 'cache'])
result3 = script.pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [script.venv/'build', 'cache'])
def test_upgrade_to_same_version_from_url():
@ -110,13 +110,13 @@ def test_upgrade_to_same_version_from_url():
need to uninstall and reinstall if --upgrade is not specified.
"""
env = reset_env()
result = run_pip('install', 'INITools==0.3', expect_error=True)
assert env.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('install', 'http://pypi.python.org/packages/source/I/INITools/INITools-0.3.tar.gz', expect_error=True)
script = reset_env()
result = script.pip('install', 'INITools==0.3', expect_error=True)
assert script.site_packages/ 'initools' in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('install', 'http://pypi.python.org/packages/source/I/INITools/INITools-0.3.tar.gz', expect_error=True)
assert not result2.files_updated, 'INITools 0.3 reinstalled same version'
result3 = run_pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [env.venv/'build', 'cache'])
result3 = script.pip('uninstall', 'initools', '-y', expect_error=True)
assert_all_changes(result, result3, [script.venv/'build', 'cache'])
def test_upgrade_from_reqs_file():
@ -124,21 +124,21 @@ def test_upgrade_from_reqs_file():
Upgrade from a requirements file.
"""
env = reset_env()
write_file('test-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""\
PyLogo<0.4
# and something else to test out:
INITools==0.3
"""))
install_result = run_pip('install', '-r', env.scratch_path/ 'test-req.txt')
write_file('test-req.txt', textwrap.dedent("""\
install_result = script.pip('install', '-r', script.scratch_path/ 'test-req.txt')
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""\
PyLogo
# and something else to test out:
INITools
"""))
run_pip('install', '--upgrade', '-r', env.scratch_path/ 'test-req.txt')
uninstall_result = run_pip('uninstall', '-r', env.scratch_path/ 'test-req.txt', '-y')
assert_all_changes(install_result, uninstall_result, [env.venv/'build', 'cache', env.scratch/'test-req.txt'])
script.pip('install', '--upgrade', '-r', script.scratch_path/ 'test-req.txt')
uninstall_result = script.pip('uninstall', '-r', script.scratch_path/ 'test-req.txt', '-y')
assert_all_changes(install_result, uninstall_result, [script.venv/'build', 'cache', script.scratch/'test-req.txt'])
def test_uninstall_rollback():
@ -147,13 +147,13 @@ def test_uninstall_rollback():
crafted to fail on install).
"""
env = reset_env()
result = run_pip('install', '-f', find_links, '--no-index', 'broken==0.1')
assert env.site_packages / 'broken.py' in result.files_created, list(result.files_created.keys())
result2 = run_pip('install', '-f', find_links, '--no-index', 'broken==0.2broken', expect_error=True)
script = reset_env()
result = script.pip('install', '-f', find_links, '--no-index', 'broken==0.1')
assert script.site_packages / 'broken.py' in result.files_created, list(result.files_created.keys())
result2 = script.pip('install', '-f', find_links, '--no-index', 'broken==0.2broken', expect_error=True)
assert result2.returncode == 1, str(result2)
assert env.run('python', '-c', "import broken; print(broken.VERSION)").stdout == '0.1\n'
assert_all_changes(result.files_after, result2, [env.venv/'build', 'pip-log.txt'])
assert script.run('python', '-c', "import broken; print(broken.VERSION)").stdout == '0.1\n'
assert_all_changes(result.files_after, result2, [script.venv/'build', 'pip-log.txt'])
# Issue #530 - temporarily disable flaky test
@pytest.mark.skipif
@ -162,14 +162,14 @@ def test_editable_git_upgrade():
Test installing an editable git package from a repository, upgrading the repository,
installing again, and check it gets the newer version
"""
env = reset_env()
version_pkg_path = _create_test_package(env)
run_pip('install', '-e', '%s#egg=version_pkg' % ('git+file://' + version_pkg_path))
version = env.run('version_pkg')
script = reset_env()
version_pkg_path = _create_test_package(script)
script.pip('install', '-e', '%s#egg=version_pkg' % ('git+file://' + version_pkg_path))
version = script.run('version_pkg')
assert '0.1' in version.stdout
_change_test_package_version(env, version_pkg_path)
run_pip('install', '-e', '%s#egg=version_pkg' % ('git+file://' + version_pkg_path))
version2 = env.run('version_pkg')
_change_test_package_version(script, version_pkg_path)
script.pip('install', '-e', '%s#egg=version_pkg' % ('git+file://' + version_pkg_path))
version2 = script.run('version_pkg')
assert 'some different version' in version2.stdout, "Output: %s" % (version2.stdout)
@ -178,12 +178,12 @@ def test_should_not_install_always_from_cache():
If there is an old cached package, pip should download the newer version
Related to issue #175
"""
env = reset_env()
run_pip('install', 'INITools==0.2', expect_error=True)
run_pip('uninstall', '-y', 'INITools')
result = run_pip('install', 'INITools==0.1', expect_error=True)
assert env.site_packages/'INITools-0.2-py%s.egg-info' % pyversion not in result.files_created
assert env.site_packages/'INITools-0.1-py%s.egg-info' % pyversion in result.files_created
script = reset_env()
script.pip('install', 'INITools==0.2', expect_error=True)
script.pip('uninstall', '-y', 'INITools')
result = script.pip('install', 'INITools==0.1', expect_error=True)
assert script.site_packages/'INITools-0.2-py%s.egg-info' % pyversion not in result.files_created
assert script.site_packages/'INITools-0.1-py%s.egg-info' % pyversion in result.files_created
def test_install_with_ignoreinstalled_requested():
@ -191,30 +191,30 @@ def test_install_with_ignoreinstalled_requested():
It installs package if ignore installed is set.
"""
env = reset_env()
run_pip('install', 'INITools==0.1', expect_error=True)
result = run_pip('install', '-I', 'INITools', expect_error=True)
script = reset_env()
script.pip('install', 'INITools==0.1', expect_error=True)
result = script.pip('install', '-I', 'INITools', expect_error=True)
assert result.files_created, 'pip install -I did not install'
assert env.site_packages/'INITools-0.1-py%s.egg-info' % pyversion not in result.files_created
assert script.site_packages/'INITools-0.1-py%s.egg-info' % pyversion not in result.files_created
def test_upgrade_vcs_req_with_no_dists_found():
"""It can upgrade a VCS requirement that has no distributions otherwise."""
reset_env()
script = reset_env()
req = "%s#egg=pip-test-package" % local_checkout(
"git+http://github.com/pypa/pip-test-package.git")
run_pip("install", req)
result = run_pip("install", "-U", req)
script.pip("install", req)
result = script.pip("install", "-U", req)
assert not result.returncode
def test_upgrade_vcs_req_with_dist_found():
"""It can upgrade a VCS requirement that has distributions on the index."""
reset_env()
script = reset_env()
# TODO(pnasrat) Using local_checkout fails on windows - oddness with the test path urls/git.
req = "%s#egg=virtualenv" % "git+git://github.com/pypa/virtualenv@c21fef2c2d53cf19f49bcc37f9c058a33fb50499"
run_pip("install", req)
result = run_pip("install", "-U", req)
script.pip("install", req)
result = script.pip("install", "-U", req)
assert not "pypi.python.org" in result.stdout, result.stdout
@ -227,56 +227,56 @@ class TestUpgradeSetuptools(object):
"""
def prep_ve(self, version, distribute=False):
self.env = reset_env(pypi_cache=False)
pip_install_local('virtualenv==%s' %version)
args = ['virtualenv', self.env.scratch_path/'VE']
self.script = reset_env()
self.script.pip_install_local('virtualenv==%s' %version)
args = ['virtualenv', self.script.scratch_path/'VE']
if distribute:
args.insert(1, '--distribute')
self.env.run(*args)
self.ve_bin = self.env.scratch_path/'VE'/'bin'
self.env.run(self.ve_bin/'pip', 'uninstall', '-y', 'pip')
self.env.run(self.ve_bin/'python', 'setup.py', 'install', cwd=src_folder, expect_stderr=True)
self.script.run(*args)
self.ve_bin = self.script.scratch_path/'VE'/'bin'
self.script.run(self.ve_bin/'pip', 'uninstall', '-y', 'pip')
self.script.run(self.ve_bin/'python', 'setup.py', 'install', cwd=src_folder, expect_stderr=True)
@pytest.mark.skipif("sys.version_info >= (3,0)")
def test_py2_from_setuptools_6_to_setuptools_7(self):
self.prep_ve('1.9.1')
result = self.env.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.script.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
assert "Found existing installation: setuptools 0.6c11" in result.stdout
result = self.env.run(self.ve_bin/'pip', 'list')
result = self.script.run(self.ve_bin/'pip', 'list')
"setuptools (0.9.8)" in result.stdout
def test_py2_py3_from_distribute_6_to_setuptools_7(self):
self.prep_ve('1.9.1', distribute=True)
result = self.env.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.script.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
assert "Found existing installation: distribute 0.6.34" in result.stdout
result = self.env.run(self.ve_bin/'pip', 'list')
result = self.script.run(self.ve_bin/'pip', 'list')
"setuptools (0.9.8)" in result.stdout
"distribute (0.7.3)" in result.stdout
def test_from_setuptools_7_to_setuptools_7(self):
self.prep_ve('1.10')
result = self.env.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.script.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
assert "Found existing installation: setuptools 0.9.7" in result.stdout
result = self.env.run(self.ve_bin/'pip', 'list')
result = self.script.run(self.ve_bin/'pip', 'list')
"setuptools (0.9.8)" in result.stdout
def test_from_setuptools_7_to_setuptools_7_using_wheel(self):
self.prep_ve('1.10')
result = self.env.run(self.ve_bin/'pip', 'install', '--use-wheel', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.script.run(self.ve_bin/'pip', 'install', '--use-wheel', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
assert "Found existing installation: setuptools 0.9.7" in result.stdout
assert 'setuptools-0.9.8.dist-info' in str(result.files_created) #only wheels use dist-info
result = self.env.run(self.ve_bin/'pip', 'list')
result = self.script.run(self.ve_bin/'pip', 'list')
"setuptools (0.9.8)" in result.stdout
def test_from_setuptools_7_to_setuptools_7_with_distribute_7_installed(self):
self.prep_ve('1.9.1', distribute=True)
result = self.env.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.env.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, 'setuptools==0.9.6')
result = self.env.run(self.ve_bin/'pip', 'list')
result = self.script.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.script.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, 'setuptools==0.9.6')
result = self.script.run(self.ve_bin/'pip', 'list')
"setuptools (0.9.6)" in result.stdout
"distribute (0.7.3)" in result.stdout
result = self.env.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
result = self.script.run(self.ve_bin/'pip', 'install', '--no-index', '--find-links=%s' % find_links, '-U', 'setuptools')
assert "Found existing installation: setuptools 0.9.6" in result.stdout
result = self.env.run(self.ve_bin/'pip', 'list')
result = self.script.run(self.ve_bin/'pip', 'list')
"setuptools (0.9.8)" in result.stdout
"distribute (0.7.3)" in result.stdout

View File

@ -1,24 +1,41 @@
"""
tests specific to "--user" option
"""
import imp
import sys
import os
import textwrap
from os.path import abspath, join, curdir, isdir, isfile
import pytest
from pip.backwardcompat import uses_pycache
from tests.lib.local_repos import local_checkout
from tests.lib import (tests_data, reset_env, run_pip, pyversion, assert_all_changes,
path_to_url, find_links, pip_install_local)
from tests.lib import (tests_data, reset_env, pyversion, assert_all_changes,
find_links)
patch_dist_in_site_packages = """
def dist_in_site_packages(dist):
return False
from pip import req
req.dist_in_site_packages=dist_in_site_packages
"""
def _patch_dist_in_site_packages(script):
sitecustomize_path = script.lib_path.join("sitecustomize.py")
sitecustomize_path.write(textwrap.dedent("""
def dist_in_site_packages(dist):
return False
from pip import req
req.dist_in_site_packages = dist_in_site_packages
"""))
# Caught py32 with an outdated __pycache__ file after a sitecustomize
# update (after python should have updated it) so will delete the cache
# file to be sure
# See: https://github.com/pypa/pip/pull/893#issuecomment-16426701
if uses_pycache:
cache_path = imp.cache_from_source(sitecustomize_path)
if os.path.isfile(cache_path):
os.remove(cache_path)
# --user option is broken in pypy
@ -29,9 +46,9 @@ class Tests_UserSite:
"""
reset_env(system_site_packages=True) produces env where a --user install can be found using pkg_resources
"""
env = reset_env(system_site_packages=True)
run_pip('install', '--user', 'INITools==0.2')
result = env.run('python', '-c', "import pkg_resources; print(pkg_resources.get_distribution('initools').project_name)")
script = reset_env(system_site_packages=True)
script.pip('install', '--user', 'INITools==0.2')
result = script.run('python', '-c', "import pkg_resources; print(pkg_resources.get_distribution('initools').project_name)")
project_name = result.stdout.strip()
assert 'INITools'== project_name, "'%s' should be 'INITools'" %project_name
@ -40,8 +57,8 @@ class Tests_UserSite:
"""
Test installing current directory ('.') into usersite after installing distribute
"""
env = reset_env(system_site_packages=True)
result = run_pip('install', '--user', '-e',
script = reset_env(system_site_packages=True)
result = script.pip('install', '--user', '-e',
'%s#egg=initools-dev' %
local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'))
result.assert_installed('INITools', use_user_site=True)
@ -51,11 +68,11 @@ class Tests_UserSite:
"""
Test installing current directory ('.') into usersite
"""
env = reset_env(system_site_packages=True)
script = reset_env(system_site_packages=True)
run_from = abspath(join(tests_data, 'packages', 'FSPkg'))
result = run_pip('install', '--user', curdir, cwd=run_from, expect_error=False)
fspkg_folder = env.user_site/'fspkg'
egg_info_folder = env.user_site/'FSPkg-0.1dev-py%s.egg-info' % pyversion
result = script.pip('install', '--user', curdir, cwd=run_from, expect_error=False)
fspkg_folder = script.user_site/'fspkg'
egg_info_folder = script.user_site/'FSPkg-0.1dev-py%s.egg-info' % pyversion
assert fspkg_folder in result.files_created, str(result.stdout)
assert egg_info_folder in result.files_created, str(result)
@ -65,9 +82,9 @@ class Tests_UserSite:
"""
user install in virtualenv (with no system packages) fails with message
"""
env = reset_env()
script = reset_env()
run_from = abspath(join(tests_data, 'packages', 'FSPkg'))
result = run_pip('install', '--user', curdir, cwd=run_from, expect_error=True)
result = script.pip('install', '--user', curdir, cwd=run_from, expect_error=True)
assert "Can not perform a '--user' install. User site-packages are not visible in this virtualenv." in result.stdout
@ -76,13 +93,13 @@ class Tests_UserSite:
Test user install with conflict in usersite updates usersite.
"""
env = reset_env(system_site_packages=True)
result1 = run_pip('install', '--user', 'INITools==0.3')
result2 = run_pip('install', '--user', 'INITools==0.1')
script = reset_env(system_site_packages=True)
result1 = script.pip('install', '--user', 'INITools==0.3')
result2 = script.pip('install', '--user', 'INITools==0.1')
#usersite has 0.1
egg_info_folder = env.user_site / 'INITools-0.1-py%s.egg-info' % pyversion
initools_v3_file = env.root_path / env.user_site / 'initools' / 'configparser.py' #file only in 0.3
egg_info_folder = script.user_site / 'INITools-0.1-py%s.egg-info' % pyversion
initools_v3_file = script.base_path / script.user_site / 'initools' / 'configparser.py' #file only in 0.3
assert egg_info_folder in result2.files_created, str(result2)
assert not isfile(initools_v3_file), initools_v3_file
@ -99,21 +116,22 @@ class Tests_UserSite:
# if we don't patch this, pip will return an installation error: "Will not install to the usersite because it will lack sys.path precedence..."
# 2) adding usersite to PYTHONPATH, so usersite as sys.path precedence over the virtualenv site
env = reset_env(system_site_packages=True, sitecustomize=patch_dist_in_site_packages)
env.environ["PYTHONPATH"] = env.root_path / env.user_site
script = reset_env(system_site_packages=True)
script.environ["PYTHONPATH"] = script.base_path / script.user_site
_patch_dist_in_site_packages(script)
result1 = run_pip('install', 'INITools==0.2')
result2 = run_pip('install', '--user', 'INITools==0.1')
result1 = script.pip('install', 'INITools==0.2')
result2 = script.pip('install', '--user', 'INITools==0.1')
#usersite has 0.1
egg_info_folder = env.user_site / 'INITools-0.1-py%s.egg-info' % pyversion
initools_folder = env.user_site / 'initools'
egg_info_folder = script.user_site / 'INITools-0.1-py%s.egg-info' % pyversion
initools_folder = script.user_site / 'initools'
assert egg_info_folder in result2.files_created, str(result2)
assert initools_folder in result2.files_created, str(result2)
#site still has 0.2 (can't look in result1; have to check)
egg_info_folder = env.root_path / env.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = env.root_path / env.site_packages / 'initools'
egg_info_folder = script.base_path / script.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = script.base_path / script.site_packages / 'initools'
assert isdir(egg_info_folder)
assert isdir(initools_folder)
@ -130,21 +148,22 @@ class Tests_UserSite:
# if we don't patch this, pip will return an installation error: "Will not install to the usersite because it will lack sys.path precedence..."
# 2) adding usersite to PYTHONPATH, so usersite as sys.path precedence over the virtualenv site
env = reset_env(system_site_packages=True, sitecustomize=patch_dist_in_site_packages)
env.environ["PYTHONPATH"] = env.root_path / env.user_site
script = reset_env(system_site_packages=True)
script.environ["PYTHONPATH"] = script.base_path / script.user_site
_patch_dist_in_site_packages(script)
result1 = run_pip('install', 'INITools==0.2')
result2 = run_pip('install', '--user', '--upgrade', 'INITools')
result1 = script.pip('install', 'INITools==0.2')
result2 = script.pip('install', '--user', '--upgrade', 'INITools')
#usersite has 0.3.1
egg_info_folder = env.user_site / 'INITools-0.3.1-py%s.egg-info' % pyversion
initools_folder = env.user_site / 'initools'
egg_info_folder = script.user_site / 'INITools-0.3.1-py%s.egg-info' % pyversion
initools_folder = script.user_site / 'initools'
assert egg_info_folder in result2.files_created, str(result2)
assert initools_folder in result2.files_created, str(result2)
#site still has 0.2 (can't look in result1; have to check)
egg_info_folder = env.root_path / env.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = env.root_path / env.site_packages / 'initools'
egg_info_folder = script.base_path / script.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = script.base_path / script.site_packages / 'initools'
assert isdir(egg_info_folder), result2.stdout
assert isdir(initools_folder)
@ -161,22 +180,23 @@ class Tests_UserSite:
# if we don't patch this, pip will return an installation error: "Will not install to the usersite because it will lack sys.path precedence..."
# 2) adding usersite to PYTHONPATH, so usersite as sys.path precedence over the virtualenv site
env = reset_env(system_site_packages=True, sitecustomize=patch_dist_in_site_packages)
env.environ["PYTHONPATH"] = env.root_path / env.user_site
script = reset_env(system_site_packages=True)
script.environ["PYTHONPATH"] = script.base_path / script.user_site
_patch_dist_in_site_packages(script)
result1 = run_pip('install', 'INITools==0.2')
result2 = run_pip('install', '--user', 'INITools==0.3')
result3 = run_pip('install', '--user', 'INITools==0.1')
result1 = script.pip('install', 'INITools==0.2')
result2 = script.pip('install', '--user', 'INITools==0.3')
result3 = script.pip('install', '--user', 'INITools==0.1')
#usersite has 0.1
egg_info_folder = env.user_site / 'INITools-0.1-py%s.egg-info' % pyversion
initools_v3_file = env.root_path / env.user_site / 'initools' / 'configparser.py' #file only in 0.3
egg_info_folder = script.user_site / 'INITools-0.1-py%s.egg-info' % pyversion
initools_v3_file = script.base_path / script.user_site / 'initools' / 'configparser.py' #file only in 0.3
assert egg_info_folder in result3.files_created, str(result3)
assert not isfile(initools_v3_file), initools_v3_file
#site still has 0.2 (can't just look in result1; have to check)
egg_info_folder = env.root_path / env.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = env.root_path / env.site_packages / 'initools'
egg_info_folder = script.base_path / script.site_packages / 'INITools-0.2-py%s.egg-info' % pyversion
initools_folder = script.base_path / script.site_packages / 'initools'
assert isdir(egg_info_folder)
assert isdir(initools_folder)
@ -185,10 +205,10 @@ class Tests_UserSite:
"""
Test user install in --system-site-packages virtualenv with conflict in site fails.
"""
env = reset_env(system_site_packages=True)
result1 = run_pip('install', 'INITools==0.2')
result2 = run_pip('install', '--user', 'INITools==0.1', expect_error=True)
resultp = env.run('python', '-c', "import pkg_resources; print(pkg_resources.get_distribution('initools').location)")
script = reset_env(system_site_packages=True)
result1 = script.pip('install', 'INITools==0.2')
result2 = script.pip('install', '--user', 'INITools==0.1', expect_error=True)
resultp = script.run('python', '-c', "import pkg_resources; print(pkg_resources.get_distribution('initools').location)")
dist_location = resultp.stdout.strip()
assert "Will not install to the user site because it will lack sys.path precedence to %s in %s" \
% ('INITools', dist_location) in result2.stdout, result2.stdout
@ -198,41 +218,40 @@ class Tests_UserSite:
"""
Test uninstall from usersite
"""
env = reset_env(system_site_packages=True)
result1 = run_pip('install', '--user', 'INITools==0.3')
result2 = run_pip('uninstall', '-y', 'INITools')
assert_all_changes(result1, result2, [env.venv/'build', 'cache'])
script = reset_env(system_site_packages=True)
result1 = script.pip('install', '--user', 'INITools==0.3')
result2 = script.pip('uninstall', '-y', 'INITools')
assert_all_changes(result1, result2, [script.venv/'build', 'cache'])
def test_uninstall_editable_from_usersite(self):
"""
Test uninstall editable local user install
"""
env = reset_env(system_site_packages=True)
script = reset_env(system_site_packages=True)
script.user_site_path.makedirs()
#install
to_install = abspath(join(tests_data, 'packages', 'FSPkg'))
result1 = run_pip('install', '--user', '-e', to_install, expect_error=False)
egg_link = env.user_site/'FSPkg.egg-link'
result1 = script.pip('install', '--user', '-e', to_install, expect_error=False)
egg_link = script.user_site/'FSPkg.egg-link'
assert egg_link in result1.files_created, str(result1.stdout)
#uninstall
result2 = run_pip('uninstall', '-y', 'FSPkg')
assert not isfile(env.root_path / egg_link)
result2 = script.pip('uninstall', '-y', 'FSPkg')
assert not isfile(script.base_path / egg_link)
assert_all_changes(result1, result2,
[env.venv/'build', 'cache', env.user_site/'easy-install.pth'])
[script.venv/'build', 'cache', script.user_site/'easy-install.pth'])
def test_install_user_wheel(self):
"""
Test user install from wheel
"""
env = reset_env(system_site_packages=True)
pip_install_local('wheel')
result = run_pip('install', 'simple.dist==0.1', '--user', '--use-wheel',
script = reset_env(system_site_packages=True)
script.pip_install_local('wheel')
result = script.pip('install', 'simple.dist==0.1', '--user', '--use-wheel',
'--no-index', '--find-links='+find_links)
egg_info_folder = env.user_site / 'simple.dist-0.1.dist-info'
egg_info_folder = script.user_site / 'simple.dist-0.1.dist-info'
assert egg_info_folder in result.files_created, str(result)

View File

@ -1,4 +1,4 @@
from tests.lib import (reset_env, run_pip,
from tests.lib import (reset_env,
_create_test_package, _change_test_package_version)
from tests.lib.local_repos import local_checkout
@ -7,8 +7,8 @@ def test_install_editable_from_git_with_https():
"""
Test cloning from Git with https.
"""
reset_env()
result = run_pip('install', '-e',
script = reset_env()
result = script.pip('install', '-e',
'%s#egg=pip-test-package' %
local_checkout('git+https://github.com/pypa/pip-test-package.git'),
expect_error=True)
@ -19,12 +19,12 @@ def test_git_with_sha1_revisions():
"""
Git backend should be able to install from SHA1 revisions
"""
env = reset_env()
version_pkg_path = _create_test_package(env)
_change_test_package_version(env, version_pkg_path)
sha1 = env.run('git', 'rev-parse', 'HEAD~1', cwd=version_pkg_path).stdout.strip()
run_pip('install', '-e', '%s@%s#egg=version_pkg' % ('git+file://' + version_pkg_path.abspath.replace('\\', '/'), sha1))
version = env.run('version_pkg')
script = reset_env()
version_pkg_path = _create_test_package(script)
_change_test_package_version(script, version_pkg_path)
sha1 = script.run('git', 'rev-parse', 'HEAD~1', cwd=version_pkg_path).stdout.strip()
script.pip('install', '-e', '%s@%s#egg=version_pkg' % ('git+file://' + version_pkg_path.abspath.replace('\\', '/'), sha1))
version = script.run('version_pkg')
assert '0.1' in version.stdout, version.stdout
@ -32,12 +32,12 @@ def test_git_with_branch_name_as_revision():
"""
Git backend should be able to install from branch names
"""
env = reset_env()
version_pkg_path = _create_test_package(env)
env.run('git', 'checkout', '-b', 'test_branch', expect_stderr=True, cwd=version_pkg_path)
_change_test_package_version(env, version_pkg_path)
run_pip('install', '-e', '%s@test_branch#egg=version_pkg' % ('git+file://' + version_pkg_path.abspath.replace('\\', '/')))
version = env.run('version_pkg')
script = reset_env()
version_pkg_path = _create_test_package(script)
script.run('git', 'checkout', '-b', 'test_branch', expect_stderr=True, cwd=version_pkg_path)
_change_test_package_version(script, version_pkg_path)
script.pip('install', '-e', '%s@test_branch#egg=version_pkg' % ('git+file://' + version_pkg_path.abspath.replace('\\', '/')))
version = script.run('version_pkg')
assert 'some different version' in version.stdout
@ -45,12 +45,12 @@ def test_git_with_tag_name_as_revision():
"""
Git backend should be able to install from tag names
"""
env = reset_env()
version_pkg_path = _create_test_package(env)
env.run('git', 'tag', 'test_tag', expect_stderr=True, cwd=version_pkg_path)
_change_test_package_version(env, version_pkg_path)
run_pip('install', '-e', '%s@test_tag#egg=version_pkg' % ('git+file://' + version_pkg_path.abspath.replace('\\', '/')))
version = env.run('version_pkg')
script = reset_env()
version_pkg_path = _create_test_package(script)
script.run('git', 'tag', 'test_tag', expect_stderr=True, cwd=version_pkg_path)
_change_test_package_version(script, version_pkg_path)
script.pip('install', '-e', '%s@test_tag#egg=version_pkg' % ('git+file://' + version_pkg_path.abspath.replace('\\', '/')))
version = script.run('version_pkg')
assert '0.1' in version.stdout
@ -58,12 +58,12 @@ def test_git_with_tag_name_and_update():
"""
Test cloning a git repository and updating to a different version.
"""
reset_env()
result = run_pip('install', '-e', '%s#egg=pip-test-package' %
script = reset_env()
result = script.pip('install', '-e', '%s#egg=pip-test-package' %
local_checkout('git+http://github.com/pypa/pip-test-package.git'),
expect_error=True)
result.assert_installed('pip-test-package', with_files=['.git'])
result = run_pip('install', '--global-option=--version', '-e',
result = script.pip('install', '--global-option=--version', '-e',
'%s@0.1.2#egg=pip-test-package' %
local_checkout('git+http://github.com/pypa/pip-test-package.git'),
expect_error=True)
@ -75,12 +75,12 @@ def test_git_branch_should_not_be_changed():
Editable installations should not change branch
related to issue #32 and #161
"""
env = reset_env()
run_pip('install', '-e', '%s#egg=pip-test-package' %
script = reset_env()
script.pip('install', '-e', '%s#egg=pip-test-package' %
local_checkout('git+http://github.com/pypa/pip-test-package.git'),
expect_error=True)
source_dir = env.venv_path/'src'/'pip-test-package'
result = env.run('git', 'branch', cwd=source_dir)
source_dir = script.venv_path/'src'/'pip-test-package'
result = script.run('git', 'branch', cwd=source_dir)
assert '* master' in result.stdout, result.stdout
@ -88,8 +88,8 @@ def test_git_with_non_editable_unpacking():
"""
Test cloning a git repository from a non-editable URL with a given tag.
"""
reset_env()
result = run_pip('install', '--global-option=--version', local_checkout(
script = reset_env()
result = script.pip('install', '--global-option=--version', local_checkout(
'git+http://github.com/pypa/pip-test-package.git@0.1.2#egg=pip-test-package'
), expect_error=True)
assert '0.1.2' in result.stdout
@ -99,8 +99,8 @@ def test_git_with_editable_where_egg_contains_dev_string():
"""
Test cloning a git repository from an editable url which contains "dev" string
"""
reset_env()
result = run_pip('install', '-e', '%s#egg=django-devserver' %
script = reset_env()
result = script.pip('install', '-e', '%s#egg=django-devserver' %
local_checkout('git+git://github.com/dcramer/django-devserver.git'))
result.assert_installed('django-devserver', with_files=['.git'])
@ -109,10 +109,10 @@ def test_git_with_non_editable_where_egg_contains_dev_string():
"""
Test cloning a git repository from a non-editable url which contains "dev" string
"""
env = reset_env()
result = run_pip('install', '%s#egg=django-devserver' %
script = reset_env()
result = script.pip('install', '%s#egg=django-devserver' %
local_checkout('git+git://github.com/dcramer/django-devserver.git'))
devserver_folder = env.site_packages/'devserver'
devserver_folder = script.site_packages/'devserver'
assert devserver_folder in result.files_created, str(result)
@ -120,11 +120,11 @@ def test_git_with_ambiguous_revs():
"""
Test git with two "names" (tag/branch) pointing to the same commit
"""
env = reset_env()
version_pkg_path = _create_test_package(env)
script = reset_env()
version_pkg_path = _create_test_package(script)
package_url = 'git+file://%s@0.1#egg=version_pkg' % (version_pkg_path.abspath.replace('\\', '/'))
env.run('git', 'tag', '0.1', cwd=version_pkg_path)
result = run_pip('install', '-e', package_url)
script.run('git', 'tag', '0.1', cwd=version_pkg_path)
result = script.pip('install', '-e', package_url)
assert 'Could not find a tag or branch' not in result.stdout
# it is 'version-pkg' instead of 'version_pkg' because
# egg-link name is version-pkg.egg-link because it is a single .py module
@ -133,14 +133,12 @@ def test_git_with_ambiguous_revs():
def test_git_works_with_editable_non_origin_repo():
# set up, create a git repo and install it as editable from a local directory path
env = reset_env()
version_pkg_path = _create_test_package(env)
run_pip('install', '-e', version_pkg_path.abspath)
script = reset_env()
version_pkg_path = _create_test_package(script)
script.pip('install', '-e', version_pkg_path.abspath)
# 'freeze'ing this should not fall over, but should result in stderr output warning
result = run_pip('freeze', expect_stderr=True)
result = script.pip('freeze', expect_stderr=True)
assert "Error when trying to get requirement" in result.stderr
assert "Could not determine repository location" in result.stdout
assert "version-pkg==0.1" in result.stdout

View File

@ -5,8 +5,7 @@ import pytest
from mock import patch
from pip.vcs.git import Git
from tests.lib import (reset_env, run_pip,
_create_test_package,)
from tests.lib import reset_env, _create_test_package
from tests.lib.git_submodule_helpers import (
_change_test_package_submodule,
_pull_in_submodule_changes_to_module,
@ -15,11 +14,11 @@ from tests.lib.git_submodule_helpers import (
def test_get_refs_should_return_tag_name_and_commit_pair():
env = reset_env()
version_pkg_path = _create_test_package(env)
env.run('git', 'tag', '0.1', cwd=version_pkg_path)
env.run('git', 'tag', '0.2', cwd=version_pkg_path)
commit = env.run('git', 'rev-parse', 'HEAD',
script = reset_env()
version_pkg_path = _create_test_package(script)
script.run('git', 'tag', '0.1', cwd=version_pkg_path)
script.run('git', 'tag', '0.2', cwd=version_pkg_path)
commit = script.run('git', 'rev-parse', 'HEAD',
cwd=version_pkg_path).stdout.strip()
git = Git()
result = git.get_refs(version_pkg_path)
@ -28,10 +27,10 @@ def test_get_refs_should_return_tag_name_and_commit_pair():
def test_get_refs_should_return_branch_name_and_commit_pair():
env = reset_env()
version_pkg_path = _create_test_package(env)
env.run('git', 'branch', 'branch0.1', cwd=version_pkg_path)
commit = env.run('git', 'rev-parse', 'HEAD',
script = reset_env()
version_pkg_path = _create_test_package(script)
script.run('git', 'branch', 'branch0.1', cwd=version_pkg_path)
commit = script.run('git', 'rev-parse', 'HEAD',
cwd=version_pkg_path).stdout.strip()
git = Git()
result = git.get_refs(version_pkg_path)
@ -40,13 +39,13 @@ def test_get_refs_should_return_branch_name_and_commit_pair():
def test_get_refs_should_ignore_no_branch():
env = reset_env()
version_pkg_path = _create_test_package(env)
env.run('git', 'branch', 'branch0.1', cwd=version_pkg_path)
commit = env.run('git', 'rev-parse', 'HEAD',
script = reset_env()
version_pkg_path = _create_test_package(script)
script.run('git', 'branch', 'branch0.1', cwd=version_pkg_path)
commit = script.run('git', 'rev-parse', 'HEAD',
cwd=version_pkg_path).stdout.strip()
# current branch here is "* (nobranch)"
env.run('git', 'checkout', commit,
script.run('git', 'checkout', commit,
cwd=version_pkg_path, expect_stderr=True)
git = Git()
result = git.get_refs(version_pkg_path)
@ -88,17 +87,16 @@ def test_check_submodule_addition():
Submodules are pulled in on install and updated on upgrade.
"""
env = reset_env()
module_path, submodule_path = _create_test_package_with_submodule(env)
script = reset_env()
module_path, submodule_path = _create_test_package_with_submodule(script)
install_result = run_pip('install', '-e', 'git+'+module_path+'#egg=version_pkg')
install_result = script.pip('install', '-e', 'git+'+module_path+'#egg=version_pkg')
assert '.virtualenv/src/version-pkg/testpkg/static/testfile' in install_result.files_created
_change_test_package_submodule(env, submodule_path)
_pull_in_submodule_changes_to_module(env, module_path)
_change_test_package_submodule(script, submodule_path)
_pull_in_submodule_changes_to_module(script, module_path)
# expect error because git may write to stderr
update_result = run_pip('install', '-e', 'git+'+module_path+'#egg=version_pkg', '--upgrade', expect_error=True)
assert env.venv/'src/version-pkg/testpkg/static/testfile2' in update_result.files_created
update_result = script.pip('install', '-e', 'git+'+module_path+'#egg=version_pkg', '--upgrade', expect_error=True)
assert script.venv/'src/version-pkg/testpkg/static/testfile2' in update_result.files_created

View File

@ -1,6 +1,6 @@
from os.path import abspath, join
from tests.lib import tests_data, reset_env, run_pip, pip_install_local, find_links
from tests.lib import tests_data, reset_env, find_links
from tests.lib.path import Path
@ -8,11 +8,11 @@ def test_install_from_wheel():
"""
Test installing from a wheel.
"""
env = reset_env()
result = run_pip('install', 'simple.dist', '--use-wheel',
script = reset_env()
result = script.pip('install', 'simple.dist', '--use-wheel',
'--no-index', '--find-links='+find_links,
expect_error=False)
dist_info_folder = env.site_packages/'simple.dist-0.1.dist-info'
dist_info_folder = script.site_packages/'simple.dist-0.1.dist-info'
assert dist_info_folder in result.files_created, (dist_info_folder,
result.files_created,
result.stdout)
@ -22,15 +22,15 @@ def test_install_from_wheel_with_extras():
"""
Test installing from a wheel with extras.
"""
env = reset_env()
result = run_pip('install', 'complex-dist[simple]', '--use-wheel',
script = reset_env()
result = script.pip('install', 'complex-dist[simple]', '--use-wheel',
'--no-index', '--find-links='+find_links,
expect_error=False)
dist_info_folder = env.site_packages/'complex_dist-0.1.dist-info'
dist_info_folder = script.site_packages/'complex_dist-0.1.dist-info'
assert dist_info_folder in result.files_created, (dist_info_folder,
result.files_created,
result.stdout)
dist_info_folder = env.site_packages/'simple.dist-0.1.dist-info'
dist_info_folder = script.site_packages/'simple.dist-0.1.dist-info'
assert dist_info_folder in result.files_created, (dist_info_folder,
result.files_created,
result.stdout)
@ -40,12 +40,12 @@ def test_install_from_wheel_file():
"""
Test installing directly from a wheel file.
"""
env = reset_env()
script = reset_env()
package = abspath(join(tests_data,
'packages',
'headers.dist-0.1-py2.py3-none-any.whl'))
result = run_pip('install', package, '--no-index', expect_error=False)
dist_info_folder = env.site_packages/'headers.dist-0.1.dist-info'
result = script.pip('install', package, '--no-index', expect_error=False)
dist_info_folder = script.site_packages/'headers.dist-0.1.dist-info'
assert dist_info_folder in result.files_created, (dist_info_folder,
result.files_created,
result.stdout)
@ -55,10 +55,10 @@ def test_install_wheel_with_target():
"""
Test installing a wheel using pip install --target
"""
env = reset_env()
pip_install_local('wheel')
target_dir = env.scratch_path/'target'
result = run_pip('install', 'simple.dist==0.1', '-t', target_dir, '--use-wheel',
script = reset_env()
script.pip_install_local('wheel')
target_dir = script.scratch_path/'target'
result = script.pip('install', 'simple.dist==0.1', '-t', target_dir, '--use-wheel',
'--no-index', '--find-links='+find_links)
assert Path('scratch')/'target'/'simpledist' in result.files_created, str(result)
@ -68,11 +68,11 @@ def test_install_from_wheel_installs_deps():
Test can install dependencies of wheels
"""
# 'requires_source' depends on the 'source' project
env = reset_env()
script = reset_env()
package = abspath(join(tests_data,
'packages',
'requires_source-1.0-py2.py3-none-any.whl'))
result = run_pip('install', '--no-index', '--find-links', find_links, package)
result = script.pip('install', '--no-index', '--find-links', find_links, package)
result.assert_installed('source', editable=False)
@ -81,13 +81,10 @@ def test_install_from_wheel_no_deps():
Test --no-deps works with wheel installs
"""
# 'requires_source' depends on the 'source' project
env = reset_env()
script = reset_env()
package = abspath(join(tests_data,
'packages',
'requires_source-1.0-py2.py3-none-any.whl'))
result = run_pip('install', '--no-index', '--find-links', find_links, '--no-deps', package)
pkg_folder = env.site_packages/'source'
result = script.pip('install', '--no-index', '--find-links', find_links, '--no-deps', package)
pkg_folder = script.site_packages/'source'
assert pkg_folder not in result.files_created

View File

@ -1,8 +1,7 @@
import os
import re
import textwrap
from tests.lib import (pyversion, reset_env, run_pip, write_file, path_to_url,
tests_data, find_links)
from tests.lib import pyversion, reset_env, path_to_url, tests_data, find_links
from tests.lib.local_repos import local_checkout
@ -11,9 +10,9 @@ def test_list_command():
Test default behavior of list command.
"""
reset_env()
run_pip('install', '-f', find_links, '--no-index', 'simple==1.0', 'simple2==3.0')
result = run_pip('list')
script = reset_env()
script.pip('install', '-f', find_links, '--no-index', 'simple==1.0', 'simple2==3.0')
result = script.pip('list')
assert 'simple (1.0)' in result.stdout, str(result)
assert 'simple2 (3.0)' in result.stdout, str(result)
@ -23,9 +22,9 @@ def test_local_flag():
Test the behavior of --local flag in the list command
"""
reset_env()
run_pip('install', '-f', find_links, '--no-index', 'simple==1.0')
result = run_pip('list', '--local')
script = reset_env()
script.pip('install', '-f', find_links, '--no-index', 'simple==1.0')
result = script.pip('list', '--local')
assert 'simple (1.0)' in result.stdout
@ -34,10 +33,10 @@ def test_uptodate_flag():
Test the behavior of --uptodate flag in the list command
"""
reset_env()
run_pip('install', '-f', find_links, '--no-index', 'simple==1.0', 'simple2==3.0')
run_pip('install', '-e', 'git+https://github.com/pypa/pip-test-package.git#egg=pip-test-package')
result = run_pip('list', '-f', find_links, '--no-index', '--uptodate')
script = reset_env()
script.pip('install', '-f', find_links, '--no-index', 'simple==1.0', 'simple2==3.0')
script.pip('install', '-e', 'git+https://github.com/pypa/pip-test-package.git#egg=pip-test-package')
result = script.pip('list', '-f', find_links, '--no-index', '--uptodate')
assert 'simple (1.0)' not in result.stdout #3.0 is latest
assert 'pip-test-package' not in result.stdout #editables excluded
assert 'simple2 (3.0)' in result.stdout, str(result)
@ -48,10 +47,10 @@ def test_outdated_flag():
Test the behavior of --outdated flag in the list command
"""
reset_env()
run_pip('install', '-f', find_links, '--no-index', 'simple==1.0', 'simple2==3.0')
run_pip('install', '-e', 'git+https://github.com/pypa/pip-test-package.git#egg=pip-test-package')
result = run_pip('list', '-f', find_links, '--no-index', '--outdated')
script = reset_env()
script.pip('install', '-f', find_links, '--no-index', 'simple==1.0', 'simple2==3.0')
script.pip('install', '-e', 'git+https://github.com/pypa/pip-test-package.git#egg=pip-test-package')
result = script.pip('list', '-f', find_links, '--no-index', '--outdated')
assert 'simple (Current: 1.0 Latest: 3.0)' in result.stdout
assert 'pip-test-package' not in result.stdout #editables excluded
assert 'simple2' not in result.stdout, str(result) #3.0 is latest
@ -61,10 +60,9 @@ def test_editables_flag():
"""
Test the behavior of --editables flag in the list command
"""
reset_env()
run_pip('install', '-f', find_links, '--no-index', 'simple==1.0')
result = run_pip('install', '-e', 'git+https://github.com/pypa/pip-test-package.git#egg=pip-test-package')
result = run_pip('list', '--editable')
script = reset_env()
script.pip('install', '-f', find_links, '--no-index', 'simple==1.0')
result = script.pip('install', '-e', 'git+https://github.com/pypa/pip-test-package.git#egg=pip-test-package')
result = script.pip('list', '--editable')
assert 'simple (1.0)' not in result.stdout, str(result)
assert os.path.join('src', 'pip-test-package') in result.stdout, str(result)

View File

@ -7,8 +7,7 @@ from pip.status_codes import NO_MATCHES_FOUND, SUCCESS
from pip.backwardcompat import xmlrpclib, b
from pip.baseparser import create_main_parser
from mock import Mock
from tests.lib import run_pip, reset_env, pyversion
from tests.lib.pypi_server import assert_equal
from tests.lib import reset_env, pyversion
if pyversion >= '3':
@ -40,7 +39,7 @@ def test_pypi_xml_transformation():
{'_pypi_ordering': 50, 'name': 'bar', 'summary': 'bar summary', 'version': '1.0'}]
expected = [{'score': 200, 'versions': ['1.0', '2.0'], 'name': 'foo', 'summary': 'foo summary v2'},
{'score': 50, 'versions': ['1.0'], 'name': 'bar', 'summary': 'bar summary'}]
assert_equal(transform_hits(pypi_hits), expected)
assert transform_hits(pypi_hits) == expected
def test_invalid_pypi_transformation():
@ -52,7 +51,7 @@ def test_invalid_pypi_transformation():
expected = [{'score': 100, 'versions': ['1.0'], 'name': 'foo', 'summary': 'foo summary'},
{'score': 0, 'versions': ['1.0'], 'name': 'bar', 'summary': 'bar summary'}]
assert_equal(transform_hits(pypi_hits), expected)
assert transform_hits(pypi_hits) == expected
def test_search():
@ -60,8 +59,8 @@ def test_search():
End to end test of search command.
"""
reset_env()
output = run_pip('search', 'pip')
script = reset_env()
output = script.pip('search', 'pip')
assert 'A tool for installing and managing Python packages' in output.stdout
@ -70,8 +69,8 @@ def test_multiple_search():
Test searching for multiple packages at once.
"""
reset_env()
output = run_pip('search', 'pip', 'INITools')
script = reset_env()
output = script.pip('search', 'pip', 'INITools')
assert 'A tool for installing and managing Python packages' in output.stdout
assert 'Tools for parsing and using INI-style files' in output.stdout
@ -80,8 +79,8 @@ def test_search_missing_argument():
"""
Test missing required argument for search
"""
env = reset_env()
result = run_pip('search', expect_error=True)
script = reset_env()
result = script.pip('search', expect_error=True)
assert 'ERROR: Missing required argument (search query).' in result.stdout
@ -111,8 +110,8 @@ def test_search_should_exit_status_code_zero_when_find_packages():
"""
Test search exit status code for package found
"""
env = reset_env()
result = run_pip('search', 'pip')
script = reset_env()
result = script.pip('search', 'pip')
assert result.returncode == SUCCESS
@ -120,6 +119,6 @@ def test_search_exit_status_code_when_finds_no_package():
"""
Test search exit status code for no matches
"""
env = reset_env()
result = run_pip('search', 'non-existant-package', expect_error=True)
script = reset_env()
result = script.pip('search', 'non-existant-package', expect_error=True)
assert result.returncode == NO_MATCHES_FOUND, result.returncode

View File

@ -1,7 +1,7 @@
import re
from pip import __version__
from pip.commands.show import search_packages_info
from tests.lib import reset_env, run_pip
from tests.lib import reset_env
def test_show():
@ -9,8 +9,8 @@ def test_show():
Test end to end test for show command.
"""
reset_env()
result = run_pip('show', 'pip')
script = reset_env()
result = script.pip('show', 'pip')
lines = result.stdout.split('\n')
assert len(lines) == 6
assert lines[0] == '---', lines[0]
@ -26,8 +26,8 @@ def test_show_with_files_not_found():
installed-files.txt not found.
"""
reset_env()
result = run_pip('show', '-f', 'pip')
script = reset_env()
result = script.pip('show', '-f', 'pip')
lines = result.stdout.split('\n')
assert len(lines) == 8
assert lines[0] == '---', lines[0]
@ -44,9 +44,9 @@ def test_show_with_all_files():
Test listing all files in the show command.
"""
reset_env()
result = run_pip('install', 'initools==0.2')
result = run_pip('show', '--files', 'initools')
script = reset_env()
result = script.pip('install', 'initools==0.2')
result = script.pip('show', '--files', 'initools')
assert re.search(r"Files:\n( .+\n)+", result.stdout)
@ -55,8 +55,8 @@ def test_missing_argument():
Test show command with no arguments.
"""
reset_env()
result = run_pip('show')
script = reset_env()
result = script.pip('show')
assert 'ERROR: Please provide a package name or names.' in result.stdout

View File

@ -6,7 +6,7 @@ import sys
from os.path import join, abspath, normpath
from tempfile import mkdtemp
from mock import patch
from tests.lib import tests_data, reset_env, run_pip, assert_all_changes, write_file, pyversion
from tests.lib import tests_data, reset_env, assert_all_changes, pyversion
from tests.lib.local_repos import local_repo, local_checkout
from pip.util import rmtree
@ -17,13 +17,13 @@ def test_simple_uninstall():
Test simple install and uninstall.
"""
env = reset_env()
result = run_pip('install', 'INITools==0.2')
assert join(env.site_packages, 'initools') in result.files_created, sorted(result.files_created.keys())
script = reset_env()
result = script.pip('install', 'INITools==0.2')
assert join(script.site_packages, 'initools') in result.files_created, sorted(result.files_created.keys())
#the import forces the generation of __pycache__ if the version of python supports it
env.run('python', '-c', "import initools")
result2 = run_pip('uninstall', 'INITools', '-y')
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
script.run('python', '-c', "import initools")
result2 = script.pip('uninstall', 'INITools', '-y')
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
def test_uninstall_with_scripts():
@ -31,13 +31,13 @@ def test_uninstall_with_scripts():
Uninstall an easy_installed package with scripts.
"""
env = reset_env()
result = env.run('easy_install', 'PyLogo', expect_stderr=True)
easy_install_pth = env.site_packages/ 'easy-install.pth'
script = reset_env()
result = script.run('easy_install', 'PyLogo', expect_stderr=True)
easy_install_pth = script.site_packages/ 'easy-install.pth'
pylogo = sys.platform == 'win32' and 'pylogo' or 'PyLogo'
assert(pylogo in result.files_updated[easy_install_pth].bytes)
result2 = run_pip('uninstall', 'pylogo', '-y', expect_error=True)
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
result2 = script.pip('uninstall', 'pylogo', '-y', expect_error=True)
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
def test_uninstall_easy_install_after_import():
@ -45,12 +45,12 @@ def test_uninstall_easy_install_after_import():
Uninstall an easy_installed package after it's been imported
"""
env = reset_env()
result = env.run('easy_install', 'INITools==0.2', expect_stderr=True)
script = reset_env()
result = script.run('easy_install', 'INITools==0.2', expect_stderr=True)
#the import forces the generation of __pycache__ if the version of python supports it
env.run('python', '-c', "import initools")
result2 = run_pip('uninstall', 'INITools', '-y')
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
script.run('python', '-c', "import initools")
result2 = script.pip('uninstall', 'INITools', '-y')
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
def test_uninstall_namespace_package():
@ -59,12 +59,12 @@ def test_uninstall_namespace_package():
the namespace and everything in it.
"""
env = reset_env()
result = run_pip('install', 'pd.requires==0.0.3', expect_error=True)
assert join(env.site_packages, 'pd') in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('uninstall', 'pd.find', '-y', expect_error=True)
assert join(env.site_packages, 'pd') not in result2.files_deleted, sorted(result2.files_deleted.keys())
assert join(env.site_packages, 'pd', 'find') in result2.files_deleted, sorted(result2.files_deleted.keys())
script = reset_env()
result = script.pip('install', 'pd.requires==0.0.3', expect_error=True)
assert join(script.site_packages, 'pd') in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('uninstall', 'pd.find', '-y', expect_error=True)
assert join(script.site_packages, 'pd') not in result2.files_deleted, sorted(result2.files_deleted.keys())
assert join(script.site_packages, 'pd', 'find') in result2.files_deleted, sorted(result2.files_deleted.keys())
def test_uninstall_overlapping_package():
@ -77,18 +77,18 @@ def test_uninstall_overlapping_package():
"""
parent_pkg = abspath(join(tests_data, 'packages', 'parent-0.1.tar.gz'))
child_pkg = abspath(join(tests_data, 'packages', 'child-0.1.tar.gz'))
env = reset_env()
result1 = run_pip('install', parent_pkg, expect_error=False)
assert join(env.site_packages, 'parent') in result1.files_created, sorted(result1.files_created.keys())
result2 = run_pip('install', child_pkg, expect_error=False)
assert join(env.site_packages, 'child') in result2.files_created, sorted(result2.files_created.keys())
assert normpath(join(env.site_packages, 'parent/plugins/child_plugin.py')) in result2.files_created, sorted(result2.files_created.keys())
script = reset_env()
result1 = script.pip('install', parent_pkg, expect_error=False)
assert join(script.site_packages, 'parent') in result1.files_created, sorted(result1.files_created.keys())
result2 = script.pip('install', child_pkg, expect_error=False)
assert join(script.site_packages, 'child') in result2.files_created, sorted(result2.files_created.keys())
assert normpath(join(script.site_packages, 'parent/plugins/child_plugin.py')) in result2.files_created, sorted(result2.files_created.keys())
#the import forces the generation of __pycache__ if the version of python supports it
env.run('python', '-c', "import parent.plugins.child_plugin, child")
result3 = run_pip('uninstall', '-y', 'child', expect_error=False)
assert join(env.site_packages, 'child') in result3.files_deleted, sorted(result3.files_created.keys())
assert normpath(join(env.site_packages, 'parent/plugins/child_plugin.py')) in result3.files_deleted, sorted(result3.files_deleted.keys())
assert join(env.site_packages, 'parent') not in result3.files_deleted, sorted(result3.files_deleted.keys())
script.run('python', '-c', "import parent.plugins.child_plugin, child")
result3 = script.pip('uninstall', '-y', 'child', expect_error=False)
assert join(script.site_packages, 'child') in result3.files_deleted, sorted(result3.files_created.keys())
assert normpath(join(script.site_packages, 'parent/plugins/child_plugin.py')) in result3.files_deleted, sorted(result3.files_deleted.keys())
assert join(script.site_packages, 'parent') not in result3.files_deleted, sorted(result3.files_deleted.keys())
# Additional check: uninstalling 'child' should return things to the
# previous state, without unintended side effects.
assert_all_changes(result2, result3, [])
@ -99,13 +99,13 @@ def test_uninstall_console_scripts():
Test uninstalling a package with more files (console_script entry points, extra directories).
"""
env = reset_env()
script = reset_env()
args = ['install']
args.append('discover')
result = run_pip(*args, **{"expect_error": True})
assert env.bin/'discover'+env.exe in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('uninstall', 'discover', '-y', expect_error=True)
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
result = script.pip(*args, **{"expect_error": True})
assert script.bin/'discover'+script.exe in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('uninstall', 'discover', '-y', expect_error=True)
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
def test_uninstall_easy_installed_console_scripts():
@ -113,13 +113,13 @@ def test_uninstall_easy_installed_console_scripts():
Test uninstalling package with console_scripts that is easy_installed.
"""
env = reset_env()
script = reset_env()
args = ['easy_install']
args.append('discover')
result = env.run(*args, **{"expect_stderr": True})
assert env.bin/'discover'+env.exe in result.files_created, sorted(result.files_created.keys())
result2 = run_pip('uninstall', 'discover', '-y')
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
result = script.run(*args, **{"expect_stderr": True})
assert script.bin/'discover'+script.exe in result.files_created, sorted(result.files_created.keys())
result2 = script.pip('uninstall', 'discover', '-y')
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
def test_uninstall_editable_from_svn():
@ -127,13 +127,13 @@ def test_uninstall_editable_from_svn():
Test uninstalling an editable installation from svn.
"""
env = reset_env()
result = run_pip('install', '-e', '%s#egg=initools-dev' %
script = reset_env()
result = script.pip('install', '-e', '%s#egg=initools-dev' %
local_checkout('svn+http://svn.colorstudy.com/INITools/trunk'))
result.assert_installed('INITools')
result2 = run_pip('uninstall', '-y', 'initools')
assert (env.venv/'src'/'initools' in result2.files_after), 'oh noes, pip deleted my sources!'
assert_all_changes(result, result2, [env.venv/'src', env.venv/'build'])
result2 = script.pip('uninstall', '-y', 'initools')
assert (script.venv/'src'/'initools' in result2.files_after), 'oh noes, pip deleted my sources!'
assert_all_changes(result, result2, [script.venv/'src', script.venv/'build'])
def test_uninstall_editable_with_source_outside_venv():
@ -150,12 +150,12 @@ def test_uninstall_editable_with_source_outside_venv():
def _test_uninstall_editable_with_source_outside_venv(tmpdir):
env = reset_env()
result = env.run('git', 'clone', local_repo('git+git://github.com/pypa/virtualenv'), tmpdir)
result2 = run_pip('install', '-e', tmpdir)
assert (join(env.site_packages, 'virtualenv.egg-link') in result2.files_created), list(result2.files_created.keys())
result3 = run_pip('uninstall', '-y', 'virtualenv', expect_error=True)
assert_all_changes(result, result3, [env.venv/'build'])
script = reset_env()
result = script.run('git', 'clone', local_repo('git+git://github.com/pypa/virtualenv'), tmpdir)
result2 = script.pip('install', '-e', tmpdir)
assert (join(script.site_packages, 'virtualenv.egg-link') in result2.files_created), list(result2.files_created.keys())
result3 = script.pip('uninstall', '-y', 'virtualenv', expect_error=True)
assert_all_changes(result, result3, [script.venv/'build'])
def test_uninstall_from_reqs_file():
@ -163,14 +163,14 @@ def test_uninstall_from_reqs_file():
Test uninstall from a requirements file.
"""
env = reset_env()
write_file('test-req.txt', textwrap.dedent("""\
script = reset_env()
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""\
-e %s#egg=initools-dev
# and something else to test out:
PyLogo<0.4
""" % local_checkout('svn+http://svn.colorstudy.com/INITools/trunk')))
result = run_pip('install', '-r', 'test-req.txt')
write_file('test-req.txt', textwrap.dedent("""\
result = script.pip('install', '-r', 'test-req.txt')
script.scratch_path.join("test-req.txt").write(textwrap.dedent("""\
# -f, -i, and --extra-index-url should all be ignored by uninstall
-f http://www.example.com
-i http://www.example.com
@ -180,9 +180,9 @@ def test_uninstall_from_reqs_file():
# and something else to test out:
PyLogo<0.4
""" % local_checkout('svn+http://svn.colorstudy.com/INITools/trunk')))
result2 = run_pip('uninstall', '-r', 'test-req.txt', '-y')
result2 = script.pip('uninstall', '-r', 'test-req.txt', '-y')
assert_all_changes(
result, result2, [env.venv/'build', env.venv/'src', env.scratch/'test-req.txt'])
result, result2, [script.venv/'build', script.venv/'src', script.scratch/'test-req.txt'])
def test_uninstall_as_egg():
@ -190,16 +190,16 @@ def test_uninstall_as_egg():
Test uninstall package installed as egg.
"""
env = reset_env()
script = reset_env()
to_install = abspath(join(tests_data, 'packages', 'FSPkg'))
result = run_pip('install', to_install, '--egg', expect_error=False)
fspkg_folder = env.site_packages/'fspkg'
egg_folder = env.site_packages/'FSPkg-0.1dev-py%s.egg' % pyversion
result = script.pip('install', to_install, '--egg', expect_error=False)
fspkg_folder = script.site_packages/'fspkg'
egg_folder = script.site_packages/'FSPkg-0.1dev-py%s.egg' % pyversion
assert fspkg_folder not in result.files_created, str(result.stdout)
assert egg_folder in result.files_created, str(result)
result2 = run_pip('uninstall', 'FSPkg', '-y', expect_error=True)
assert_all_changes(result, result2, [env.venv/'build', 'cache'])
result2 = script.pip('uninstall', 'FSPkg', '-y', expect_error=True)
assert_all_changes(result, result2, [script.venv/'build', 'cache'])
@patch('pip.req.logger')
@ -238,6 +238,3 @@ def test_uninstallpathset_non_local(mock_logger):
uninstall_set = UninstallPathSet(test_dist)
uninstall_set.remove() #with no files added to set; which is the case when trying to remove non-local dists
mock_logger.notify.assert_any_call("Not uninstalling pip at %s, outside environment %s" % (nonlocal_path, sys.prefix)), mock_logger.notify.mock_calls

View File

@ -7,26 +7,26 @@ from os.path import exists
from pip import wheel
from pip.download import path_to_url as path_to_url_d
from tests.lib import tests_data, reset_env, run_pip, pyversion_nodot, write_file, path_to_url, find_links, pip_install_local
from tests.lib import tests_data, reset_env, pyversion_nodot, path_to_url, find_links
def test_pip_wheel_fails_without_wheel():
"""
Test 'pip wheel' fails without wheel
"""
env = reset_env()
result = run_pip('wheel', '--no-index', '-f', find_links, 'simple==3.0', expect_error=True)
script = reset_env()
result = script.pip('wheel', '--no-index', '-f', find_links, 'simple==3.0', expect_error=True)
assert "'pip wheel' requires bdist_wheel" in result.stdout
def test_pip_wheel_success():
"""
Test 'pip wheel' success.
"""
env = reset_env()
pip_install_local('wheel')
result = run_pip('wheel', '--no-index', '-f', find_links, 'simple==3.0')
script = reset_env()
script.pip_install_local('wheel')
result = script.pip('wheel', '--no-index', '-f', find_links, 'simple==3.0')
wheel_file_name = 'simple-3.0-py%s-none-any.whl' % pyversion_nodot
wheel_file_path = env.scratch/'wheelhouse'/wheel_file_name
wheel_file_path = script.scratch/'wheelhouse'/wheel_file_name
assert wheel_file_path in result.files_created, result.stdout
assert "Successfully built simple" in result.stdout, result.stdout
@ -35,11 +35,11 @@ def test_pip_wheel_fail():
"""
Test 'pip wheel' failure.
"""
env = reset_env()
pip_install_local('wheel')
result = run_pip('wheel', '--no-index', '-f', find_links, 'wheelbroken==0.1')
script = reset_env()
script.pip_install_local('wheel')
result = script.pip('wheel', '--no-index', '-f', find_links, 'wheelbroken==0.1')
wheel_file_name = 'wheelbroken-0.1-py%s-none-any.whl' % pyversion_nodot
wheel_file_path = env.scratch/'wheelhouse'/wheel_file_name
wheel_file_path = script.scratch/'wheelhouse'/wheel_file_name
assert wheel_file_path not in result.files_created, (wheel_file_path, result.files_created)
assert "FakeError" in result.stdout, result.stdout
assert "Failed to build wheelbroken" in result.stdout, result.stdout
@ -49,19 +49,19 @@ def test_pip_wheel_ignore_wheels_editables():
"""
Test 'pip wheel' ignores editables and *.whl files in requirements
"""
env = reset_env()
pip_install_local('wheel')
script = reset_env()
script.pip_install_local('wheel')
local_wheel = '%s/simple.dist-0.1-py2.py3-none-any.whl' % find_links
local_editable = os.path.abspath(os.path.join(tests_data, 'packages', 'FSPkg'))
write_file('reqs.txt', textwrap.dedent("""\
script.scratch_path.join("reqs.txt").write(textwrap.dedent("""\
%s
-e %s
simple
""" % (local_wheel, local_editable)))
result = run_pip('wheel', '--no-index', '-f', find_links, '-r', env.scratch_path / 'reqs.txt')
result = script.pip('wheel', '--no-index', '-f', find_links, '-r', script.scratch_path / 'reqs.txt')
wheel_file_name = 'simple-3.0-py%s-none-any.whl' % pyversion_nodot
wheel_file_path = env.scratch/'wheelhouse'/wheel_file_name
wheel_file_path = script.scratch/'wheelhouse'/wheel_file_name
assert wheel_file_path in result.files_created, (wheel_file_path, result.files_created)
assert "Successfully built simple" in result.stdout, result.stdout
assert "Failed to build" not in result.stdout, result.stdout
@ -77,10 +77,10 @@ def test_no_clean_option_blocks_cleaning_after_wheel():
"""
Test --no-clean option blocks cleaning after wheel build
"""
env = reset_env()
pip_install_local('wheel')
result = run_pip('wheel', '--no-clean', '--no-index', '--find-links=%s' % find_links, 'simple')
build = env.venv_path/'build'/'simple'
script = reset_env()
script.pip_install_local('wheel')
result = script.pip('wheel', '--no-clean', '--no-index', '--find-links=%s' % find_links, 'simple')
build = script.venv_path/'build'/'simple'
assert exists(build), "build/simple should still exist %s" % str(result)
@ -89,12 +89,10 @@ def test_pip_wheel_source_deps():
Test 'pip wheel --use-wheel' finds and builds source archive dependencies of wheels
"""
# 'requires_source' is a wheel that depends on the 'source' project
env = reset_env()
pip_install_local('wheel')
result = run_pip('wheel', '--use-wheel', '--no-index', '-f', find_links, 'requires_source')
script = reset_env()
script.pip_install_local('wheel')
result = script.pip('wheel', '--use-wheel', '--no-index', '-f', find_links, 'requires_source')
wheel_file_name = 'source-1.0-py%s-none-any.whl' % pyversion_nodot
wheel_file_path = env.scratch/'wheelhouse'/wheel_file_name
wheel_file_path = script.scratch/'wheelhouse'/wheel_file_name
assert wheel_file_path in result.files_created, result.stdout
assert "Successfully built source" in result.stdout, result.stdout

View File

@ -1,33 +1,32 @@
#!/usr/bin/env python
# #!/usr/bin/env python
import imp
import os
import sys
import re
import tempfile
import shutil
import glob
import atexit
import textwrap
import site
import shutil
import subprocess
import scripttest
import virtualenv
from scripttest import TestFileEnvironment, FoundDir
from tests.lib.path import Path, curdir, u
from pip.util import rmtree
from pip.backwardcompat import uses_pycache
from tests.lib.path import Path, curdir, u
pyversion = sys.version[:3]
pyversion_nodot = "%d%d" % (sys.version_info[0], sys.version_info[1])
tests_lib = Path(__file__).abspath.folder # pip/tests/lib
tests_root = tests_lib.folder # pip/tests
tests_cache = os.path.join(tests_root, 'tests_cache') # pip/tests/tests_cache
tests_lib = Path(__file__).abspath.folder # pip/tests/lib
tests_root = tests_lib.folder # pip/tests
tests_cache = os.path.join(tests_root, 'tests_cache') # pip/tests/tests_cache
src_folder = tests_root.folder # pip/
tests_data = os.path.join(tests_root, 'data') # pip/tests/data
packages = os.path.join(tests_data, 'packages') # pip/tests/data/packages
tests_unit = os.path.join(tests_root, 'unit') # pip/tests/unit
tests_functional = os.path.join(tests_root, 'functional') # pip/tests/functional
download_cache = tempfile.mkdtemp(prefix='pip-test-cache')
site_packages_suffix = site.USER_SITE[len(site.USER_BASE) + 1:]
tests_data = os.path.join(tests_root, 'data') # pip/tests/data
packages = os.path.join(tests_data, 'packages') # pip/tests/data/packages
fast_test_env_root = tests_cache / 'test_ws'
def path_to_url(path):
"""
@ -41,112 +40,81 @@ def path_to_url(path):
url = '/'.join(filepath)
if drive:
return 'file:///' + drive + url
return 'file://' +url
return 'file://' + url
find_links = path_to_url(os.path.join(tests_data, 'packages'))
find_links2 = path_to_url(os.path.join(tests_data, 'packages2'))
def demand_dirs(path):
if not os.path.exists(path):
os.makedirs(path)
# Tweak the path so we can find up-to-date pip sources
# (http://bitbucket.org/ianb/pip/issue/98)
sys.path = [src_folder] + sys.path
def create_virtualenv(where):
import virtualenv
virtualenv.create_environment(
where, unzip_setuptools=True)
return virtualenv.path_locations(where)
def relpath(root, other):
"""a poor man's os.path.relpath, since we may not have Python 2.6"""
prefix = root+Path.sep
assert other.startswith(prefix)
return Path(other[len(prefix):])
if 'PYTHONPATH' in os.environ:
del os.environ['PYTHONPATH']
try:
any
except NameError:
def any(seq):
for item in seq:
if item:
return True
return False
def clear_environ(environ):
return dict(((k, v) for k, v in environ.items()
if not k.lower().startswith('pip_')))
env = None
def reset_env(environ=None,
system_site_packages=False,
sitecustomize=None,
pypi_cache=True,
insecure=True):
"""Return a test environment.
def reset_env(environ=None, system_site_packages=False):
"""
Return a test environment.
Keyword arguments:
environ: an environ object to use.
system_site_packages: create a virtualenv that simulates --system-site-packages.
pypi_cache: use pip's internal pypi cache
sitecustomize: a string containing python code to add to sitecustomize.py.
insecure: how to set the --insecure option for py25 tests.
system_site_packages: create a virtualenv that simulates
--system-site-packages.
"""
# Clear our previous test directory
fast_test_env_root.rmtree()
global env
# Create a virtual environment
venv_root = fast_test_env_root.join(".virtualenv")
virtualenv.create_environment(venv_root,
clear=True,
never_download=True,
no_pip=True,
)
env = TestPipEnvironment(environ, sitecustomize=sitecustomize, pypi_cache=pypi_cache)
TestPipEnvironment.rebuild_venv = False
# On Python < 3.3 we don't have subprocess.DEVNULL
try:
devnull = subprocess.DEVNULL
except AttributeError:
devnull = open(os.devnull, "wb")
# Install our development version of pip install the virtual environment
p = subprocess.Popen(
[venv_root.join("bin/python"), "setup.py", "develop"],
stderr=subprocess.STDOUT,
stdout=devnull,
)
p.communicate()
if p.returncode != 0:
raise subprocess.CalledProcessError(p.returncode, p.args)
# Create our pip test environment
env = TestPipEnvironment(fast_test_env_root,
environ=environ,
virtualenv=venv_root,
ignore_hidden=False,
start_clear=False,
capture_temp=True,
assert_no_temp=True,
)
if system_site_packages:
#testing often occurs starting from a private virtualenv (e.g. with tox)
#from that context, you can't successfully use virtualenv.create_environment
#to create a 'system-site-packages' virtualenv
#hence, this workaround
(env.lib_path/'no-global-site-packages.txt').rm()
TestPipEnvironment.rebuild_venv = True
# Testing often occurs starting from a private virtualenv (e.g. tox)
# from that context, you can't successfully use
# virtualenv.create_environment to create a 'system-site-packages'
# virtualenv hence, this workaround
env.lib_path.join("no-global-site-packages.txt").rm()
return env
class TestFailure(AssertionError):
"""
An "assertion" failed during testing.
"""
pass
#
# This cleanup routine prevents the __del__ method that cleans up the tree of
# the last TestPipEnvironment from firing after shutil has already been
# unloaded. It also ensures that FastTestPipEnvironment doesn't leave an
# environment hanging around that might confuse the next test run.
#
def _cleanup():
global env
del env
rmtree(download_cache, ignore_errors=True)
rmtree(fast_test_env_root, ignore_errors=True)
rmtree(fast_test_env_backup, ignore_errors=True)
atexit.register(_cleanup)
class TestPipResult(object):
def __init__(self, impl, verbose=False):
@ -180,19 +148,22 @@ class TestPipResult(object):
def __str__(self):
return str(self._impl)
def assert_installed(self, pkg_name, editable=True, with_files=[], without_files=[], without_egg_link=False, use_user_site=False):
def assert_installed(self, pkg_name, editable=True, with_files=[],
without_files=[], without_egg_link=False,
use_user_site=False):
e = self.test_env
if editable:
pkg_dir = e.venv/ 'src'/ pkg_name.lower()
pkg_dir = e.venv/'src'/pkg_name.lower()
else:
without_egg_link = True
pkg_dir = e.site_packages / pkg_name
pkg_dir = e.site_packages/pkg_name
if use_user_site:
egg_link_path = e.user_site / pkg_name + '.egg-link'
else:
egg_link_path = e.site_packages / pkg_name + '.egg-link'
if without_egg_link:
if egg_link_path in self.files_created:
raise TestFailure('unexpected egg link file created: '\
@ -239,7 +210,7 @@ class TestPipResult(object):
for f in with_files:
if not (pkg_dir/f).normpath in self.files_created:
raise TestFailure('Package directory %r missing '\
'expected content %f' % (pkg_dir, f))
'expected content %r' % (pkg_dir, f))
for f in without_files:
if (pkg_dir/f).normpath in self.files_created:
@ -247,12 +218,10 @@ class TestPipResult(object):
'unexpected content %f' % (pkg_dir, f))
fast_test_env_root = tests_cache / 'test_ws'
fast_test_env_backup = tests_cache / 'test_ws_backup'
class TestPipEnvironment(TestFileEnvironment):
"""A specialized TestFileEnvironment for testing pip"""
class TestPipEnvironment(scripttest.TestFileEnvironment):
"""
A specialized TestFileEnvironment for testing pip
"""
#
# Attribute naming convention
@ -263,137 +232,66 @@ class TestPipEnvironment(TestFileEnvironment):
# a name of the form xxxx_path and relative paths have a name that
# does not end in '_path'.
# The following paths are relative to the root_path, and should be
# treated by clients as instance attributes. The fact that they
# are defined in the class is an implementation detail
# where we'll create the virtual Python installation for testing
#
# Named with a leading dot to reduce the chance of spurious
# results due to being mistaken for the virtualenv package.
venv = Path('.virtualenv')
# The root of a directory tree to be used arbitrarily by tests
scratch = Path('scratch')
exe = sys.platform == 'win32' and '.exe' or ''
verbose = False
rebuild_venv = True
def __init__(self, environ=None, sitecustomize=None, pypi_cache=True):
import virtualenv
def __init__(self, base_path, *args, **kwargs):
# Make our base_path a test.lib.path.Path object
base_path = Path(base_path)
self.root_path = fast_test_env_root
self.backup_path = fast_test_env_backup
self.scratch_path = self.root_path / self.scratch
# We will set up a virtual environment at root_path.
self.venv_path = self.root_path / self.venv
if not environ:
environ = os.environ.copy()
environ = clear_environ(environ)
environ['PIP_DOWNLOAD_CACHE'] = str(download_cache)
environ['PIP_NO_INPUT'] = '1'
environ['PIP_LOG_FILE'] = str(self.root_path/'pip-log.txt')
TestFileEnvironment.__init__(self,
self.root_path, ignore_hidden=False,
environ=environ, split_cmd=False, start_clear=False,
cwd=self.scratch_path, capture_temp=True, assert_no_temp=True)
virtualenv_paths = virtualenv.path_locations(self.venv_path)
for id, path in zip(('venv', 'lib', 'include', 'bin'), virtualenv_paths):
#fix for virtualenv issue #306
if hasattr(sys, "pypy_version_info") and id == 'lib':
path = os.path.join(self.venv_path, 'lib-python', pyversion)
setattr(self, id+'_path', Path(path))
setattr(self, id, relpath(self.root_path, path))
assert self.venv == TestPipEnvironment.venv # sanity check
# Store paths related to the virtual environment
_virtualenv = kwargs.pop("virtualenv")
venv, lib, include, bin = virtualenv.path_locations(_virtualenv)
self.venv_path = venv
self.lib_path = lib
self.include_path = include
self.bin_path = bin
if hasattr(sys, "pypy_version_info"):
self.site_packages = self.venv/'site-packages'
self.site_packages_path = self.venv_path.join("site-packages")
else:
self.site_packages = self.lib/'site-packages'
self.user_base_path = self.venv_path/'user'
self.user_site_path = self.venv_path/'user'/site_packages_suffix
self.site_packages_path = self.lib_path.join("site-packages")
self.user_site = relpath(self.root_path, self.user_site_path)
self.user_base_path = self.venv_path.join("user")
self.user_site_path = self.venv_path.join(
"user",
site.USER_SITE[len(site.USER_BASE) + 1:],
)
self.environ["PYTHONUSERBASE"] = self.user_base_path
# Create a Directory to use as a scratch pad
self.scratch_path = base_path.join("scratch").mkdir()
# put the test-scratch virtualenv's bin dir first on the PATH
self.environ['PATH'] = Path.pathsep.join((self.bin_path, self.environ['PATH']))
# Set our default working directory
kwargs.setdefault("cwd", self.scratch_path)
if self.root_path.exists:
# There's something strange going on here, Python 3.3 introduced
# a new version of shutil.rmtree which is safe against symlink
# attacks causing arbitrary things from being deleted. However
# this seemingly fails on Travis for unknown reasons. The problem
# seems to stem from os.path.samestat(orig_st, os.fstat(dirfd))
# returning False even when the directory is *not* a symlink. By
# switching to shutil._rmtree_unsafe we use a version of rmtree
# that is slightly vulnerable to a race condition that shouldn't
# matter for our uses.
def _onerror(*args, **kwargs):
raise
_rmtree = getattr(shutil, "_rmtree_unsafe", shutil.rmtree)
_rmtree(self.root_path, onerror=_onerror)
if self.backup_path.exists and not self.rebuild_venv:
shutil.copytree(self.backup_path, self.root_path, True)
else:
demand_dirs(self.venv_path)
demand_dirs(self.scratch_path)
# Setup our environment
environ = kwargs.get("environ")
if environ is None:
environ = os.environ.copy()
# Create a virtualenv and remember where it's putting things.
create_virtualenv(self.venv_path)
environ["PIP_LOG_FILE"] = base_path.join("pip-log.txt")
environ["PATH"] = Path.pathsep.join(
[self.bin_path] + [environ.get("PATH", [])],
)
environ["PYTHONUSERBASE"] = self.user_base_path
kwargs["environ"] = environ
demand_dirs(self.user_site_path)
# Call the TestFileEnvironment __init__
super(TestPipEnvironment, self).__init__(base_path, *args, **kwargs)
# create easy-install.pth in user_site, so we always have it updated instead of created
open(self.user_site_path/'easy-install.pth', 'w').close()
# Expand our absolute path directories into relative
for name in ["base", "venv", "lib", "include", "bin", "site_packages",
"user_base", "user_site", "scratch"]:
real_name = "%s_path" % name
setattr(self, name, getattr(self, real_name) - self.base_path)
# test that test-scratch virtualenv creation produced sensible venv python
result = self.run('python', '-c', 'import sys; print(sys.executable)')
pythonbin = result.stdout.strip()
if Path(pythonbin).noext != self.bin_path/'python':
raise RuntimeError(
"Oops! 'python' in our test environment runs %r"
" rather than expected %r" % (pythonbin, self.bin_path/'python'))
# Uninstall whatever version of pip came with the virtualenv.
# Earlier versions of pip were incapable of
# self-uninstallation on Windows, so we use the one we're testing.
self.run('python', '-c',
'"import sys; sys.path.insert(0, %r); import pip; sys.exit(pip.main());"' % src_folder,
'uninstall', '-vvv', '-y', 'pip')
# Install this version instead
self.run('python', 'setup.py', 'install', cwd=src_folder, expect_stderr=True)
# make the backup (remove previous backup if exists)
if self.backup_path.exists:
rmtree(self.backup_path)
shutil.copytree(self.root_path, self.backup_path, True)
#create sitecustomize.py and add patches
self._create_empty_sitecustomize()
if pypi_cache:
self._use_cached_pypi_server()
if sitecustomize:
self._add_to_sitecustomize(sitecustomize)
assert self.root_path.exists
# Ensure that $TMPDIR exists (because we use start_clear=False, it's not created for us)
if self.temp_path and not os.path.exists(self.temp_path):
os.makedirs(self.temp_path)
# Ensure the tmp dir exists
self.temp_path.mkdir()
# create easy-install.pth in user_site, so we always have it updated
# instead of created
self.user_site_path.makedirs()
self.user_site_path.join("easy-install.pth").touch()
def _ignore_file(self, fn):
if fn.endswith('__pycache__') or fn.endswith(".pyc"):
@ -411,82 +309,13 @@ class TestPipEnvironment(TestFileEnvironment):
cwd = cwd or run_from or self.cwd
return TestPipResult(super(TestPipEnvironment, self).run(cwd=cwd, *args, **kw), verbose=self.verbose)
def _use_cached_pypi_server(self):
# previously, this was handled in a pth file, and not in sitecustomize.py
# pth processing happens during the construction of sys.path.
# 'import pypi_server' ultimately imports pkg_resources (which intializes pkg_resources.working_set based on the current state of sys.path)
# pkg_resources.get_distribution (used in pip.req) requires an accurate pkg_resources.working_set
# therefore, 'import pypi_server' shouldn't occur in a pth file.
def pip(self, *args, **kwargs):
return self.run("pip", *args, **kwargs)
patch = """
import sys
sys.path.insert(0, %r)
import pypi_server
pypi_server.PyPIProxy.setup()
sys.path.remove(%r)""" % (str(tests_lib), str(tests_lib))
self._add_to_sitecustomize(patch)
def _create_empty_sitecustomize(self):
"Create empty sitecustomize.py."
sitecustomize_path = self.lib_path / 'sitecustomize.py'
sitecustomize = open(sitecustomize_path, 'w')
sitecustomize.close()
def _add_to_sitecustomize(self, snippet):
"Adds a python code snippet to sitecustomize.py."
sitecustomize_path = self.lib_path / 'sitecustomize.py'
sitecustomize = open(sitecustomize_path, 'a')
sitecustomize.write(textwrap.dedent('''
%s
''' %snippet))
sitecustomize.close()
# caught py32 with an outdated __pycache__ file after a sitecustomize update (after python should have updated it)
# https://github.com/pypa/pip/pull/893#issuecomment-16426701
# will delete the cache file to be sure
if uses_pycache:
cache_path = imp.cache_from_source(sitecustomize_path)
if os.path.isfile(cache_path):
os.remove(cache_path)
def run_pip(*args, **kw):
result = env.run('pip', *args, **kw)
ignore = []
for path, f in result.files_before.items():
# ignore updated directories, often due to .pyc or __pycache__
if (path in result.files_updated and
isinstance(result.files_updated[path], FoundDir)):
ignore.append(path)
for path in ignore:
del result.files_updated[path]
return result
def pip_install_local(*args, **kw):
"""Run 'pip install' using --find-links against our local test packages"""
return run_pip('install', '--no-index', '--find-links=%s' % find_links, *args, **kw)
def write_file(filename, text, dest=None):
"""Write a file in the dest (default=env.scratch_path)
"""
env = get_env()
if dest:
complete_path = dest/ filename
else:
complete_path = env.scratch_path/ filename
f = open(complete_path, 'w')
f.write(text)
f.close()
def mkdir(dirname):
os.mkdir(os.path.join(get_env().scratch_path, dirname))
def get_env():
if env is None:
reset_env()
return env
def pip_install_local(self, *args, **kwargs):
return self.pip("install", "--no-index", "--find-links", find_links,
*args, **kwargs
)
# FIXME ScriptTest does something similar, but only within a single
@ -566,35 +395,40 @@ def assert_all_changes(start_state, end_state, expected_changes):
return diff
def _create_test_package(env):
mkdir('version_pkg')
version_pkg_path = env.scratch_path/'version_pkg'
write_file('version_pkg.py', textwrap.dedent('''\
def main():
print('0.1')
'''), version_pkg_path)
write_file('setup.py', textwrap.dedent('''\
from setuptools import setup, find_packages
setup(name='version_pkg',
version='0.1',
packages=find_packages(),
py_modules=['version_pkg'],
entry_points=dict(console_scripts=['version_pkg=version_pkg:main']))
'''), version_pkg_path)
env.run('git', 'init', cwd=version_pkg_path)
env.run('git', 'add', '.', cwd=version_pkg_path)
env.run('git', 'commit', '-q',
def _create_test_package(script):
script.scratch_path.join("version_pkg").mkdir()
version_pkg_path = script.scratch_path/'version_pkg'
version_pkg_path.join("version_pkg.py").write(textwrap.dedent("""
def main():
print('0.1')
"""))
version_pkg_path.join("setup.py").write(textwrap.dedent("""
from setuptools import setup, find_packages
setup(
name='version_pkg',
version='0.1',
packages=find_packages(),
py_modules=['version_pkg'],
entry_points=dict(console_scripts=['version_pkg=version_pkg:main'])
)
"""))
script.run('git', 'init', cwd=version_pkg_path)
script.run('git', 'add', '.', cwd=version_pkg_path)
script.run('git', 'commit', '-q',
'--author', 'Pip <python-virtualenv@googlegroups.com>',
'-am', 'initial version', cwd=version_pkg_path)
return version_pkg_path
def _change_test_package_version(env, version_pkg_path):
write_file('version_pkg.py', textwrap.dedent('''\
def _change_test_package_version(script, version_pkg_path):
version_pkg_path.join("version_pkg.py").write(textwrap.dedent('''\
def main():
print("some different version")'''), version_pkg_path)
env.run('git', 'clean', '-qfdx', cwd=version_pkg_path, expect_stderr=True)
env.run('git', 'commit', '-q',
print("some different version")'''))
script.run('git', 'clean', '-qfdx',
cwd=version_pkg_path,
expect_stderr=True,
)
script.run('git', 'commit', '-q',
'--author', 'Pip <python-virtualenv@googlegroups.com>',
'-am', 'messed version',
cwd=version_pkg_path, expect_stderr=True)
@ -604,13 +438,17 @@ def assert_raises_regexp(exception, reg, run, *args, **kwargs):
"""Like assertRaisesRegexp in unittest"""
try:
run(*args, **kwargs)
assert False, "%s should have been thrown" %exception
assert False, "%s should have been thrown" % exception
except Exception:
e = sys.exc_info()[1]
p = re.compile(reg)
assert p.search(str(e)), str(e)
if __name__ == '__main__':
sys.stderr.write("Run pip's tests using py.test. Requires virtualenv, ScriptTest, mock, and pytest.\n")
sys.exit(1)
#
# This cleanup routine prevents the __del__ method that cleans up the tree of
# the last TestPipEnvironment from firing after shutil has already been
# unloaded. It also ensures that FastTestPipEnvironment doesn't leave an
# environment hanging around that might confuse the next test run.
#
atexit.register(fast_test_env_root.rmtree)

View File

@ -1,8 +1,8 @@
import textwrap
from tests.lib import (mkdir, write_file,)
def _create_test_package_submodule(env):
mkdir('version_pkg_submodule')
env.scratch_path.join("version_pkg_submodule").mkdir()
submodule_path = env.scratch_path/'version_pkg_submodule'
env.run('touch', 'testfile', cwd=submodule_path)
env.run('git', 'init', cwd=submodule_path)
@ -13,8 +13,8 @@ def _create_test_package_submodule(env):
return submodule_path
def _change_test_package_submodule(env, submodule_path):
write_file(submodule_path/'testfile', 'this is a changed file')
write_file(submodule_path/'testfile2', 'this is an added file')
submodule_path.join("testfile").write("this is a changed file")
submodule_path.join("testfile2").write("this is an added file")
env.run('git', 'add', '.', cwd=submodule_path)
env.run('git', 'commit', '-q',
'--author', 'Pip <python-virtualenv@googlegroups.com>',
@ -27,23 +27,23 @@ def _pull_in_submodule_changes_to_module(env, module_path):
'-am', 'submodule change', cwd=module_path)
def _create_test_package_with_submodule(env):
mkdir('version_pkg')
env.scratch_path.join("version_pkg").mkdir()
version_pkg_path = env.scratch_path/'version_pkg'
mkdir(version_pkg_path/'testpkg')
version_pkg_path.join("testpkg").mkdir()
pkg_path = version_pkg_path/'testpkg'
write_file('__init__.py', '# hello there', pkg_path)
write_file('version_pkg.py', textwrap.dedent('''\
pkg_path.join("__init__.py").write("# hello there")
pkg_path.join("version_pkg.py").write(textwrap.dedent('''\
def main():
print('0.1')
'''), pkg_path)
write_file('setup.py', textwrap.dedent('''\
'''))
version_pkg_path.join("setup.py").write(textwrap.dedent('''\
from setuptools import setup, find_packages
setup(name='version_pkg',
version='0.1',
packages=find_packages(),
)
'''), version_pkg_path)
'''))
env.run('git', 'init', cwd=version_pkg_path, expect_error=True)
env.run('git', 'add', '.', cwd=version_pkg_path, expect_error=True)
env.run('git', 'commit', '-q',

View File

@ -3,7 +3,6 @@ import subprocess
from pip.vcs import subversion, git, bazaar, mercurial
from pip.backwardcompat import urlretrieve
from tests.lib import path_to_url
from tests.lib.pypi_server import PyPIProxy
if hasattr(subprocess, "check_call"):
@ -12,6 +11,9 @@ else:
subprocess_call = subprocess.call
CACHE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'tests_cache')
def _create_initools_repository():
subprocess_call('svnadmin create INITools'.split(), cwd=_get_vcs_folder())
@ -35,10 +37,9 @@ def _create_svn_repository_for_initools():
def _get_vcs_folder():
folder_name = PyPIProxy.CACHE_PATH
if not os.path.exists(folder_name):
os.mkdir(folder_name)
return folder_name
if not os.path.exists(CACHE_PATH):
os.mkdir(CACHE_PATH)
return CACHE_PATH
def _get_vcs_and_checkout_url(remote_repository):

View File

@ -1,138 +0,0 @@
import os
import sys
import pip.backwardcompat
from pip.backwardcompat import urllib, string_types, b, u, emailmessage
urlopen_original = pip.backwardcompat.urllib2.urlopen
class CachedResponse(object):
"""
CachedResponse always cache url access and returns the cached response.
It returns an object compatible with ``urllib.addinfourl``,
it means the object is like the result of a call like::
>>> response = urllib2.urlopen('http://example.com')
"""
def __init__(self, url, folder):
self.headers = emailmessage.Message()
# patch due to setuptools>=0.7 header processing
# easy_install fails w/o this on windows/py2
# https://github.com/pypa/pip/issues/946#issuecomment-20860320
if sys.version_info < (3,):
def getheaders(key):
return self.headers.get_all(key)
self.headers.getheaders = getheaders
self.code = 500
self.msg = 'Internal Server Error'
# url can be a simple string, or a urllib2.Request object
if isinstance(url, string_types):
self.url = url
else:
self.url = url.get_full_url()
for key, value in url.headers.items():
self.headers[key] = value
self._body = b('')
self._set_all_fields(folder)
def _set_all_fields(self, folder):
filename = os.path.join(folder, urllib.quote(self.url, ''))
if not os.path.exists(filename):
self._cache_url(filename)
fp = open(filename, 'rb')
try:
line = fp.readline().strip()
self.code, self.msg = line.split(None, 1)
except ValueError:
raise ValueError('Bad field line: %r' % line)
self.code = int(self.code)
self.msg = u(self.msg)
for line in fp:
if line == b('\n'):
break
key, value = line.split(b(': '), 1)
self.headers[u(key)] = u(value.strip())
for line in fp:
self._body += line
fp.close()
def getcode(self):
return self.code
def geturl(self):
return self.url
def info(self):
return self.headers
def read(self, bytes=None):
"""
it can read a chunk of bytes or everything
"""
if bytes:
result = self._body[:bytes]
self._body = self._body[bytes:]
return result
return self._body
def close(self):
pass
def _cache_url(self, filepath):
response = urlopen_original(self.url)
fp = open(filepath, 'wb')
# when it uses file:// scheme, code is None and there is no msg attr
# but it has been successfully opened
status = b('%s %s' % (getattr(response, 'code', 200) or 200, getattr(response, 'msg', 'OK')))
headers = [b('%s: %s' % (key, value)) for key, value in list(response.headers.items())]
body = response.read()
fp.write(b('\n').join([status] + headers + [b(''), body]))
fp.close()
class PyPIProxy(object):
CACHE_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'tests_cache')
@classmethod
def setup(cls):
instance = cls()
instance._create_cache_folder()
instance._monkey_patch_urllib2_to_cache_everything()
def _monkey_patch_urllib2_to_cache_everything(self):
def urlopen(url):
return CachedResponse(url, self.CACHE_PATH)
pip.backwardcompat.urllib2.urlopen = urlopen
def _create_cache_folder(self):
if not os.path.exists(self.CACHE_PATH):
os.mkdir(self.CACHE_PATH)
def assert_equal(a, b):
assert a == b, "\nexpected:\n%r\ngot:\n%r" % (b, a)
def test_cache_proxy():
url = 'http://example.com'
here = os.path.dirname(os.path.abspath(__file__))
filepath = os.path.join(here, urllib.quote(url, ''))
if os.path.exists(filepath):
os.remove(filepath)
response = pip.backwardcompat.urllib2.urlopen(url)
r = CachedResponse(url, here)
try:
assert_equal(r.code, response.code)
assert_equal(r.msg, response.msg)
assert_equal(r.read(), response.read())
assert_equal(r.url, response.url)
assert_equal(r.geturl(), response.geturl())
assert_equal(set(r.headers.keys()), set(response.headers.keys()))
assert_equal(set(r.info().keys()), set(response.info().keys()))
assert_equal(r.headers['content-length'], response.headers['content-length'])
finally:
os.remove(filepath)

View File

@ -1,109 +1,9 @@
"""Test the test support."""
import filecmp
import imp
import os
import re
import sys
from os.path import join, isdir
from pip.backwardcompat import uses_pycache
from tests.lib import tests_lib, reset_env, run_pip, src_folder
patch_urlopen = """
def mock_isdir(d):
pass
import os
os.path.isdir = mock_isdir
"""
def test_pypiproxy_patch_applied():
"""
Test the PyPIProxy.setup() patch was applied, and sys.path returned to normal
"""
env = reset_env()
result = env.run('python', '-c', "import pip; print(pip.backwardcompat.urllib2.urlopen.__module__)")
#if it were not patched, the result would be 'urllib2'
assert "pypi_server"== result.stdout.strip(), result.stdout
#confirm the temporary sys.path adjustment is gone
result = env.run('python', '-c', "import sys; print(sys.path)")
paths = eval(result.stdout.strip())
assert tests_lib not in paths, paths
class Test_reset_env:
def setup(self):
# create a TestPipEnvironment env and add a file to the backup
self.env = reset_env()
self.test_file = self.env.backup_path / self.env.venv / 'test_file'
f = open(self.test_file, 'w')
f.close()
def teardown(self):
if os.path.isfile(self.test_file):
self.test_file.rm()
def test_cache_venv(self):
"""
Test reset_env cache's internal virtualenv
"""
env = reset_env()
assert os.path.isfile(self.test_file)
def test_reset_env_system_site_packages(self):
"""
Test using system_site_packages with reset_env resets the venv cache
"""
env = reset_env(system_site_packages=True)
env = reset_env()
assert not os.path.isfile(self.env.backup_path / self.env.venv / 'test_file')
def test_add_patch_to_sitecustomize():
"""
Test adding monkey patch snippet to sitecustomize.py (using TestPipEnvironment)
"""
env = reset_env(sitecustomize=patch_urlopen)
if uses_pycache:
# caught py32 with an outdated __pycache__ file after a sitecustomize update (after python should have updated it)
# https://github.com/pypa/pip/pull/893#issuecomment-16426701
# now we delete the cache file to be sure in TestPipEnvironment._add_to_sitecustomize
# it should not exist after creating the env
cache_path = imp.cache_from_source(env.lib_path / 'sitecustomize.py')
assert not os.path.isfile(cache_path)
debug_content = open(env.lib_path / 'sitecustomize.py').read()
result = env.run('python', '-c', "import os; print(os.path.isdir.__module__)")
if uses_pycache:
# if this next assert fails, let's have the modified time to look at
cache_path = imp.cache_from_source(env.lib_path / 'sitecustomize.py')
src_mtime = os.stat(env.lib_path / 'sitecustomize.py').st_mtime
cache_mtime = os.stat(cache_path).st_mtime
debug_content += "src mtime: %s, cache mtime: %s" % (src_mtime, cache_mtime)
assert "sitecustomize" == result.stdout.strip(), result.stdout
def test_sitecustomize_not_growing_in_fast_environment():
"""
Test that the sitecustomize is not growing with redundant patches in the cached fast environment
"""
patch = "fu = 'bar'"
env1 = reset_env(sitecustomize=patch)
sc1 = env1.lib_path / 'sitecustomize.py'
size1 = os.stat(sc1).st_size
env2 = reset_env(sitecustomize=patch)
sc2 = env2.lib_path / 'sitecustomize.py'
size2 = os.stat(sc2).st_size
assert size1==size2, "size before, %d != size after, %d" %(size1, size2)
from tests.lib import reset_env, src_folder
def test_tmp_dir_exists_in_env():
@ -121,11 +21,11 @@ def test_correct_pip_version():
"""
Check we are running proper version of pip in run_pip.
"""
reset_env()
script = reset_env()
# output is like:
# pip PIPVERSION from PIPDIRECTORY (python PYVERSION)
result = run_pip('--version')
result = script.pip('--version')
# compare the directory tree of the invoked pip with that of this source distribution
dir = re.match(r'pip \d(\.[\d])+(\.?(rc|dev|pre|post)\d+)? from (.*) \(python \d(.[\d])+\)$',

View File

@ -3,7 +3,7 @@ from pip.backwardcompat import urllib
from tests.lib.path import Path
from pip.index import package_to_requirement, HTMLPage
from pip.index import PackageFinder, Link, InfLink
from tests.lib import reset_env, run_pip, pyversion, tests_data, path_to_url, find_links
from tests.lib import tests_data, path_to_url, find_links
from string import ascii_lowercase
from mock import patch

View File

@ -12,9 +12,9 @@ import pytest
from mock import Mock, patch
from pip.exceptions import BadCommand
from pip.util import (egg_link_path, Inf, get_installed_distributions, find_command,
untar_file, unzip_file)
from tests.lib import reset_env, mkdir, write_file, tests_data
from pip.util import (egg_link_path, Inf, get_installed_distributions,
find_command, untar_file, unzip_file)
from tests.lib import reset_env, tests_data
class Tests_EgglinkPath:
@ -209,13 +209,13 @@ def test_find_command_folder_in_path():
the 'git' executable, it should not match the folder, but rather keep
looking.
"""
env = reset_env()
mkdir('path_one')
path_one = env.scratch_path/'path_one'
mkdir(path_one/'foo')
mkdir('path_two')
path_two = env.scratch_path/'path_two'
write_file(path_two/'foo', '# nothing')
script = reset_env()
script.scratch_path.join("path_one").mkdir()
path_one = script.scratch_path/'path_one'
path_one.join("foo").mkdir()
script.scratch_path.join("path_two").mkdir()
path_two = script.scratch_path/'path_two'
path_two.join("foo").write("# nothing")
found_path = find_command('foo', map(str, [path_one, path_two]))
assert found_path == path_two/'foo'