Skip to content

Commit e211b52

Browse files
committed
Fix locked information for path, url and VCS dependencies
1 parent 67c1b34 commit e211b52

File tree

4 files changed

+96
-9
lines changed

4 files changed

+96
-9
lines changed

poetry/packages/locker.py

+24-3
Original file line numberDiff line numberDiff line change
@@ -498,13 +498,31 @@ def _lock_packages(
498498
return locked
499499

500500
def _dump_package(self, package): # type: (Package) -> dict
501-
dependencies = {}
501+
dependencies = OrderedDict()
502502
for dependency in sorted(package.requires, key=lambda d: d.name):
503503
if dependency.pretty_name not in dependencies:
504504
dependencies[dependency.pretty_name] = []
505505

506506
constraint = inline_table()
507-
constraint["version"] = str(dependency.pretty_constraint)
507+
508+
if dependency.is_directory() or dependency.is_file():
509+
constraint["path"] = dependency.path.as_posix()
510+
511+
if dependency.is_directory() and dependency.develop:
512+
constraint["develop"] = True
513+
elif dependency.is_url():
514+
constraint["url"] = dependency.url
515+
elif dependency.is_vcs():
516+
constraint[dependency.vcs] = dependency.source
517+
518+
if dependency.branch:
519+
constraint["branch"] = dependency.branch
520+
elif dependency.tag:
521+
constraint["tag"] = dependency.tag
522+
elif dependency.rev:
523+
constraint["rev"] = dependency.rev
524+
else:
525+
constraint["version"] = str(dependency.pretty_constraint)
508526

509527
if dependency.extras:
510528
constraint["extras"] = sorted(dependency.extras)
@@ -520,7 +538,10 @@ def _dump_package(self, package): # type: (Package) -> dict
520538
# All the constraints should have the same type,
521539
# but we want to simplify them if it's possible
522540
for dependency, constraints in tuple(dependencies.items()):
523-
if all(len(constraint) == 1 for constraint in constraints):
541+
if all(
542+
len(constraint) == 1 and "version" in constraint
543+
for constraint in constraints
544+
):
524545
dependencies[dependency] = [
525546
constraint["version"] for constraint in constraints
526547
]

tests/installation/fixtures/with-directory-dependency-poetry-transitive.test

+4-4
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ python-versions = "*"
6565
version = "1.2.3"
6666

6767
[package.dependencies]
68-
project-with-extras = "1.2.3"
69-
project-with-transitive-file-dependencies = "1.2.3"
68+
project-with-extras = { "path" = "../../project_with_extras" }
69+
project-with-transitive-file-dependencies = { "path" = "../project_with_transitive_file_dependencies" }
7070

7171
[package.source]
7272
type = "directory"
@@ -82,8 +82,8 @@ python-versions = "*"
8282
version = "1.2.3"
8383

8484
[package.dependencies]
85-
demo = "0.1.0"
86-
inner-directory-project = "1.2.4"
85+
demo = { "path" = "../../distributions/demo-0.1.0-py2.py3-none-any.whl" }
86+
inner-directory-project = { "path" = "inner-directory-project" }
8787

8888
[package.source]
8989
type = "directory"

tests/installation/fixtures/with-file-dependency-transitive.test

+2-2
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ python-versions = "*"
4848
version = "1.2.3"
4949

5050
[package.dependencies]
51-
demo = "0.1.0"
52-
inner-directory-project = "1.2.4"
51+
demo = { "path" = "../../distributions/demo-0.1.0-py2.py3-none-any.whl" }
52+
inner-directory-project = { "path" = "inner-directory-project" }
5353

5454
[package.source]
5555
type = "directory"

tests/packages/test_locker.py

+66
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from poetry.core.semver.version import Version
1010
from poetry.factory import Factory
1111
from poetry.packages.locker import Locker
12+
from poetry.utils._compat import Path
1213

1314
from ..helpers import get_dependency
1415
from ..helpers import get_package
@@ -529,3 +530,68 @@ def test_locker_should_neither_emit_warnings_nor_raise_error_for_lower_compatibl
529530
_ = locker.lock_data
530531

531532
assert 0 == len(caplog.records)
533+
534+
535+
def test_locker_dumps_dependency_information_correctly(locker, root):
536+
root_dir = Path(__file__).parent.parent.joinpath("fixtures")
537+
package_a = get_package("A", "1.0.0")
538+
package_a.add_dependency(
539+
Factory.create_dependency(
540+
"B", {"path": "project_with_extras", "develop": True}, root_dir=root_dir
541+
)
542+
)
543+
package_a.add_dependency(
544+
Factory.create_dependency(
545+
"C",
546+
{"path": "directory/project_with_transitive_directory_dependencies"},
547+
root_dir=root_dir,
548+
)
549+
)
550+
package_a.add_dependency(
551+
Factory.create_dependency(
552+
"D", {"path": "distributions/demo-0.1.0.tar.gz"}, root_dir=root_dir
553+
)
554+
)
555+
package_a.add_dependency(
556+
Factory.create_dependency(
557+
"E", {"url": "https://python-poetry.org/poetry-1.2.0.tar.gz"}
558+
)
559+
)
560+
package_a.add_dependency(
561+
Factory.create_dependency(
562+
"F", {"git": "https://github.com/python-poetry/poetry.git", "branch": "foo"}
563+
)
564+
)
565+
566+
packages = [package_a]
567+
568+
locker.set_lock_data(root, packages)
569+
570+
with locker.lock.open(encoding="utf-8") as f:
571+
content = f.read()
572+
573+
expected = """[[package]]
574+
name = "A"
575+
version = "1.0.0"
576+
description = ""
577+
category = "main"
578+
optional = false
579+
python-versions = "*"
580+
581+
[package.dependencies]
582+
B = {path = "project_with_extras", develop = true}
583+
C = {path = "directory/project_with_transitive_directory_dependencies"}
584+
D = {path = "distributions/demo-0.1.0.tar.gz"}
585+
E = {url = "https://python-poetry.org/poetry-1.2.0.tar.gz"}
586+
F = {git = "https://github.com/python-poetry/poetry.git", branch = "foo"}
587+
588+
[metadata]
589+
lock-version = "1.1"
590+
python-versions = "*"
591+
content-hash = "115cf985d932e9bf5f540555bbdd75decbb62cac81e399375fc19f6277f8c1d8"
592+
593+
[metadata.files]
594+
A = []
595+
"""
596+
597+
assert expected == content

0 commit comments

Comments
 (0)