Skip to content

Commit f7d0667

Browse files
authored
Merge pull request #7066 from chrahunt/refactor/editable-requirement-parts
Factor editable requirement parsing into dedicated function
2 parents 1515407 + ad82dd0 commit f7d0667

File tree

1 file changed

+38
-30
lines changed

1 file changed

+38
-30
lines changed

src/pip/_internal/req/constructors.py

Lines changed: 38 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from pip._internal.utils.filetypes import ARCHIVE_EXTENSIONS
2929
from pip._internal.utils.misc import is_installable_dir, path_to_url, splitext
3030
from pip._internal.utils.typing import MYPY_CHECK_RUNNING
31-
from pip._internal.utils.urls import url_to_path
3231
from pip._internal.vcs import is_url, vcs
3332
from pip._internal.wheel import Wheel
3433

@@ -179,6 +178,37 @@ def deduce_helpful_msg(req):
179178
return msg
180179

181180

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+
182212
# ---- The actual constructors follow ----
183213

184214

@@ -192,29 +222,21 @@ def install_req_from_editable(
192222
constraint=False # type: bool
193223
):
194224
# 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
200225

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+
208230
return InstallRequirement(
209-
req, comes_from, source_dir=source_dir,
231+
parts.requirement, comes_from, source_dir=source_dir,
210232
editable=True,
211-
link=Link(url),
233+
link=parts.link,
212234
constraint=constraint,
213235
use_pep517=use_pep517,
214236
isolated=isolated,
215237
options=options if options else {},
216238
wheel_cache=wheel_cache,
217-
extras=extras_override or (),
239+
extras=parts.extras,
218240
)
219241

220242

@@ -272,20 +294,6 @@ def _get_url_from_path(path, name):
272294
return path_to_url(path)
273295

274296

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-
289297
def parse_req_from_line(name, line_source):
290298
# type: (str, Optional[str]) -> RequirementParts
291299
if is_url(name):

0 commit comments

Comments
 (0)