Commit 02307ba1 by Yury V. Zaytsev Committed by finswimmer

locker: reuse locked metadata for nested deps

Resolves: #3115
(cherry picked from commit 04967db7ab20558b593e6b47ef5258e95a1b642f)
parent 9f7c9f8b
...@@ -234,8 +234,15 @@ class Locker(object): ...@@ -234,8 +234,15 @@ class Locker(object):
# project level dependencies take precedence # project level dependencies take precedence
continue continue
# we make a copy to avoid any side-effects locked_package = __get_locked_package(requirement)
requirement = deepcopy(requirement) if locked_package:
# create dependency from locked package to retain dependency metadata
# if this is not done, we can end-up with incorrect nested dependencies
requirement = locked_package.to_dependency()
else:
# we make a copy to avoid any side-effects
requirement = deepcopy(requirement)
requirement._category = pkg.category requirement._category = pkg.category
if pinned_versions: if pinned_versions:
......
...@@ -59,13 +59,18 @@ def poetry(fixture_dir, locker): ...@@ -59,13 +59,18 @@ def poetry(fixture_dir, locker):
return p return p
def set_package_requires(poetry): def set_package_requires(poetry, skip=None):
skip = skip or set()
packages = poetry.locker.locked_repository(with_dev_reqs=True).packages packages = poetry.locker.locked_repository(with_dev_reqs=True).packages
poetry.package.requires = [ poetry.package.requires = [
pkg.to_dependency() for pkg in packages if pkg.category == "main" pkg.to_dependency()
for pkg in packages
if pkg.category == "main" and pkg.name not in skip
] ]
poetry.package.dev_requires = [ poetry.package.dev_requires = [
pkg.to_dependency() for pkg in packages if pkg.category == "dev" pkg.to_dependency()
for pkg in packages
if pkg.category == "dev" and pkg.name not in skip
] ]
...@@ -503,6 +508,55 @@ foo @ git+https://github.com/foo/foo.git@123456 ...@@ -503,6 +508,55 @@ foo @ git+https://github.com/foo/foo.git@123456
assert expected == content assert expected == content
def test_exporter_can_export_requirements_txt_with_nested_packages(tmp_dir, poetry):
poetry.locker.mock_lock_data(
{
"package": [
{
"name": "foo",
"version": "1.2.3",
"category": "main",
"optional": False,
"python-versions": "*",
"source": {
"type": "git",
"url": "https://github.com/foo/foo.git",
"reference": "123456",
},
},
{
"name": "bar",
"version": "4.5.6",
"category": "main",
"optional": False,
"python-versions": "*",
"dependencies": {"foo": "rev 123456"},
},
],
"metadata": {
"python-versions": "*",
"content-hash": "123456789",
"hashes": {"foo": [], "bar": []},
},
}
)
set_package_requires(poetry, skip={"foo"})
exporter = Exporter(poetry)
exporter.export("requirements.txt", Path(tmp_dir), "requirements.txt")
with (Path(tmp_dir) / "requirements.txt").open(encoding="utf-8") as f:
content = f.read()
expected = """\
bar==4.5.6
foo @ git+https://github.com/foo/foo.git@123456
"""
assert expected == content
def test_exporter_can_export_requirements_txt_with_git_packages_and_markers( def test_exporter_can_export_requirements_txt_with_git_packages_and_markers(
tmp_dir, poetry tmp_dir, poetry
): ):
......
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