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"])
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'])
def test_uninstall_from_reqs_file(): """ Test uninstall from a requirements file. """ env = reset_env() write_file('test-req.txt', 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("""\ # -f, -i, and --extra-index-url should all be ignored by uninstall -f http://www.example.com -i http://www.example.com --extra-index-url http://www.example.com -e %s#egg=initools-dev # 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') assert_all_changes( result, result2, [env.venv/'build', env.venv/'src', env.scratch/'test-req.txt'])
def test_uninstall_overlapping_package(): """ Uninstalling a distribution that adds modules to a pre-existing package should only remove those added modules, not the rest of the existing package. See: GitHub issue #355 (pip uninstall removes things it didn't install) """ parent_pkg = abspath(join(here, 'packages', 'parent-0.1.tar.gz')) child_pkg = abspath(join(here, '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()) #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()) # Additional check: uninstalling 'child' should return things to the # previous state, without unintended side effects. assert_all_changes(result2, result3, [])
def test_uninstall_from_reqs_file(): """ Test uninstall from a requirements file. """ env = reset_env() write_file( 'test-req.txt', 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("""\ # -f, -i, and --extra-index-url should all be ignored by uninstall -f http://www.example.com -i http://www.example.com --extra-index-url http://www.example.com -e %s#egg=initools-dev # 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') assert_all_changes( result, result2, [env.venv / 'build', env.venv / 'src', env.scratch / 'test-req.txt'])
def test_upgrade_from_reqs_file(): """ Upgrade from a requirements file. """ env = reset_env() write_file( "test-req.txt", 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( """\ 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"])
def test_upgrade_from_reqs_file(): """ Upgrade from a requirements file. """ env = reset_env() write_file( 'test-req.txt', 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("""\ 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'])
def test_uninstall_from_usersite(self): """ 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'])
def test_simple_uninstall(): """ Test simple install and uninstall. """ env = reset_env() result = run_pip('install', 'INITools==0.2', expect_error=True) assert join(env.site_packages, 'initools') in result.files_created, sorted(result.files_created.keys()) result2 = run_pip('uninstall', 'INITools', '-y', expect_error=True) assert_all_changes(result, result2, [env.venv/'build', 'cache'])
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'])
def test_simple_uninstall(): """ Test simple install and uninstall. """ env = reset_env() result = run_pip("install", "INITools==0.2", expect_error=True) assert join(env.site_packages, "initools") in result.files_created, sorted(result.files_created.keys()) result2 = run_pip("uninstall", "INITools", "-y", expect_error=True) assert_all_changes(result, result2, [env.venv / "build", "cache"])
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) # 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"])
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) #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'])
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) #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'])
def test_simple_uninstall(): """ Test simple install and uninstall. """ env = reset_env() result = run_pip('install', 'INITools==0.2', expect_error=True) assert join(env.site_packages, 'initools') in result.files_created, sorted( result.files_created.keys()) result2 = run_pip('uninstall', 'INITools', '-y', expect_error=True) assert_all_changes(result, result2, [env.venv / 'build', 'cache'])
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" 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"])
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()) # 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"])
def test_uninstall_easy_installed_console_scripts(): """ Test uninstalling package with console_scripts that is easy_installed. """ env = 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"])
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) 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'])
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) 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'])
def test_uninstall_console_scripts(): """ Test uninstalling a package with more files (console_script entry points, extra directories). """ env = 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"])
def test_uninstall_easy_installed_console_scripts(): """ Test uninstalling package with console_scripts that is easy_installed. """ env = 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'])
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' % 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'])
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()) #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'])
def test_uninstall_console_scripts(): """ Test uninstalling a package with more files (console_script entry points, extra directories). """ env = 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'])
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' 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'])
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) 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"])
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' 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'])
def test_upgrade_to_same_version_from_url(): """ When installing from a URL the same version that is already installed, no 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) 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'])
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()) #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'])
def test_uninstall_easy_installed_console_scripts(): """ Test uninstalling package with console_scripts that is easy_installed. """ env = 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'])
def test_upgrade_force_reinstall_newest(): """ Force reinstallation of a package even if it is already at its 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') 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'])
def test_uninstall_console_scripts(): """ Test uninstalling a package with more files (console_script entry points, extra directories). """ env = 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'])
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" % 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"])
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' % 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'])
def test_uninstall_rollback(): """ Test uninstall-rollback (using test package with a setup.py crafted to fail on install). """ env = reset_env() find_links = path_to_url(os.path.join(here, 'packages')) 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) 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'])
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 ) 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"])
def test_uninstall_rollback(): """ Test uninstall-rollback (using test package with a setup.py crafted to fail on install). """ env = reset_env() find_links = "file://" + join(here, "packages") 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) 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"])
def test_uninstall_as_egg(): """ Test uninstall package installed as egg. """ env = reset_env() to_install = abspath(join(here, "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 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"])
def test_uninstall_as_egg(): """ Test uninstall package installed as egg. """ env = reset_env() to_install = abspath(join(here, '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 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'])
def test_uninstall_as_egg(): """ Test uninstall package installed as egg. """ env = reset_env() to_install = abspath(join(here, '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 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'])
def test_uninstall_editable_from_usersite(self): """ Test uninstall editable local user install """ env = reset_env(use_distribute=True, system_site_packages=True) #install to_install = abspath(join(here, 'packages', 'FSPkg')) result1 = run_pip('install', '--user', '-e', to_install, expect_error=False) egg_link = env.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) assert_all_changes(result1, result2, [env.venv/'build', 'cache', env.user_site/'easy-install.pth'])
def test_debian_egg_name_workaround(): """ We can uninstall packages installed with the pyversion removed from the egg-info metadata directory name. Refs: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=618367 https://bugs.launchpad.net/ubuntu/+source/distribute/+bug/725178 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) egg_info = os.path.join(env.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, # since our test runs inside a venv we'll still have the normal .egg-info 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") 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) assert os.path.isdir(full_egg_info) full_mangled = os.path.join(env.root_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'])
def test_uninstall_overlapping_package(): """ Uninstalling a distribution that adds modules to a pre-existing package should only remove those added modules, not the rest of the existing package. See: GitHub issue #355 (pip uninstall removes things it didn't install) """ parent_pkg = abspath(join(here, 'packages', 'parent-0.1.tar.gz')) child_pkg = abspath(join(here, '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()) #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()) # Additional check: uninstalling 'child' should return things to the # previous state, without unintended side effects. assert_all_changes(result2, result3, [])