Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion pipenv/cli/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -756,7 +756,6 @@ def requirements(state, dev=False, dev_only=False, hash=False, exclude_markers=F
pip_deps = convert_deps_to_pip(
deps,
project=None,
r=False,
include_index=False,
include_hashes=hash,
include_markers=not exclude_markers,
Expand Down
2 changes: 1 addition & 1 deletion pipenv/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -2048,7 +2048,7 @@ def do_install(
if not is_star(section[package__name]) and is_star(package__val):
# Support for VCS dependencies.
package_args[i] = convert_deps_to_pip(
{package__name: section[package__name]}, project=project, r=False
{package__name: section[package__name]}, project=project
)[0]
except KeyError:
pass
Expand Down
14 changes: 2 additions & 12 deletions pipenv/utils/dependencies.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import os
from contextlib import contextmanager
from tempfile import NamedTemporaryFile
from typing import Mapping, Sequence

from pipenv.patched.pip._vendor.packaging.markers import Marker
from pipenv.patched.pip._vendor.packaging.version import parse
from pipenv.vendor.requirementslib.models.requirements import Requirement

from .constants import SCHEME_LIST, VCS_LIST
from .shell import temp_path
Expand Down Expand Up @@ -245,14 +245,11 @@ def is_pinned_requirement(ireq):
def convert_deps_to_pip(
deps,
project=None,
r=True,
include_index=True,
include_hashes=True,
include_markers=True,
):
""" "Converts a Pipfile-formatted dependency to a pip-formatted one."""
from pipenv.vendor.requirementslib.models.requirements import Requirement

dependencies = []
for dep_name, dep in deps.items():
if project:
Expand All @@ -268,14 +265,7 @@ def convert_deps_to_pip(
include_markers=include_markers,
).strip()
dependencies.append(req)
if not r:
return dependencies

# Write requirements.txt to tmp directory.
f = NamedTemporaryFile(suffix="-requirements.txt", delete=False)
f.write("\n".join(dependencies).encode("utf-8"))
f.close()
return f.name
return dependencies


def get_constraints_from_deps(deps):
Expand Down
2 changes: 1 addition & 1 deletion pipenv/utils/resolver.py
Original file line number Diff line number Diff line change
Expand Up @@ -1027,7 +1027,7 @@ def venv_resolve_deps(
# dependency resolution on them, so we are including this step inside the
# spinner context manager for the UX improvement
sp.write(decode_for_output("Building requirements..."))
deps = convert_deps_to_pip(deps, project, r=False, include_index=True)
deps = convert_deps_to_pip(deps, project, include_index=True)
constraints = set(deps)
os.environ["PIPENV_PACKAGES"] = str("\n".join(constraints))
sp.write(decode_for_output("Resolving dependencies..."))
Expand Down
42 changes: 33 additions & 9 deletions tests/unit/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@

# Pipfile format <-> requirements.txt format.
DEP_PIP_PAIRS = [
({"requests": "*"}, "requests"),
({"requests": {"extras": ["socks"], "version": "*"}}, "requests[socks]"),
({"django": ">1.10"}, "django>1.10"),
({"Django": ">1.10"}, "Django>1.10"),
({"requests": {"extras": ["socks"], "version": ">1.10"}}, "requests[socks]>1.10"),
Expand Down Expand Up @@ -89,16 +87,32 @@ def mock_unpack(link, source_dir, download_dir, only_download=False, session=Non
def test_convert_deps_to_pip(deps, expected):
if expected.startswith("Django"):
expected = expected.lower()
assert dependencies.convert_deps_to_pip(deps, r=False) == [expected]
assert dependencies.convert_deps_to_pip(deps) == [expected]


@flaky
@pytest.mark.utils
@pytest.mark.needs_internet
def test_convert_deps_to_pip_flaky():
deps = {"requests": "*"}
expected = "requests"
assert dependencies.convert_deps_to_pip(deps) == [expected]


@flaky
@pytest.mark.utils
@pytest.mark.needs_internet
def test_convert_deps_to_pip_flaky2():
deps = {"requests": {"extras": ["socks"], "version": "*"}}
expected = "requests[socks]"
assert dependencies.convert_deps_to_pip(deps) == [expected]


@flaky
@pytest.mark.utils
@pytest.mark.parametrize(
"deps, expected",
[
# This one should be collapsed and treated as {'requests': '*'}.
({"requests": {}}, "requests"),
# Hash value should be passed into the result.
(
{
Expand Down Expand Up @@ -132,24 +146,34 @@ def test_convert_deps_to_pip(deps, expected):
],
)
def test_convert_deps_to_pip_one_way(deps, expected):
assert dependencies.convert_deps_to_pip(deps, r=False) == [expected.lower()]
assert dependencies.convert_deps_to_pip(deps) == [expected.lower()]


@flaky
@pytest.mark.utils
def test_convert_deps_to_pip_one_way_flaky():
deps = {"requests": dict()}
expected = "requests"
assert dependencies.convert_deps_to_pip(deps) == [expected.lower()]


@pytest.mark.utils
@pytest.mark.parametrize(
"deps, expected",
[
({"requests": {}}, ["requests"]),
({"FooProject": {"path": ".", "editable" : "true"}}, []),
({"FooProject": {"path": ".", "editable": "true"}}, []),
({"FooProject": {"version": "==1.2"}}, ["fooproject==1.2"]),
({"requests": {"extras": ["security"]}}, []),
({"requests": {"extras": []}}, ["requests"]),
({"extras" : {}}, ["extras"]),
({"uvicorn[standard]" : {}}, [])
({"extras": {}}, ["extras"]),
({"uvicorn[standard]": {}}, [])
],
)
def test_get_constraints_from_deps(deps, expected):
assert dependencies.get_constraints_from_deps(deps) == expected


@pytest.mark.parametrize("line,result", [
("-i https://example.com/simple/", ("https://example.com/simple/", None, None, [])),
("--extra-index-url=https://example.com/simple/", (None, "https://example.com/simple/", None, [])),
Expand Down