Skip to content

Commit 95d6dbd

Browse files
committed
build: automatically create pinned extra from lock file
1 parent ec11430 commit 95d6dbd

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

src/poetry/console/commands/build.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
from typing import ClassVar
66

77
from cleo.helpers import option
8+
from poetry.core.packages.dependency_group import MAIN_GROUP
9+
from poetry.core.version.markers import MultiMarker
10+
from poetry.core.version.markers import parse_marker
811

912
from poetry.console.commands.env_command import EnvCommand
1013
from poetry.utils.env import build_environment
@@ -68,8 +71,30 @@ def _build(
6871
local=local_version_label
6972
)
7073

71-
for builder in builders:
72-
builder(self.poetry, executable=executable).build(target_dir)
74+
if not self.poetry.locker.is_locked_groups_and_markers():
75+
raise RuntimeError("lock file version too old")
76+
for package, info in self.poetry.locker.locked_packages().items():
77+
if MAIN_GROUP not in info.groups:
78+
continue
79+
package.optional = True
80+
dependency = package.to_dependency()
81+
# We could just intersect 'extra == "pinned"' with the marker.
82+
# However, since this extra is not part of the marker, we can avoid
83+
# some work by building the MultiMarker manually. Besides,
84+
# we can ensure that the extra is the first part of the marker.
85+
extra_marker = parse_marker('extra == "pinned"')
86+
locked_marker = info.get_marker({MAIN_GROUP})
87+
if locked_marker.is_any():
88+
dependency.marker = extra_marker
89+
else:
90+
# We explicitly do not MultiMarker.of() here
91+
# because it is not necessary.
92+
dependency.marker = MultiMarker(extra_marker, locked_marker)
93+
self.poetry.package.add_dependency(dependency)
94+
for builder_class in builders:
95+
builder = builder_class(self.poetry, executable=executable)
96+
builder._meta.provides_extra.append("pinned")
97+
builder.build(target_dir)
7398

7499
def handle(self) -> int:
75100
if not self.poetry.is_package_mode:

0 commit comments

Comments
 (0)