Skip to content

Commit d83483a

Browse files
committed
Update requirementslib - fix editable requirements
- Fixes #1393 Signed-off-by: Dan Ryan <[email protected]>
1 parent 6136edc commit d83483a

File tree

6 files changed

+28
-13
lines changed

6 files changed

+28
-13
lines changed

news/1393.bugfix

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed a bug which prevented installation of editable requirements using ``ssh://`` style urls

pipenv/core.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ def do_install_dependencies(
661661
662662
If requirements is True, simply spits out a requirements format to stdout.
663663
"""
664-
from .vendor.requirementslib import Requirement
664+
from .vendor.requirementslib.models.requirements import Requirement
665665

666666
def cleanup_procs(procs, concurrent):
667667
for c in procs:
@@ -927,7 +927,7 @@ def parse_download_fname(fname, name):
927927

928928

929929
def get_downloads_info(names_map, section):
930-
from .vendor.requirementslib import Requirement
930+
from .vendor.requirementslib.models.requirements import Requirement
931931

932932
info = []
933933
p = project.parsed_pipfile
@@ -1614,7 +1614,7 @@ def do_py(system=False):
16141614

16151615

16161616
def do_outdated(pypi_mirror=None):
1617-
from .vendor.requirementslib import Requirement
1617+
from .vendor.requirementslib.models.requirements import Requirement
16181618

16191619
packages = {}
16201620
results = delegator.run("{0} freeze".format(which("pip"))).out.strip().split("\n")
@@ -1816,7 +1816,7 @@ def do_install(
18161816
# We should do this part first to make sure that we actually do selectively upgrade
18171817
# the items specified
18181818
if selective_upgrade:
1819-
from .vendor.requirementslib import Requirement
1819+
from .vendor.requirementslib.models.requirements import Requirement
18201820

18211821
for i, package in enumerate(package_args[:]):
18221822
section = project.packages if not dev else project.dev_packages
@@ -1966,7 +1966,7 @@ def do_uninstall(
19661966
pypi_mirror=None,
19671967
):
19681968
from .environments import PIPENV_USE_SYSTEM
1969-
from .vendor.requirementslib import Requirement
1969+
from .vendor.requirementslib.models.requirements import Requirement
19701970

19711971
# Automatically use an activated virtualenv.
19721972
if PIPENV_USE_SYSTEM:

pipenv/utils.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def actually_resolve_deps(
227227
from pipenv.patched.piptools.scripts.compile import get_pip_command
228228
from pipenv.patched.piptools import logging as piptools_logging
229229
from pipenv.patched.piptools.exceptions import NoCandidateFound
230-
from .vendor.requirementslib import Requirement
230+
from .vendor.requirementslib.models.requirements import Requirement
231231
from ._compat import TemporaryDirectory, NamedTemporaryFile
232232

233233
class PipCommand(basecommand.Command):
@@ -524,7 +524,7 @@ def is_pinned(val):
524524
def convert_deps_to_pip(deps, project=None, r=True, include_index=True):
525525
""""Converts a Pipfile-formatted dependency to a pip-formatted one."""
526526
from ._compat import NamedTemporaryFile
527-
from .vendor.requirementslib import Requirement
527+
from .vendor.requirementslib.models.requirements import Requirement
528528

529529
dependencies = []
530530
for dep_name, dep in deps.items():
@@ -1120,7 +1120,7 @@ def get_vcs_deps(
11201120
):
11211121
from ._compat import TemporaryDirectory, Path
11221122
import atexit
1123-
from .vendor.requirementslib import Requirement
1123+
from .vendor.requirementslib.models.requirements import Requirement
11241124

11251125
section = "vcs_dev_packages" if dev else "vcs_packages"
11261126
reqs = []

pipenv/vendor/requirementslib/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- coding=utf-8 -*-
2-
__version__ = '1.1.7'
2+
__version__ = '1.1.9.dev0'
33

44

55
from .exceptions import RequirementError

pipenv/vendor/requirementslib/models/requirements.py

+17-3
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ class VCSRequirement(FileRequirement):
480480
ref = attr.ib(default=None)
481481
subdirectory = attr.ib(default=None)
482482
_repo = attr.ib(default=None)
483+
_base_line = attr.ib(default=None)
483484
name = attr.ib()
484485
link = attr.ib()
485486
req = attr.ib()
@@ -619,6 +620,13 @@ def locked_vcs_repo(self, src_dir=None):
619620
vcsrepo.checkout_ref(self.ref)
620621
self.ref = self.get_commit_hash()
621622
self.req.revision = self.ref
623+
624+
# Remove potential ref in the end of uri after ref is parsed
625+
if "@" in self.link.show_url and "@" in self.uri:
626+
uri, ref = self.uri.rsplit("@", 1)
627+
if ref in self.ref:
628+
self.uri = uri
629+
622630
yield vcsrepo
623631
self._repo = vcsrepo
624632

@@ -681,6 +689,7 @@ def from_line(cls, line, editable=None, extras=None):
681689
editable=editable,
682690
uri=uri,
683691
extras=extras,
692+
base_line=line
684693
)
685694

686695
@property
@@ -692,8 +701,10 @@ def line_part(self):
692701
base_link = self.get_link()
693702
final_format = "{{0}}#egg={0}".format(base_link.egg_fragment) if base_link.egg_fragment else "{0}"
694703
base = final_format.format(self.vcs_uri)
695-
elif self.req:
696-
base = self.req.line
704+
elif self._base_line:
705+
base = self._base_line
706+
else:
707+
base = self.link.url
697708
if base and self.extras and not extras_to_string(self.extras) in base:
698709
if self.subdirectory:
699710
base = "{0}".format(self.get_link().url)
@@ -717,7 +728,9 @@ def _choose_vcs_source(pipfile):
717728

718729
@property
719730
def pipfile_part(self):
720-
pipfile_dict = attr.asdict(self, filter=lambda k, v: bool(v) is True and k.name != '_repo').copy()
731+
excludes = ["_repo", "_base_line"]
732+
filter_func = lambda k, v: bool(v) is True and k.name not in excludes
733+
pipfile_dict = attr.asdict(self, filter=filter_func).copy()
721734
if "vcs" in pipfile_dict:
722735
pipfile_dict = self._choose_vcs_source(pipfile_dict)
723736
name, _ = _strip_extras(pipfile_dict.pop("name"))
@@ -814,6 +827,7 @@ def from_line(cls, line):
814827
hashes = line.split(" --hash=")
815828
line, hashes = hashes[0], hashes[1:]
816829
editable = line.startswith("-e ")
830+
print("Got line: %s" % line)
817831
line = line.split(" ", 1)[1] if editable else line
818832
line, markers = split_markers_from_line(line)
819833
line, extras = _strip_extras(line)

pipenv/vendor/requirementslib/models/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def strip_ssh_from_git_uri(uri):
117117

118118

119119
def add_ssh_scheme_to_git_uri(uri):
120-
"""Cleans VCS uris from pipenv.patched.notpip format"""
120+
"""Cleans VCS uris from pip format"""
121121
if isinstance(uri, six.string_types):
122122
# Add scheme for parsing purposes, this is also what pip does
123123
if uri.startswith("git+") and "://" not in uri:

0 commit comments

Comments
 (0)