-
Notifications
You must be signed in to change notification settings - Fork 54
/
test_resolver.py
144 lines (122 loc) · 4.85 KB
/
test_resolver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import pytest
@pytest.mark.parametrize(
('input', 'expected', 'prereleases'),
((tup + (False,))[:3] for tup in [
(['Django'], ['django==1.8']),
(['Flask'],
['flask==0.10.1', 'itsdangerous==0.24', 'markupsafe==0.23',
'jinja2==2.7.3', 'werkzeug==0.10.4']),
(['Jinja2', 'markupsafe'],
['jinja2==2.7.3', 'markupsafe==0.23']),
# We should return a normal release version if prereleases is False
(['SQLAlchemy'],
['sqlalchemy==0.9.9']),
# We should return the prerelease version if prereleases is True
(['SQLAlchemy'],
['sqlalchemy==1.0.0b5'],
True),
# Ipython has extras available, but we don't require them in this test
(['ipython'],
['ipython==2.1.0', 'gnureadline==6.3.3']),
# We should get dependencies for extras
(['ipython[notebook]'],
[
'ipython[notebook]==2.1.0',
'pyzmq==2.1.12',
'jinja2==2.7.3',
'tornado==3.2.2',
'markupsafe==0.23',
'gnureadline==6.3.3']
),
# We should get dependencies for multiple extras
(['ipython[notebook,nbconvert]'],
[
# Note that the extras should be sorted
'ipython[nbconvert,notebook]==2.1.0',
'pyzmq==2.1.12',
'jinja2==2.7.3',
'tornado==3.2.2',
'markupsafe==0.23',
'gnureadline==6.3.3',
'pygments==1.5',
'sphinx==0.3']
),
# We must take the union of all extras
(['ipython[notebook]', 'ipython[nbconvert]'],
[
# Note that the extras should be sorted
'ipython[nbconvert,notebook]==2.1.0',
'pyzmq==2.1.12',
'jinja2==2.7.3',
'tornado==3.2.2',
'markupsafe==0.23',
'gnureadline==6.3.3',
'pygments==1.5',
'sphinx==0.3']
),
# We must remove child dependencies from result if parent is removed (e.g. vine from amqp>=2.0)
# See: GH-370
# because of upated dependencies in the test index, we need to pin celery
# in order to reproduce vine removal (because it was readded in later releases)
(['celery<=3.1.23', 'librabbitmq'],
[
'amqp==1.4.9',
'anyjson==0.3.3',
'billiard==3.5.0.2',
'celery==3.1.23',
'kombu==3.0.35',
'librabbitmq==1.6.1',
'pytz==2016.4']
),
# Support specifying loose top-level requirements that could also appear as
# pinned subdependencies.
(['billiard', 'celery',
'fake-piptools-test-with-pinned-deps'],
[
'amqp==1.4.9',
'anyjson==0.3.3',
'billiard==3.3.0.23',
'celery==3.1.18', # this is pinned from test subdependency
'fake-piptools-test-with-pinned-deps==0.1',
'kombu==3.0.35',
'pytz==2016.4']
),
# Exclude package dependcy of setuptools as it is unsafe.
(['html5lib'], ['html5lib==0.999999999']),
# We shouldn't include irrelevant pip constraints
# See: GH-471
(['Flask', ('click', True), ('itsdangerous', True)],
['flask==0.10.1', 'itsdangerous==0.24', 'markupsafe==0.23',
'jinja2==2.7.3', 'werkzeug==0.10.4']
),
# Unsafe dependencies should be filtered
(['setuptools==35.0.0', 'anyjson==0.3.3'], ['anyjson==0.3.3']),
(['fake-piptools-test-with-unsafe-deps==0.1'],
['fake-piptools-test-with-unsafe-deps==0.1']
),
])
)
def test_resolver(resolver, from_line, input, expected, prereleases):
input = [line if isinstance(line, tuple) else (line, False) for line in input]
input = [from_line(req[0], constraint=req[1]) for req in input]
output = resolver(input, prereleases=prereleases).resolve()
output = {str(line) for line in output}
assert output == {str(line) for line in expected}
@pytest.mark.parametrize(
('input', 'expected', 'prereleases'),
((tup + (False,))[:3] for tup in [
(['setuptools==34.0.0'], ['appdirs==1.4.9', 'setuptools==34.0.0', 'packaging==16.8']),
(['fake-piptools-test-with-unsafe-deps==0.1'],
['appdirs==1.4.9',
'setuptools==34.0.0',
'packaging==16.8',
'fake-piptools-test-with-unsafe-deps==0.1'
]),
])
)
def test_resolver__allows_unsafe_deps(resolver, from_line, input, expected, prereleases):
input = [line if isinstance(line, tuple) else (line, False) for line in input]
input = [from_line(req[0], constraint=req[1]) for req in input]
output = resolver(input, prereleases=prereleases, allow_unsafe=True).resolve()
output = {str(line) for line in output}
assert output == {str(line) for line in expected}