Skip to content

Commit ebe7ada

Browse files
dimblebyabn
authored andcommitted
ignore installed packages during solving
1 parent aa73b3a commit ebe7ada

File tree

3 files changed

+14
-71
lines changed

3 files changed

+14
-71
lines changed

src/poetry/puzzle/provider.py

Lines changed: 9 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from poetry.packages.direct_origin import DirectOrigin
2828
from poetry.packages.package_collection import PackageCollection
2929
from poetry.puzzle.exceptions import OverrideNeededError
30-
from poetry.repositories.exceptions import PackageNotFoundError
3130
from poetry.utils.helpers import get_file_hash
3231

3332

@@ -115,7 +114,6 @@ def __init__(
115114
pool: RepositoryPool,
116115
io: IO,
117116
*,
118-
installed: list[Package] | None = None,
119117
locked: list[Package] | None = None,
120118
) -> None:
121119
self._package = package
@@ -129,7 +127,6 @@ def __init__(
129127
self._deferred_cache: dict[Dependency, Package] = {}
130128
self._load_deferred = True
131129
self._source_root: Path | None = None
132-
self._installed_packages = installed if installed is not None else []
133130
self._direct_origin_packages: dict[str, Package] = {}
134131
self._locked: dict[NormalizedName, list[DependencyPackage]] = defaultdict(list)
135132
self._use_latest: Collection[NormalizedName] = []
@@ -205,36 +202,6 @@ def validate_package_for_dependency(
205202
f" package's name: {package.name}"
206203
)
207204

208-
def search_for_installed_packages(
209-
self,
210-
dependency: Dependency,
211-
) -> list[Package]:
212-
"""
213-
Search for installed packages, when available, that satisfy the given
214-
dependency.
215-
216-
This is useful when dealing with packages that are under development, not
217-
published on package sources and/or only available via system installations.
218-
"""
219-
if not self._installed_packages:
220-
return []
221-
222-
logger.debug(
223-
"Falling back to installed packages to discover metadata for <c2>%s</>",
224-
dependency.complete_name,
225-
)
226-
packages = [
227-
package
228-
for package in self._installed_packages
229-
if package.satisfies(dependency, ignore_source_type=True)
230-
]
231-
logger.debug(
232-
"Found <c2>%d</> compatible packages for <c2>%s</>",
233-
len(packages),
234-
dependency.complete_name,
235-
)
236-
return packages
237-
238205
def search_for_direct_origin_dependency(self, dependency: Dependency) -> Package:
239206
package = self._deferred_cache.get(dependency)
240207
if package is not None:
@@ -308,9 +275,6 @@ def search_for(self, dependency: Dependency) -> list[DependencyPackage]:
308275
reverse=True,
309276
)
310277

311-
if not packages:
312-
packages = self.search_for_installed_packages(dependency)
313-
314278
return PackageCollection(dependency, packages)
315279

316280
def _search_for_vcs(self, dependency: VCSDependency) -> Package:
@@ -483,24 +447,15 @@ def complete_package(
483447
elif package.is_direct_origin():
484448
requires = package.requires
485449
else:
486-
try:
487-
dependency_package = DependencyPackage(
488-
dependency,
489-
self._pool.package(
490-
package.pretty_name,
491-
package.version,
492-
extras=list(dependency.extras),
493-
repository_name=dependency.source_name,
494-
),
495-
)
496-
except PackageNotFoundError as e:
497-
try:
498-
dependency_package = next(
499-
DependencyPackage(dependency, pkg)
500-
for pkg in self.search_for_installed_packages(dependency)
501-
)
502-
except StopIteration:
503-
raise e from e
450+
dependency_package = DependencyPackage(
451+
dependency,
452+
self._pool.package(
453+
package.pretty_name,
454+
package.version,
455+
extras=list(dependency.extras),
456+
repository_name=dependency.source_name,
457+
),
458+
)
504459

505460
package = dependency_package.package
506461
dependency = dependency_package.dependency

src/poetry/puzzle/solver.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ def __init__(
5656
self._locked_packages = locked
5757
self._io = io
5858

59-
self._provider = Provider(
60-
self._package, self._pool, self._io, installed=installed, locked=locked
61-
)
59+
self._provider = Provider(self._package, self._pool, self._io, locked=locked)
6260
self._overrides: list[dict[Package, dict[str, Dependency]]] = []
6361

6462
@property

tests/puzzle/test_solver.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ def test_install_non_existing_package_fail(
140140
solver.solve()
141141

142142

143-
def test_install_unpublished_package_does_not_fail(
143+
def test_install_unpublished_package_fails(
144144
package: ProjectPackage, repo: Repository, pool: RepositoryPool, io: NullIO
145145
) -> None:
146146
package.add_dependency(Factory.create_dependency("B", "1"))
@@ -151,20 +151,10 @@ def test_install_unpublished_package_does_not_fail(
151151

152152
repo.add_package(package_a)
153153

154+
# Even though B is installed, it is unpublished and cannot be used during solving.
154155
solver = Solver(package, pool, [package_b], [], io)
155-
transaction = solver.solve()
156-
157-
check_solver_result(
158-
transaction,
159-
[
160-
{"job": "install", "package": package_a},
161-
{
162-
"job": "install",
163-
"package": package_b,
164-
"skipped": True, # already installed
165-
},
166-
],
167-
)
156+
with pytest.raises(SolverProblemError):
157+
solver.solve()
168158

169159

170160
def test_solver_with_deps(

0 commit comments

Comments
 (0)