28
28
from pip ._internal .utils .filetypes import ARCHIVE_EXTENSIONS
29
29
from pip ._internal .utils .misc import is_installable_dir , path_to_url , splitext
30
30
from pip ._internal .utils .typing import MYPY_CHECK_RUNNING
31
- from pip ._internal .utils .urls import url_to_path
32
31
from pip ._internal .vcs import is_url , vcs
33
32
from pip ._internal .wheel import Wheel
34
33
@@ -179,6 +178,37 @@ def deduce_helpful_msg(req):
179
178
return msg
180
179
181
180
181
+ class RequirementParts (object ):
182
+ def __init__ (
183
+ self ,
184
+ requirement , # type: Optional[Requirement]
185
+ link , # type: Optional[Link]
186
+ markers , # type: Optional[Marker]
187
+ extras , # type: Set[str]
188
+ ):
189
+ self .requirement = requirement
190
+ self .link = link
191
+ self .markers = markers
192
+ self .extras = extras
193
+
194
+
195
+ def parse_req_from_editable (editable_req ):
196
+ # type: (str) -> RequirementParts
197
+ name , url , extras_override = parse_editable (editable_req )
198
+
199
+ if name is not None :
200
+ try :
201
+ req = Requirement (name )
202
+ except InvalidRequirement :
203
+ raise InstallationError ("Invalid requirement: '%s'" % name )
204
+ else :
205
+ req = None
206
+
207
+ link = Link (url )
208
+
209
+ return RequirementParts (req , link , None , extras_override )
210
+
211
+
182
212
# ---- The actual constructors follow ----
183
213
184
214
@@ -192,29 +222,21 @@ def install_req_from_editable(
192
222
constraint = False # type: bool
193
223
):
194
224
# type: (...) -> InstallRequirement
195
- name , url , extras_override = parse_editable (editable_req )
196
- if url .startswith ('file:' ):
197
- source_dir = url_to_path (url )
198
- else :
199
- source_dir = None
200
225
201
- if name is not None :
202
- try :
203
- req = Requirement (name )
204
- except InvalidRequirement :
205
- raise InstallationError ("Invalid requirement: '%s'" % name )
206
- else :
207
- req = None
226
+ parts = parse_req_from_editable (editable_req )
227
+
228
+ source_dir = parts .link .file_path if parts .link .scheme == 'file' else None
229
+
208
230
return InstallRequirement (
209
- req , comes_from , source_dir = source_dir ,
231
+ parts . requirement , comes_from , source_dir = source_dir ,
210
232
editable = True ,
211
- link = Link ( url ) ,
233
+ link = parts . link ,
212
234
constraint = constraint ,
213
235
use_pep517 = use_pep517 ,
214
236
isolated = isolated ,
215
237
options = options if options else {},
216
238
wheel_cache = wheel_cache ,
217
- extras = extras_override or () ,
239
+ extras = parts . extras ,
218
240
)
219
241
220
242
@@ -272,20 +294,6 @@ def _get_url_from_path(path, name):
272
294
return path_to_url (path )
273
295
274
296
275
- class RequirementParts (object ):
276
- def __init__ (
277
- self ,
278
- requirement , # type: Optional[Requirement]
279
- link , # type: Optional[Link]
280
- markers , # type: Optional[Marker]
281
- extras , # type: Set[str]
282
- ):
283
- self .requirement = requirement
284
- self .link = link
285
- self .markers = markers
286
- self .extras = extras
287
-
288
-
289
297
def parse_req_from_line (name , line_source ):
290
298
# type: (str, Optional[str]) -> RequirementParts
291
299
if is_url (name ):
0 commit comments