@@ -19,10 +19,18 @@ index 4e6174c..75f9b49 100644
19
19
# NOTE
20
20
# We used to store the cache dir under ~/.pip-tools, which is not the
21
21
diff --git a/pipenv/patched/piptools/repositories/pypi.py b/pipenv/patched/piptools/repositories/pypi.py
22
- index 1c4b943..8320e14 100644
22
+ index 1c4b943..858d697 100644
23
23
--- a/pipenv/patched/piptools/repositories/pypi.py
24
24
+++ b/pipenv/patched/piptools/repositories/pypi.py
25
- @@ -15,10 +15,16 @@ from .._compat import (
25
+ @@ -4,6 +4,7 @@ from __future__ import (absolute_import, division, print_function,
26
+
27
+ import hashlib
28
+ import os
29
+ + import sys
30
+ from contextlib import contextmanager
31
+ from shutil import rmtree
32
+
33
+ @@ -15,13 +16,22 @@ from .._compat import (
26
34
Wheel,
27
35
FAVORITE_HASH,
28
36
TemporaryDirectory,
@@ -32,15 +40,23 @@ index 1c4b943..8320e14 100644
32
40
+ SafeFileCache,
33
41
)
34
42
35
- + from pip._vendor.packaging.requirements import InvalidRequirement
43
+ + from pip._vendor.packaging.requirements import InvalidRequirement, Requirement
44
+ + from pip._vendor.packaging.version import Version, InvalidVersion, parse as parse_version
45
+ + from pip._vendor.packaging.specifiers import SpecifierSet
36
46
+ from pip._vendor.pyparsing import ParseException
37
47
+
38
48
from ..cache import CACHE_DIR
39
49
+ from pipenv.environments import PIPENV_CACHE_DIR
40
50
from ..exceptions import NoCandidateFound
41
- from ..utils import (fs_str, is_pinned_requirement, lookup_table,
42
- make_install_requirement)
43
- @@ -37,6 +43,40 @@ except ImportError:
51
+ - from ..utils import (fs_str, is_pinned_requirement, lookup_table,
52
+ - make_install_requirement)
53
+ + from ..utils import (fs_str, is_pinned_requirement, lookup_table, as_tuple, key_from_req,
54
+ + make_install_requirement, format_requirement, dedup)
55
+ +
56
+ from .base import BaseRepository
57
+
58
+
59
+ @@ -37,6 +47,40 @@ except ImportError:
44
60
from pip.wheel import WheelCache
45
61
46
62
@@ -81,7 +97,7 @@ index 1c4b943..8320e14 100644
81
97
class PyPIRepository(BaseRepository):
82
98
DEFAULT_INDEX_URL = PyPI.simple_url
83
99
84
- @@ -46,10 +86 ,11 @@ class PyPIRepository(BaseRepository):
100
+ @@ -46,10 +90 ,11 @@ class PyPIRepository(BaseRepository):
85
101
config), but any other PyPI mirror can be used if index_urls is
86
102
changed/configured on the Finder.
87
103
"""
@@ -95,7 +111,7 @@ index 1c4b943..8320e14 100644
95
111
96
112
index_urls = [pip_options.index_url] + pip_options.extra_index_urls
97
113
if pip_options.no_index:
98
- @@ -74,11 +115 ,15 @@ class PyPIRepository(BaseRepository):
114
+ @@ -74,11 +119 ,15 @@ class PyPIRepository(BaseRepository):
99
115
# of all secondary dependencies for the given requirement, so we
100
116
# only have to go to disk once for each requirement
101
117
self._dependencies_cache = {}
@@ -113,9 +129,20 @@ index 1c4b943..8320e14 100644
113
129
114
130
def freshen_build_caches(self):
115
131
"""
116
- @@ -116,8 +161,11 @@ class PyPIRepository(BaseRepository):
117
-
118
- all_candidates = self.find_all_candidates(ireq.name)
132
+ @@ -114,10 +163,21 @@ class PyPIRepository(BaseRepository):
133
+ if ireq.editable:
134
+ return ireq # return itself as the best match
135
+
136
+ - all_candidates = self.find_all_candidates(ireq.name)
137
+ + _all_candidates = self.find_all_candidates(ireq.name)
138
+ + all_candidates = []
139
+ + py_version = parse_version(os.environ.get('PIP_PYTHON_VERSION', str(sys.version_info[:3])))
140
+ + for c in _all_candidates:
141
+ + if c.requires_python:
142
+ + python_specifier = SpecifierSet(c.requires_python)
143
+ + if not python_specifier.contains(py_version):
144
+ + continue
145
+ + all_candidates.append(c)
119
146
candidates_by_version = lookup_table(all_candidates, key=lambda c: c.version, unique=True)
120
147
- matching_versions = ireq.specifier.filter((candidate.version for candidate in all_candidates),
121
148
+ try:
@@ -126,7 +153,7 @@ index 1c4b943..8320e14 100644
126
153
127
154
# Reuses pip's internal candidate sort key to sort
128
155
matching_candidates = [candidates_by_version[ver] for ver in matching_versions]
129
- @@ -126,11 +174,60 @@ class PyPIRepository(BaseRepository):
156
+ @@ -126,11 +186,61 @@ class PyPIRepository(BaseRepository):
130
157
best_candidate = max(matching_candidates, key=self.finder._candidate_sort_key)
131
158
132
159
# Turn the candidate into a pinned InstallRequirement
@@ -153,11 +180,12 @@ index 1c4b943..8320e14 100644
153
180
+ r = self.session.get(url)
154
181
+
155
182
+ # TODO: Latest isn't always latest.
156
- + latest = list(r.json()['releases'].keys())[-1]
157
- + if str(ireq.req.specifier) == '=={0}'.format(latest):
158
- + latest_url = 'https://pypi.org/pypi/{0}/{1}/json'.format(ireq.req.name, latest)
159
- + latest_requires = self.session.get(latest_url)
160
- + for requires in latest_requires.json().get('info', {}).get('requires_dist', {}):
183
+ + releases = list(r.json()['releases'].keys())
184
+ + match = [r for r in releases if '=={0}'.format(r) == str(ireq.req.specifier)]
185
+ + if match:
186
+ + release_url = 'https://pypi.org/pypi/{0}/{1}/json'.format(ireq.req.name, match[0])
187
+ + release_requires = self.session.get(release_url)
188
+ + for requires in release_requires.json().get('info', {}).get('requires_dist', {}):
161
189
+ i = InstallRequirement.from_line(requires)
162
190
+
163
191
+ if 'extra' not in repr(i.markers):
@@ -190,7 +218,7 @@ index 1c4b943..8320e14 100644
190
218
"""
191
219
Given a pinned or an editable InstallRequirement, returns a set of
192
220
dependencies (also InstallRequirements, but not necessarily pinned).
193
- @@ -139,6 +236,18 @@ class PyPIRepository(BaseRepository):
221
+ @@ -139,6 +249,21 @@ class PyPIRepository(BaseRepository):
194
222
if not (ireq.editable or is_pinned_requirement(ireq)):
195
223
raise TypeError('Expected pinned or editable InstallRequirement, got {}'.format(ireq))
196
224
@@ -203,13 +231,16 @@ index 1c4b943..8320e14 100644
203
231
+ setup_requires = self.finder.get_extras_links(
204
232
+ dist.get_metadata_lines('requires.txt')
205
233
+ )
206
- + except TypeError:
234
+ + ireq.version = dist.version
235
+ + ireq.project_name = dist.project_name
236
+ + ireq.req = dist.as_requirement()
237
+ + except (TypeError, ValueError):
207
238
+ pass
208
239
+
209
240
if ireq not in self._dependencies_cache:
210
241
if ireq.editable and (ireq.source_dir and os.path.exists(ireq.source_dir)):
211
242
# No download_dir for locally available editable requirements.
212
- @@ -164,11 +273 ,14 @@ class PyPIRepository(BaseRepository):
243
+ @@ -164,11 +289 ,14 @@ class PyPIRepository(BaseRepository):
213
244
download_dir=download_dir,
214
245
wheel_download_dir=self._wheel_download_dir,
215
246
session=self.session,
@@ -226,7 +257,7 @@ index 1c4b943..8320e14 100644
226
257
)
227
258
except TypeError:
228
259
# Pip >= 10 (new resolver!)
229
- @@ -190,14 +302 ,44 @@ class PyPIRepository(BaseRepository):
260
+ @@ -190,14 +318 ,44 @@ class PyPIRepository(BaseRepository):
230
261
upgrade_strategy="to-satisfy-only",
231
262
force_reinstall=False,
232
263
ignore_dependencies=False,
@@ -273,7 +304,7 @@ index 1c4b943..8320e14 100644
273
304
reqset.cleanup_files()
274
305
return set(self._dependencies_cache[ireq])
275
306
276
- @@ -224,17 +366 ,10 @@ class PyPIRepository(BaseRepository):
307
+ @@ -224,17 +382 ,10 @@ class PyPIRepository(BaseRepository):
277
308
matching_candidates = candidates_by_version[matching_versions[0]]
278
309
279
310
return {
0 commit comments