diff --git a/pipenv/cli/command.py b/pipenv/cli/command.py index 568544903d..c93bcf274a 100644 --- a/pipenv/cli/command.py +++ b/pipenv/cli/command.py @@ -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, diff --git a/pipenv/core.py b/pipenv/core.py index 843d0ecc06..5f3adadf57 100644 --- a/pipenv/core.py +++ b/pipenv/core.py @@ -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 diff --git a/pipenv/utils/dependencies.py b/pipenv/utils/dependencies.py index f45c0d1bdc..5b7c6e8345 100644 --- a/pipenv/utils/dependencies.py +++ b/pipenv/utils/dependencies.py @@ -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 @@ -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: @@ -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): diff --git a/pipenv/utils/resolver.py b/pipenv/utils/resolver.py index 82663b685c..129852af58 100644 --- a/pipenv/utils/resolver.py +++ b/pipenv/utils/resolver.py @@ -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...")) diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index b7477b6b82..b3e72ec4c5 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -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"), @@ -89,7 +87,25 @@ 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 @@ -97,8 +113,6 @@ def test_convert_deps_to_pip(deps, expected): @pytest.mark.parametrize( "deps, expected", [ - # This one should be collapsed and treated as {'requests': '*'}. - ({"requests": {}}, "requests"), # Hash value should be passed into the result. ( { @@ -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, [])),