Skip to content

Commit db7edd9

Browse files
authored
make use of locked markers in lock file version 2.1 and thereby avoid dependency walk failed (#286)
1 parent 9a16a0a commit db7edd9

File tree

7 files changed

+1850
-1519
lines changed

7 files changed

+1850
-1519
lines changed

poetry.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ include = [
1818

1919
[tool.poetry.dependencies]
2020
python = "^3.9"
21-
poetry = ">=1.8.0,<3.0.0"
21+
poetry = ">=2.0.0,<3.0.0"
2222
poetry-core = ">=1.7.0,<3.0.0"
2323

2424
[tool.poetry.group.dev.dependencies]

src/poetry_plugin_export/command.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,6 @@ class ExportCommand(GroupCommand):
7777
option("with-credentials", None, "Include credentials for extra indices."),
7878
]
7979

80-
@property
81-
def non_optional_groups(self) -> set[str]:
82-
# method only required for poetry <= 1.2.0-beta.2.dev0
83-
return {MAIN_GROUP}
84-
8580
@property
8681
def default_groups(self) -> set[str]:
8782
return {MAIN_GROUP}

src/poetry_plugin_export/exporter.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from poetry.repositories.http_repository import HTTPRepository
1313

1414
from poetry_plugin_export.walker import get_project_dependency_packages
15+
from poetry_plugin_export.walker import get_project_dependency_packages2
1516

1617

1718
if TYPE_CHECKING:
@@ -91,23 +92,31 @@ def _export_generic_txt(
9192
content = ""
9293
dependency_lines = set()
9394

94-
root = self._poetry.package.with_dependency_groups(
95-
list(self._groups), only=True
96-
)
97-
9895
python_marker = parse_marker(
9996
create_nested_marker(
10097
"python_version", self._poetry.package.python_constraint
10198
)
10299
)
100+
if self._poetry.locker.is_locked_groups_and_markers():
101+
dependency_package_iterator = get_project_dependency_packages2(
102+
self._poetry.locker,
103+
project_python_marker=python_marker,
104+
groups=set(self._groups),
105+
extras=self._extras,
106+
)
107+
else:
108+
root = self._poetry.package.with_dependency_groups(
109+
list(self._groups), only=True
110+
)
111+
dependency_package_iterator = get_project_dependency_packages(
112+
self._poetry.locker,
113+
project_requires=root.all_requires,
114+
root_package_name=root.name,
115+
project_python_marker=python_marker,
116+
extras=self._extras,
117+
)
103118

104-
for dependency_package in get_project_dependency_packages(
105-
self._poetry.locker,
106-
project_requires=root.all_requires,
107-
root_package_name=root.name,
108-
project_python_marker=python_marker,
109-
extras=self._extras,
110-
):
119+
for dependency_package in dependency_package_iterator:
111120
line = ""
112121

113122
if not with_extras:

src/poetry_plugin_export/walker.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,5 +264,27 @@ def get_locked_package(
264264
return next(iter(compatible_candidates), None)
265265

266266

267+
def get_project_dependency_packages2(
268+
locker: Locker,
269+
project_python_marker: BaseMarker | None = None,
270+
groups: Collection[str] = (),
271+
extras: Collection[NormalizedName] = (),
272+
) -> Iterator[DependencyPackage]:
273+
for package, info in locker.locked_packages().items():
274+
if not info.groups.intersection(groups):
275+
continue
276+
277+
marker = info.get_marker(groups)
278+
if not marker.validate({"extra": extras}):
279+
continue
280+
281+
if project_python_marker:
282+
marker = project_python_marker.intersect(marker)
283+
284+
package.marker = marker
285+
286+
yield DependencyPackage(dependency=package.to_dependency(), package=package)
287+
288+
267289
class DependencyWalkerError(Exception):
268290
pass

tests/conftest.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,7 @@ def _factory(
166166

167167
poetry = Factory().create_poetry(project_dir)
168168

169-
try:
170-
locker = TestLocker(poetry.locker.lock, poetry.locker._pyproject_data)
171-
except AttributeError:
172-
# poetry < 2.0
173-
locker = TestLocker(
174-
poetry.locker.lock,
175-
poetry.locker._local_config, # type: ignore[attr-defined]
176-
)
169+
locker = TestLocker(poetry.locker.lock, poetry.locker._pyproject_data)
177170
locker.write()
178171

179172
poetry.set_locker(locker)

0 commit comments

Comments
 (0)