|
1 | | -import itertools |
2 | 1 | import urllib.parse |
3 | 2 |
|
| 3 | +from copy import deepcopy |
4 | 4 | from typing import TYPE_CHECKING |
5 | 5 | from typing import Optional |
6 | 6 | from typing import Sequence |
@@ -70,21 +70,37 @@ def _export_requirements_txt( |
70 | 70 | content = "" |
71 | 71 | dependency_lines = set() |
72 | 72 |
|
73 | | - for package, groups in itertools.groupby( |
74 | | - self._poetry.locker.get_project_dependency_packages( |
75 | | - project_requires=self._poetry.package.all_requires, |
76 | | - dev=dev, |
77 | | - extras=extras, |
78 | | - ), |
79 | | - lambda dependency_package: dependency_package.package, |
| 73 | + # If we have a root package then use that to tell us what the top-level |
| 74 | + # dependencies are. If we don't (older version of poetry.lock) then try to |
| 75 | + # cover all dependencies. |
| 76 | + repository = self._poetry.locker.locked_repository(with_dev_reqs=dev) |
| 77 | + root_package = repository.root_package |
| 78 | + project_requires = ( |
| 79 | + self._poetry.package.all_requires |
| 80 | + if root_package is None |
| 81 | + else root_package.requires |
| 82 | + ) |
| 83 | + |
| 84 | + # If we have a root package then we can also update the marker on each |
| 85 | + # dependency to take account of the project-level python version. |
| 86 | + if root_package is not None: |
| 87 | + restricted_project_requires = [] |
| 88 | + for project_require in project_requires: |
| 89 | + project_require = deepcopy(project_require) |
| 90 | + project_require.marker = project_require.marker.intersect( |
| 91 | + root_package.python_marker |
| 92 | + ) |
| 93 | + restricted_project_requires.append(project_require) |
| 94 | + project_requires = restricted_project_requires |
| 95 | + |
| 96 | + for dependency_package in self._poetry.locker.get_project_dependency_packages( |
| 97 | + project_requires=project_requires, |
| 98 | + dev=dev, |
| 99 | + extras=extras, |
80 | 100 | ): |
81 | 101 | line = "" |
82 | | - dependency_packages = list(groups) |
83 | | - dependency = dependency_packages[0].dependency |
84 | | - marker = dependency.marker |
85 | | - for dep_package in dependency_packages[1:]: |
86 | | - marker = marker.union(dep_package.dependency.marker) |
87 | | - dependency.marker = marker |
| 102 | + dependency = dependency_package.dependency |
| 103 | + package = dependency_package.package |
88 | 104 |
|
89 | 105 | if package.develop: |
90 | 106 | line += "-e " |
|
0 commit comments