Skip to content

Commit

Permalink
Merge pull request #4331 from python-poetry/1.1-fix-relative-paths-de…
Browse files Browse the repository at this point in the history
…pendencies-locking

[1.1] fix: create path dependencies relative to package rather than lockfile
  • Loading branch information
sdispater authored Jul 30, 2021
2 parents cdb58c6 + b48e4e7 commit 716ee92
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 6 deletions.
14 changes: 8 additions & 6 deletions poetry/packages/locker.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,20 +174,22 @@ def locked_repository(
package.marker = parse_marker(split_dep[1].strip())

for dep_name, constraint in info.get("dependencies", {}).items():

root_dir = self._lock.path.parent
if package.source_type == "directory":
# root dir should be the source of the package relative to the lock path
root_dir = Path(package.source_url)

if isinstance(constraint, list):
for c in constraint:
package.add_dependency(
Factory.create_dependency(
dep_name, c, root_dir=self._lock.path.parent
)
Factory.create_dependency(dep_name, c, root_dir=root_dir)
)

continue

package.add_dependency(
Factory.create_dependency(
dep_name, constraint, root_dir=self._lock.path.parent
)
Factory.create_dependency(dep_name, constraint, root_dir=root_dir)
)

if "develop" in info:
Expand Down
44 changes: 44 additions & 0 deletions tests/packages/test_locker.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import sys
import tempfile

import pytest
Expand Down Expand Up @@ -595,3 +596,46 @@ def test_locker_dumps_dependency_information_correctly(locker, root):
"""

assert expected == content


@pytest.mark.skipif(sys.version_info[:2] == (3, 5), reason="Skip for Python 3.5")
def test_locked_repository_uses_root_dir_of_package(locker, mocker):
content = """\
[[package]]
name = "lib-a"
version = "0.1.0"
description = ""
category = "main"
optional = false
python-versions = "^2.7.9"
develop = true
[package.dependencies]
lib-b = {path = "../libB", develop = true}
[package.source]
type = "directory"
url = "lib/libA"
[metadata]
lock-version = "1.1"
python-versions = "*"
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
[metadata.files]
lib-a = []
lib-b = []
"""

locker.lock.write(tomlkit.parse(content))
create_dependency_patch = mocker.patch("poetry.factory.Factory.create_dependency")
locker.locked_repository()

create_dependency_patch.assert_called_once_with(
"lib-b", {"develop": True, "path": "../libB"}, root_dir=mocker.ANY
)
call_kwargs = create_dependency_patch.call_args[1]
root_dir = call_kwargs["root_dir"]
assert root_dir.match("*/lib/libA")
# relative_to raises an exception if not relative - is_relative_to comes in py3.9
assert root_dir.relative_to(locker.lock.path.parent.resolve()) is not None

0 comments on commit 716ee92

Please sign in to comment.