Skip to content

Commit

Permalink
make use of locked markers in lock file version 2.1 and thereby avoid…
Browse files Browse the repository at this point in the history
… `dependency walk failed`
  • Loading branch information
radoering committed Jan 5, 2025
1 parent 9a16a0a commit 98ddb57
Show file tree
Hide file tree
Showing 7 changed files with 1,850 additions and 1,519 deletions.
2 changes: 1 addition & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ include = [

[tool.poetry.dependencies]
python = "^3.9"
poetry = ">=1.8.0,<3.0.0"
poetry = ">=2.0.0,<3.0.0"
poetry-core = ">=1.7.0,<3.0.0"

[tool.poetry.group.dev.dependencies]
Expand Down
5 changes: 0 additions & 5 deletions src/poetry_plugin_export/command.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,6 @@ class ExportCommand(GroupCommand):
option("with-credentials", None, "Include credentials for extra indices."),
]

@property
def non_optional_groups(self) -> set[str]:
# method only required for poetry <= 1.2.0-beta.2.dev0
return {MAIN_GROUP}

@property
def default_groups(self) -> set[str]:
return {MAIN_GROUP}
Expand Down
31 changes: 20 additions & 11 deletions src/poetry_plugin_export/exporter.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from poetry.repositories.http_repository import HTTPRepository

from poetry_plugin_export.walker import get_project_dependency_packages
from poetry_plugin_export.walker import get_project_dependency_packages2


if TYPE_CHECKING:
Expand Down Expand Up @@ -91,23 +92,31 @@ def _export_generic_txt(
content = ""
dependency_lines = set()

root = self._poetry.package.with_dependency_groups(
list(self._groups), only=True
)

python_marker = parse_marker(
create_nested_marker(
"python_version", self._poetry.package.python_constraint
)
)
if self._poetry.locker.is_locked_groups_and_markers():
dependency_package_iterator = get_project_dependency_packages2(
self._poetry.locker,
project_python_marker=python_marker,
groups=set(self._groups),
extras=self._extras,
)
else:
root = self._poetry.package.with_dependency_groups(
list(self._groups), only=True
)
dependency_package_iterator = get_project_dependency_packages(
self._poetry.locker,
project_requires=root.all_requires,
root_package_name=root.name,
project_python_marker=python_marker,
extras=self._extras,
)

for dependency_package in get_project_dependency_packages(
self._poetry.locker,
project_requires=root.all_requires,
root_package_name=root.name,
project_python_marker=python_marker,
extras=self._extras,
):
for dependency_package in dependency_package_iterator:
line = ""

if not with_extras:
Expand Down
22 changes: 22 additions & 0 deletions src/poetry_plugin_export/walker.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,5 +264,27 @@ def get_locked_package(
return next(iter(compatible_candidates), None)


def get_project_dependency_packages2(
locker: Locker,
project_python_marker: BaseMarker | None = None,
groups: Collection[str] = (),
extras: Collection[NormalizedName] = (),
) -> Iterator[DependencyPackage]:
for package, info in locker.locked_packages().items():
if not info.groups.intersection(groups):
continue

marker = info.get_marker(groups)
if not marker.validate({"extra": extras}):
continue

if project_python_marker:
marker = project_python_marker.intersect(marker)

package.marker = marker

yield DependencyPackage(dependency=package.to_dependency(), package=package)


class DependencyWalkerError(Exception):
pass
9 changes: 1 addition & 8 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,14 +166,7 @@ def _factory(

poetry = Factory().create_poetry(project_dir)

try:
locker = TestLocker(poetry.locker.lock, poetry.locker._pyproject_data)
except AttributeError:
# poetry < 2.0
locker = TestLocker(
poetry.locker.lock,
poetry.locker._local_config, # type: ignore[attr-defined]
)
locker = TestLocker(poetry.locker.lock, poetry.locker._pyproject_data)
locker.write()

poetry.set_locker(locker)
Expand Down
Loading

0 comments on commit 98ddb57

Please sign in to comment.