diff --git a/poetry/packages/locker.py b/poetry/packages/locker.py index d682f09df8f..6855c14c35a 100644 --- a/poetry/packages/locker.py +++ b/poetry/packages/locker.py @@ -177,20 +177,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: diff --git a/tests/packages/test_locker.py b/tests/packages/test_locker.py index 06ed8309440..8b8a1d99d46 100644 --- a/tests/packages/test_locker.py +++ b/tests/packages/test_locker.py @@ -348,7 +348,7 @@ def test_lock_file_should_not_have_mixed_types(locker, root): def test_reading_lock_file_should_raise_an_error_on_invalid_data(locker): - content = u"""[[package]] + content = """[[package]] name = "A" version = "1.0.0" description = "" @@ -598,3 +598,47 @@ def test_locker_dumps_dependency_information_correctly(locker, root): """ assert expected == content + + +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", autospec=True + ) + 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