Skip to content

Commit ba12e28

Browse files
ejucovyfdintino
authored andcommitted
Adds tests for proper recursive upgrade behavior. refs pypa#304
1 parent 2f66454 commit ba12e28

File tree

7 files changed

+167
-1
lines changed

7 files changed

+167
-1
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from setuptools import setup, find_packages
2+
3+
version = '0.1'
4+
5+
setup(name='FSPkgUsesInitools',
6+
version=version,
7+
description="File system test package",
8+
long_description="""\
9+
File system test package""",
10+
classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
11+
keywords='pip tests',
12+
author='pip',
13+
author_email='[email protected]',
14+
url='http://pip.openplans.org',
15+
license='',
16+
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
17+
include_package_data=True,
18+
zip_safe=False,
19+
install_requires=[
20+
"INItools",
21+
],
22+
entry_points="""
23+
# -*- Entry points: -*-
24+
""",
25+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from setuptools import setup, find_packages
2+
3+
version = '0.1'
4+
5+
setup(name='FSPkgUsesInitools',
6+
version=version,
7+
description="File system test package",
8+
long_description="""\
9+
File system test package""",
10+
classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
11+
keywords='pip tests',
12+
author='pip',
13+
author_email='[email protected]',
14+
url='http://pip.openplans.org',
15+
license='',
16+
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
17+
include_package_data=True,
18+
zip_safe=False,
19+
install_requires=[
20+
"INItools",
21+
],
22+
entry_points="""
23+
# -*- Entry points: -*-
24+
""",
25+
)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from setuptools import setup, find_packages
2+
3+
version = '0.1'
4+
5+
setup(name='FSPkgUsesNewishInitools',
6+
version=version,
7+
description="File system test package",
8+
long_description="""\
9+
File system test package""",
10+
classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
11+
keywords='pip tests',
12+
author='pip',
13+
author_email='[email protected]',
14+
url='http://pip.openplans.org',
15+
license='',
16+
packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
17+
include_package_data=True,
18+
zip_safe=False,
19+
install_requires=[
20+
"INItools>=0.3",
21+
],
22+
entry_points="""
23+
# -*- Entry points: -*-
24+
""",
25+
)

tests/test_upgrade.py

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
import textwrap
2-
from os.path import join
2+
from os.path import abspath, join
3+
from pkg_resources import parse_version
34
from nose.tools import nottest
45
from tests.test_pip import (here, reset_env, run_pip, assert_all_changes,
56
write_file, pyversion, _create_test_package,
67
_change_test_package_version)
78
from tests.local_repos import local_checkout
89

910

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+
1018
def test_no_upgrade_unless_requested():
1119
"""
1220
No upgrade if not specifically requested.
@@ -56,6 +64,86 @@ def test_upgrade_with_newest_already_installed():
5664
assert 'already up-to-date' in result.stdout
5765

5866

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+
59147
def test_upgrade_force_reinstall_newest():
60148
"""
61149
Force reinstallation of a package even if it is already at its newest

0 commit comments

Comments
 (0)