mirror of
https://github.com/kennethreitz/pipenv.git
synced 2026-06-05 06:46:15 +00:00
Fix parsing of markers in VCS requirements
- Parsing of markers in non-editable vcs requirements was broken - This PR adds some VCS repos, some utility pipfile generation functions and some fixture helpers - Fixes #3249 Signed-off-by: Dan Ryan <dan@danryan.co>
This commit is contained in:
+15
@@ -0,0 +1,15 @@
|
||||
[submodule "tests/test_artifacts/git/six-1.9.0"]
|
||||
path = tests/test_artifacts/git/six-1.9.0
|
||||
url = https://github.com/benjaminp/six.git
|
||||
[submodule "tests/test_artifacts/git/pinax"]
|
||||
path = tests/test_artifacts/git/pinax
|
||||
url = https://github.com/pinax/pinax.git
|
||||
[submodule "tests/test_artifacts/git/requests"]
|
||||
path = tests/test_artifacts/git/requests
|
||||
url = https://github.com/requests/requests.git
|
||||
[submodule "tests/test_artifacts/git/six"]
|
||||
path = tests/test_artifacts/git/six
|
||||
url = https://github.com/benjaminp/six.git
|
||||
[submodule "tests/test_artifacts/git/dateutil"]
|
||||
path = tests/test_artifacts/git/dateutil
|
||||
url = https://github.com/dateutil/dateutil
|
||||
@@ -0,0 +1 @@
|
||||
Adding normal pep 508 compatible markers is now fully functional when using VCS dependencies.
|
||||
@@ -296,7 +296,6 @@ def uninstall(
|
||||
if retcode:
|
||||
sys.exit(retcode)
|
||||
|
||||
|
||||
@cli.command(short_help="Generates Pipfile.lock.")
|
||||
@lock_options
|
||||
@pass_state
|
||||
|
||||
+5
-1
@@ -1361,7 +1361,11 @@ def pip_install(
|
||||
ignore_hashes = True
|
||||
else:
|
||||
ignore_hashes = True if not requirement.hashes else False
|
||||
install_reqs = [escape_cmd(r) for r in requirement.as_line(as_list=True)]
|
||||
install_reqs = requirement.as_line(as_list=True)
|
||||
if not requirement.markers:
|
||||
install_reqs = [escape_cmd(r) for r in install_reqs]
|
||||
elif len(install_reqs) > 1:
|
||||
install_reqs = install_reqs[0] + [escape_cmd(r) for r in install_reqs[1:]]
|
||||
pip_command = [which_pip(allow_global=allow_global), "install"]
|
||||
if pre:
|
||||
pip_command.append("--pre")
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
addopts = -ra -n auto
|
||||
testpaths = tests
|
||||
; Add vendor and patched in addition to the default list of ignored dirs
|
||||
norecursedirs = .* build dist CVS _darcs {arch} *.egg vendor patched news tasks docs
|
||||
norecursedirs = .* build dist CVS _darcs {arch} *.egg vendor patched news tasks docs tests/test_artifacts
|
||||
filterwarnings =
|
||||
ignore::DeprecationWarning
|
||||
ignore::PendingDeprecationWarning
|
||||
|
||||
@@ -9,6 +9,7 @@ from pipenv._compat import TemporaryDirectory, Path
|
||||
from pipenv.vendor import delegator
|
||||
from pipenv.vendor import requests
|
||||
from pipenv.vendor import toml
|
||||
from pipenv.vendor import tomlkit
|
||||
from pytest_pypi.app import prepare_packages as prepare_pypi_packages
|
||||
from vistir.compat import ResourceWarning, fs_str
|
||||
from vistir.path import mkdir_p
|
||||
@@ -119,6 +120,44 @@ WE_HAVE_INTERNET = check_internet()
|
||||
WE_HAVE_GITHUB_SSH_KEYS = check_github_ssh()
|
||||
|
||||
|
||||
class _Pipfile(object):
|
||||
def __init__(self, path):
|
||||
self.path = path
|
||||
self.document = tomlkit.document()
|
||||
self.document["sources"] = tomlkit.aot()
|
||||
self.document["requires"] = tomlkit.table()
|
||||
self.document["packages"] = tomlkit.table()
|
||||
self.document["dev_packages"] = tomlkit.table()
|
||||
|
||||
def install(self, package, value, dev=False):
|
||||
section = "packages" if not dev else "dev_packages"
|
||||
if isinstance(value, dict):
|
||||
table = tomlkit.inline_table()
|
||||
table.update(value)
|
||||
self.document[section][package] = table
|
||||
else:
|
||||
self.document[section][package] = value
|
||||
self.write()
|
||||
|
||||
def loads(self):
|
||||
self.document = tomlkit.loads(self.path.read_text())
|
||||
|
||||
def dumps(self):
|
||||
source_table = tomlkit.table()
|
||||
source_table["url"] = os.environ.get("PIPENV_TEST_INDEX")
|
||||
source_table["verify_ssl"] = False
|
||||
source_table["name"] = "pipenv_test_index"
|
||||
self.document["sources"].append(source_table)
|
||||
return tomlkit.dumps(self.document)
|
||||
|
||||
def write(self):
|
||||
self.path.write_text(self.dumps())
|
||||
|
||||
@classmethod
|
||||
def get_fixture_path(cls, path):
|
||||
return Path(__file__).absolute().parent.parent / "test_artifacts" / path
|
||||
|
||||
|
||||
class _PipenvInstance(object):
|
||||
"""An instance of a Pipenv Project..."""
|
||||
def __init__(self, pypi=None, pipfile=True, chdir=False, path=None, home_dir=None):
|
||||
@@ -129,7 +168,7 @@ class _PipenvInstance(object):
|
||||
os.environ["CI"] = fs_str("1")
|
||||
warnings.simplefilter("ignore", category=ResourceWarning)
|
||||
warnings.filterwarnings("ignore", category=ResourceWarning, message="unclosed.*<ssl.SSLSocket.*>")
|
||||
path = os.environ.get("PIPENV_PROJECT_DIR", None)
|
||||
path = path if path else os.environ.get("PIPENV_PROJECT_DIR", None)
|
||||
if not path:
|
||||
self._path = TemporaryDirectory(suffix='-project', prefix='pipenv-')
|
||||
path = Path(self._path.name)
|
||||
@@ -138,7 +177,7 @@ class _PipenvInstance(object):
|
||||
except OSError:
|
||||
self.path = str(path.absolute())
|
||||
else:
|
||||
self._path = None
|
||||
self._path = path
|
||||
self.path = path
|
||||
# set file creation perms
|
||||
self.pipfile_path = None
|
||||
@@ -154,6 +193,7 @@ class _PipenvInstance(object):
|
||||
|
||||
self.chdir = False or chdir
|
||||
self.pipfile_path = p_path
|
||||
self._pipfile = _Pipfile(Path(p_path))
|
||||
|
||||
def __enter__(self):
|
||||
os.environ['PIPENV_DONT_USE_PYENV'] = fs_str('1')
|
||||
|
||||
@@ -270,3 +270,17 @@ PyInstaller = {ref = "develop", git = "https://github.com/pyinstaller/pyinstalle
|
||||
p.lockfile["default"]["pyinstaller"]["git"]
|
||||
== "https://github.com/pyinstaller/pyinstaller.git"
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.vcs
|
||||
@pytest.mark.install
|
||||
@pytest.mark.needs_internet
|
||||
def test_vcs_can_use_markers(PipenvInstance, pip_src_dir, pypi):
|
||||
with PipenvInstance(chdir=True, pypi=pypi) as p:
|
||||
path = p._pipfile.get_fixture_path("git/six/.git")
|
||||
p._pipfile.install("six", {"git": "{0}".format(path.as_uri()), "markers": "sys_platform == 'linux'"})
|
||||
assert "six" in p.pipfile["packages"]
|
||||
c = p.pipenv("install")
|
||||
assert c.return_code == 0
|
||||
assert "six" in p.lockfile["default"]
|
||||
assert "git" in p.lockfile["default"]["six"]
|
||||
|
||||
Submodule
+1
Submodule tests/test_artifacts/git/dateutil added at 6618dee970
Submodule
+1
Submodule tests/test_artifacts/git/pinax added at 147d854322
Submodule
+1
Submodule tests/test_artifacts/git/requests added at 57d7284c1a
Submodule
+1
Submodule tests/test_artifacts/git/six added at e114efceea
Submodule
+1
Submodule tests/test_artifacts/git/six-1.9.0 added at 5efb522b06
Reference in New Issue
Block a user