From e211b52c611004b437c6539167b9b5ccfce43c66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Eustace?= Date: Wed, 23 Jun 2021 01:25:32 +0200 Subject: [PATCH] Fix locked information for path, url and VCS dependencies --- poetry/packages/locker.py | 27 +++++++- ...irectory-dependency-poetry-transitive.test | 8 +-- .../with-file-dependency-transitive.test | 4 +- tests/packages/test_locker.py | 66 +++++++++++++++++++ 4 files changed, 96 insertions(+), 9 deletions(-) diff --git a/poetry/packages/locker.py b/poetry/packages/locker.py index 56a77d2dbe6..5a42b22ce98 100644 --- a/poetry/packages/locker.py +++ b/poetry/packages/locker.py @@ -498,13 +498,31 @@ def _lock_packages( return locked def _dump_package(self, package): # type: (Package) -> dict - dependencies = {} + dependencies = OrderedDict() for dependency in sorted(package.requires, key=lambda d: d.name): if dependency.pretty_name not in dependencies: dependencies[dependency.pretty_name] = [] constraint = inline_table() - constraint["version"] = str(dependency.pretty_constraint) + + if dependency.is_directory() or dependency.is_file(): + constraint["path"] = dependency.path.as_posix() + + if dependency.is_directory() and dependency.develop: + constraint["develop"] = True + elif dependency.is_url(): + constraint["url"] = dependency.url + elif dependency.is_vcs(): + constraint[dependency.vcs] = dependency.source + + if dependency.branch: + constraint["branch"] = dependency.branch + elif dependency.tag: + constraint["tag"] = dependency.tag + elif dependency.rev: + constraint["rev"] = dependency.rev + else: + constraint["version"] = str(dependency.pretty_constraint) if dependency.extras: constraint["extras"] = sorted(dependency.extras) @@ -520,7 +538,10 @@ def _dump_package(self, package): # type: (Package) -> dict # All the constraints should have the same type, # but we want to simplify them if it's possible for dependency, constraints in tuple(dependencies.items()): - if all(len(constraint) == 1 for constraint in constraints): + if all( + len(constraint) == 1 and "version" in constraint + for constraint in constraints + ): dependencies[dependency] = [ constraint["version"] for constraint in constraints ] diff --git a/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test b/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test index 7177191e2c8..fb10b1accea 100644 --- a/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test +++ b/tests/installation/fixtures/with-directory-dependency-poetry-transitive.test @@ -65,8 +65,8 @@ python-versions = "*" version = "1.2.3" [package.dependencies] -project-with-extras = "1.2.3" -project-with-transitive-file-dependencies = "1.2.3" +project-with-extras = { "path" = "../../project_with_extras" } +project-with-transitive-file-dependencies = { "path" = "../project_with_transitive_file_dependencies" } [package.source] type = "directory" @@ -82,8 +82,8 @@ python-versions = "*" version = "1.2.3" [package.dependencies] -demo = "0.1.0" -inner-directory-project = "1.2.4" +demo = { "path" = "../../distributions/demo-0.1.0-py2.py3-none-any.whl" } +inner-directory-project = { "path" = "inner-directory-project" } [package.source] type = "directory" diff --git a/tests/installation/fixtures/with-file-dependency-transitive.test b/tests/installation/fixtures/with-file-dependency-transitive.test index 6e5d92d711a..b882f262640 100644 --- a/tests/installation/fixtures/with-file-dependency-transitive.test +++ b/tests/installation/fixtures/with-file-dependency-transitive.test @@ -48,8 +48,8 @@ python-versions = "*" version = "1.2.3" [package.dependencies] -demo = "0.1.0" -inner-directory-project = "1.2.4" +demo = { "path" = "../../distributions/demo-0.1.0-py2.py3-none-any.whl" } +inner-directory-project = { "path" = "inner-directory-project" } [package.source] type = "directory" diff --git a/tests/packages/test_locker.py b/tests/packages/test_locker.py index 7fa89a44962..ecb8bcb870b 100644 --- a/tests/packages/test_locker.py +++ b/tests/packages/test_locker.py @@ -9,6 +9,7 @@ from poetry.core.semver.version import Version from poetry.factory import Factory from poetry.packages.locker import Locker +from poetry.utils._compat import Path from ..helpers import get_dependency from ..helpers import get_package @@ -529,3 +530,68 @@ def test_locker_should_neither_emit_warnings_nor_raise_error_for_lower_compatibl _ = locker.lock_data assert 0 == len(caplog.records) + + +def test_locker_dumps_dependency_information_correctly(locker, root): + root_dir = Path(__file__).parent.parent.joinpath("fixtures") + package_a = get_package("A", "1.0.0") + package_a.add_dependency( + Factory.create_dependency( + "B", {"path": "project_with_extras", "develop": True}, root_dir=root_dir + ) + ) + package_a.add_dependency( + Factory.create_dependency( + "C", + {"path": "directory/project_with_transitive_directory_dependencies"}, + root_dir=root_dir, + ) + ) + package_a.add_dependency( + Factory.create_dependency( + "D", {"path": "distributions/demo-0.1.0.tar.gz"}, root_dir=root_dir + ) + ) + package_a.add_dependency( + Factory.create_dependency( + "E", {"url": "https://python-poetry.org/poetry-1.2.0.tar.gz"} + ) + ) + package_a.add_dependency( + Factory.create_dependency( + "F", {"git": "https://github.com/python-poetry/poetry.git", "branch": "foo"} + ) + ) + + packages = [package_a] + + locker.set_lock_data(root, packages) + + with locker.lock.open(encoding="utf-8") as f: + content = f.read() + + expected = """[[package]] +name = "A" +version = "1.0.0" +description = "" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +B = {path = "project_with_extras", develop = true} +C = {path = "directory/project_with_transitive_directory_dependencies"} +D = {path = "distributions/demo-0.1.0.tar.gz"} +E = {url = "https://python-poetry.org/poetry-1.2.0.tar.gz"} +F = {git = "https://github.com/python-poetry/poetry.git", branch = "foo"} + +[metadata] +lock-version = "1.1" +python-versions = "*" +content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8" + +[metadata.files] +A = [] +""" + + assert expected == content