|
1 | 1 | import urllib.parse |
2 | 2 |
|
3 | | -from collections import defaultdict |
| 3 | +from copy import deepcopy |
4 | 4 | from typing import TYPE_CHECKING |
5 | | -from typing import Dict |
6 | | -from typing import List |
7 | 5 | from typing import Optional |
8 | 6 | from typing import Sequence |
9 | 7 | from typing import Union |
|
17 | 15 | from pathlib import Path |
18 | 16 |
|
19 | 17 | from cleo.io.io import IO |
20 | | - from poetry.core.packages.dependency_package import DependencyPackage |
21 | | - from poetry.core.packages.package import Package |
22 | 18 |
|
23 | 19 | from poetry.poetry import Poetry |
24 | 20 |
|
@@ -74,25 +70,37 @@ def _export_requirements_txt( |
74 | 70 | content = "" |
75 | 71 | dependency_lines = set() |
76 | 72 |
|
77 | | - # Group by package. |
78 | | - dependency_packages: Dict["Package", List["DependencyPackage"]] = defaultdict( |
79 | | - list |
| 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 |
80 | 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 | + |
81 | 96 | for dependency_package in self._poetry.locker.get_project_dependency_packages( |
82 | | - project_requires=self._poetry.package.all_requires, |
| 97 | + project_requires=project_requires, |
83 | 98 | dev=dev, |
84 | 99 | extras=extras, |
85 | 100 | ): |
86 | | - dependency_packages[dependency_package.package].append(dependency_package) |
87 | | - |
88 | | - for package, groups in dependency_packages.items(): |
89 | 101 | line = "" |
90 | | - dependency_packages = list(groups) |
91 | | - dependency = dependency_packages[0].dependency |
92 | | - marker = dependency.marker |
93 | | - for dep_package in dependency_packages[1:]: |
94 | | - marker = marker.union(dep_package.dependency.marker) |
95 | | - dependency.marker = marker |
| 102 | + dependency = dependency_package.dependency |
| 103 | + package = dependency_package.package |
96 | 104 |
|
97 | 105 | if package.develop: |
98 | 106 | line += "-e " |
|
0 commit comments