Merge pull request #3253 from pypa/bugfix/3249

Fix parsing of markers in VCS requirements
This commit is contained in:
Dan Ryan
2018-11-19 13:55:02 -05:00
committed by GitHub
18 changed files with 97 additions and 12 deletions
+1
View File
@@ -26,6 +26,7 @@ steps:
export GIT_SSL_CAINFO="$(python -m certifi)"
export LANG="C.UTF-8"
export PIP_PROCESS_DEPENDENCY_LINKS="1"
git submodule sync && git submodule update --init --recursive
pipenv run pytest --junitxml=test-results.xml
displayName: Run integration tests
+2
View File
@@ -12,6 +12,8 @@ steps:
$env:TEMP='T:\'
Write-Host "##vso[task.setvariable variable=TMP]T:\"
$env:TMP='T:\'
git submodule sync
git submodule update --init --recursive
D:\.venv\Scripts\pipenv run pytest -ra --ignore=pipenv\patched --ignore=pipenv\vendor --junitxml=test-results.xml tests
displayName: Run integration tests
+15
View File
@@ -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
+1
View File
@@ -15,6 +15,7 @@ include pipenv/vendor/pipreqs/stdlib pipenv/vendor/pipreqs/mapping
include pipenv/vendor/*.txt pipenv/vendor/pexpect/bashrc.sh
include pipenv/vendor/Makefile
include pipenv/pipenv.1
exclude .gitmodules
exclude .editorconfig .travis.yml .env appveyor.yml tox.ini pytest.ini
exclude Pipfile* CHANGELOG.draft.rst
exclude docker-compose.yml Dockerfile
+1
View File
@@ -0,0 +1 @@
Adding normal pep 508 compatible markers is now fully functional when using VCS dependencies.
-1
View File
@@ -296,7 +296,6 @@ def uninstall(
if retcode:
sys.exit(retcode)
@cli.command(short_help="Generates Pipfile.lock.")
@lock_options
@pass_state
+5 -1
View File
@@ -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
View File
@@ -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
+7 -7
View File
@@ -1,7 +1,7 @@
rem imdisk -a -s 964515b -m R: -p "/FS:NTFS /Y"
virtualenv R:\.venv
R:\.venv\Scripts\pip install -e . --upgrade --upgrade-strategy=only-if-needed
R:\.venv\Scripts\pipenv install --dev
SET RAM_DISK=R: && R:\.venv\Scripts\pipenv run pytest -n auto -v tests --tap-stream > report.tap
rem imdisk -a -s 964515b -m R: -p "/FS:NTFS /Y"
virtualenv R:\.venv
R:\.venv\Scripts\pip install -e . --upgrade --upgrade-strategy=only-if-needed
R:\.venv\Scripts\pipenv install --dev
git submodule sync && git submodule update --init --recursive
SET RAM_DISK=R: && R:\.venv\Scripts\pipenv run pytest -n auto -v tests --tap-stream > report.tap
+3
View File
@@ -55,6 +55,9 @@ PIPENV_PYTHON=2.7 python3 -m pipenv --venv && pipenv --rm && pipenv install --de
PIPENV_PYTHON=3.7 python3 -m pipenv --venv && pipenv --rm && pipenv install --dev
PIPENV_PYTHON=2.7 python3 -m pipenv run pip install --upgrade -e .
PIPENV_PYTHON=3.7 python3 -m pipenv run pip install --upgrade -e .
echo "$ git submodule sync && git submodule update --init --recursive"
git submodule sync && git submodule update --init --recursive
echo "$ pipenv run time pytest -v -n auto tests -m \"$TEST_SUITE\""
# PIPENV_PYTHON=2.7 pipenv run time pytest -v -n auto tests -m "$TEST_SUITE" | prefix 2.7 &
View File
+42 -2
View File
@@ -11,6 +11,7 @@ from pipenv.utils import temp_environ
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
@@ -124,6 +125,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):
@@ -134,7 +173,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)
@@ -143,7 +182,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
@@ -159,6 +198,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')
+14
View File
@@ -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"]