|
1 | 1 | import textwrap
|
2 |
| -from os.path import join |
| 2 | +from os.path import abspath, join |
| 3 | +from pkg_resources import parse_version |
3 | 4 | from nose.tools import nottest
|
4 | 5 | from tests.test_pip import (here, reset_env, run_pip, assert_all_changes,
|
5 | 6 | write_file, pyversion, _create_test_package,
|
6 | 7 | _change_test_package_version)
|
7 | 8 | from tests.local_repos import local_checkout
|
8 | 9 |
|
9 | 10 |
|
| 11 | +def _get_pkg_version(env, pkg_name): |
| 12 | + result = env.run('python', '-c', |
| 13 | + "from pkg_resources import get_distribution; " |
| 14 | + "print(get_distribution('%s').version)" % pkg_name) |
| 15 | + return result.stdout.strip() |
| 16 | + |
| 17 | + |
10 | 18 | def test_no_upgrade_unless_requested():
|
11 | 19 | """
|
12 | 20 | No upgrade if not specifically requested.
|
@@ -56,6 +64,86 @@ def test_upgrade_with_newest_already_installed():
|
56 | 64 | assert 'already up-to-date' in result.stdout
|
57 | 65 |
|
58 | 66 |
|
| 67 | +def test_upgrade_without_unneeded_recursive_upgrades(): |
| 68 | + """ |
| 69 | + When upgrading a single package, that package's own dependencies should not be |
| 70 | + upgraded unnecessarily if the user doesn't explicitly ask for them to be upgraded. |
| 71 | + """ |
| 72 | + env = reset_env() |
| 73 | + run_pip('install', 'INITools==0.2') |
| 74 | + |
| 75 | + to_install = abspath(join(here, 'packages', 'FSPkgUsesInitools')) |
| 76 | + run_pip('install', to_install) |
| 77 | + run_pip('install', '--upgrade', to_install) |
| 78 | + assert _get_pkg_version(env, 'initools') == '0.2',\ |
| 79 | + ('pip install --upgrade upgraded recursive dependency INITools ' |
| 80 | + 'when it should not have') |
| 81 | + |
| 82 | + |
| 83 | +def test_upgrade_with_needed_recursive_upgrades(): |
| 84 | + """ |
| 85 | + When upgrading a single package A, that package's own dependencies should be |
| 86 | + upgraded if the installed versions no longer satisfy A's requirements, even if |
| 87 | + the user doesn't explicitly ask for them to be upgraded, |
| 88 | + """ |
| 89 | + env = reset_env() |
| 90 | + to_install = abspath(join(here, 'packages', 'FSPkgUsesNewishInitools')) |
| 91 | + run_pip('install', to_install) |
| 92 | + run_pip('install', 'INITools==0.2') |
| 93 | + run_pip('install', '--upgrade', to_install) |
| 94 | + current_version = _get_pkg_version(env, 'initools') |
| 95 | + assert parse_version(current_version) >= parse_version('0.3'),\ |
| 96 | + ('pip install --upgrade failed to upgrade recursive dependency ' |
| 97 | + 'INITools when it should have') |
| 98 | + |
| 99 | + |
| 100 | +def test_upgrade_with_unneeded_recursive_upgrades_explicitly_requested(): |
| 101 | + """ |
| 102 | + When upgrading a single package A with --upgrade-recursive, all of A's |
| 103 | + dependencies should be upgraded as well, even if the installed versions |
| 104 | + already satisfy A's requirements. |
| 105 | + """ |
| 106 | + env = reset_env() |
| 107 | + run_pip('install', 'INITools==0.2') |
| 108 | + |
| 109 | + to_install = abspath(join(here, 'packages', 'FSPkgUsesInitools')) |
| 110 | + run_pip('install', to_install) |
| 111 | + run_pip('install', '--upgrade-recursive', to_install) |
| 112 | + current_version = _get_pkg_version(env, 'initools') |
| 113 | + assert parse_version(current_version) > parse_version('0.2'),\ |
| 114 | + ('pip install --upgrade failed to upgrade recursive dependency ' |
| 115 | + 'INITools when it was asked to') |
| 116 | + |
| 117 | + |
| 118 | +def test_upgrade_reqs_file_without_unneeded_recursive_upgrades(): |
| 119 | + """ |
| 120 | + When running non-recursive --upgrade against a requirements file, every package |
| 121 | + explicitly listed in the requirements file should be upgraded; but any recursive |
| 122 | + dependencies should not be upgraded. |
| 123 | + """ |
| 124 | + env = reset_env() |
| 125 | + run_pip('install', 'INITools==0.2') |
| 126 | + run_pip('install', 'PyLogo==0.1') |
| 127 | + |
| 128 | + to_install = abspath(join(here, 'packages', 'FSPkgUsesInitools')) |
| 129 | + run_pip('install', to_install) |
| 130 | + |
| 131 | + write_file('test-req.txt', textwrap.dedent("""\ |
| 132 | + %(FSPkgUsesInitools)s |
| 133 | + PyLogo |
| 134 | + """ % {'FSPkgUsesInitools': to_install})) |
| 135 | + |
| 136 | + run_pip('install', '--upgrade', '-r', env.scratch_path/ 'test-req.txt') |
| 137 | + |
| 138 | + pylogo_version = _get_pkg_version(env, 'pylogo') |
| 139 | + assert parse_version(pylogo_version) > parse_version('0.1'),\ |
| 140 | + ('pip install --upgrade failed to upgrade explicit dependency ' |
| 141 | + 'PyLogo when it should have') |
| 142 | + assert _get_pkg_version(env, 'initools') == '0.2',\ |
| 143 | + ('pip install --upgrade upgraded recursive dependency INITools ' |
| 144 | + 'when it should not have') |
| 145 | + |
| 146 | + |
59 | 147 | def test_upgrade_force_reinstall_newest():
|
60 | 148 | """
|
61 | 149 | Force reinstallation of a package even if it is already at its newest
|
|
0 commit comments