Commit 18abfd7b by Arun Babu Neelicattu Committed by finswimmer

locker: unify duplicate dependencies on export

(cherry picked from commit 733736cd1c2ea6189a77e34ab640059dbff2be23)
parent a46b5c2f
import itertools
import json
import logging
import os
......@@ -6,6 +5,7 @@ import re
from copy import deepcopy
from hashlib import sha256
from typing import Iterable
from typing import Iterator
from typing import List
from typing import Optional
......@@ -188,7 +188,7 @@ class Locker(object):
@classmethod
def get_project_dependencies(
cls, project_requires, locked_packages, pinned_versions=False, with_nested=False
): # type: (List[Dependency], List[Package], bool, bool) -> List[Dependency]
): # type: (List[Dependency], List[Package], bool, bool) -> Iterable[Dependency]
# group packages entries by name, this is required because requirement might use
# different constraints
packages_by_name = {}
......@@ -296,11 +296,18 @@ class Locker(object):
__walk_level(dependencies, 0)
return sorted(
itertools.chain(dependencies, nested_dependencies.values()),
key=lambda x: x.name.lower(),
# Merge same dependencies using marker union
for requirement in dependencies:
key = (requirement.name, requirement.pretty_constraint)
if key not in nested_dependencies:
nested_dependencies[key] = requirement
else:
nested_dependencies[key].marker = nested_dependencies[key].marker.union(
requirement.marker
)
return sorted(nested_dependencies.values(), key=lambda x: x.name.lower())
def get_project_dependency_packages(
self, project_requires, dev=False, extras=None
): # type: (List[Dependency], bool, Optional[Union[bool, Sequence[str]]]) -> Iterator[DependencyPackage]
......
......@@ -256,8 +256,12 @@ def test_exporter_can_export_requirements_txt_with_nested_packages_and_markers(
assert expected == {}
@pytest.mark.parametrize(
"dev,lines",
[(False, ['a==1.2.3; python_version < "3.8"']), (True, ["a==1.2.3", "b==4.5.6"])],
)
def test_exporter_can_export_requirements_txt_with_nested_packages_and_markers_any(
tmp_dir, poetry
tmp_dir, poetry, dev, lines
):
poetry.locker.mock_lock_data(
{
......@@ -295,24 +299,16 @@ def test_exporter_can_export_requirements_txt_with_nested_packages_and_markers_a
Factory.create_dependency(
name="b", constraint=dict(version="^4.5.6"), category="dev"
),
Factory.create_dependency(name="a", constraint=dict(version="^1.2.3")),
]
exporter = Exporter(poetry)
exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=True)
exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt", dev=dev)
with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f:
content = f.read()
assert (
content
== """\
a==1.2.3
a==1.2.3; python_version < "3.8"
b==4.5.6
"""
)
assert content.strip() == "\n".join(lines)
def test_exporter_can_export_requirements_txt_with_standard_packages_and_hashes(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment