diff --git a/news/3026.bugfix b/news/3026.bugfix new file mode 100644 index 0000000000..6a194d1f1f --- /dev/null +++ b/news/3026.bugfix @@ -0,0 +1 @@ +Fixed unnecessary extras are added when translating markers diff --git a/pipenv/utils.py b/pipenv/utils.py index b9345afa49..b965e46d3b 100644 --- a/pipenv/utils.py +++ b/pipenv/utils.py @@ -1182,7 +1182,9 @@ def translate_markers(pipfile_entry): new_pipfile = dict(pipfile_entry).copy() marker_set = set() if "markers" in new_pipfile: - marker_set.add(str(Marker(new_pipfile.get("markers")))) + marker = str(Marker(new_pipfile.pop("markers"))) + if 'extra' not in marker: + marker_set.add(marker) for m in pipfile_markers: entry = "{0}".format(pipfile_entry[m]) if m != "markers": diff --git a/tests/integration/test_lock.py b/tests/integration/test_lock.py index ac29647673..1f1719d00a 100644 --- a/tests/integration/test_lock.py +++ b/tests/integration/test_lock.py @@ -167,6 +167,28 @@ def test_complex_deps_lock_and_install_properly(PipenvInstance, pip_src_dir, pyp assert c.return_code == 0 +@pytest.mark.extras +@pytest.mark.lock +def test_lock_extras_without_install(PipenvInstance, pypi): + with PipenvInstance(pypi=pypi) as p: + with open(p.pipfile_path, 'w') as f: + contents = """ +[packages] +requests = {version = "*", extras = ["socks"]} + """.strip() + f.write(contents) + + c = p.pipenv('lock') + assert c.return_code == 0 + assert "requests" in p.lockfile["default"] + assert "pysocks" in p.lockfile["default"] + assert "markers" not in p.lockfile["default"]['pysocks'] + + c = p.pipenv('lock -r') + assert c.return_code == 0 + assert "extra == 'socks'" not in c.out.strip() + + @pytest.mark.extras @pytest.mark.lock @pytest.mark.complex