Skip to content

Commit 6c97645

Browse files
authored
Merge pull request #8000 from uranusjr/new-resolver-normal-test-progress
New Resolver: Make sure candidates are prepared after resolution
2 parents 9360793 + 56e065f commit 6c97645

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

src/pip/_internal/resolution/resolvelib/candidates.py

+35-29
Original file line numberDiff line numberDiff line change
@@ -143,39 +143,44 @@ def version(self):
143143
self._version = self.dist.parsed_version
144144
return self._version
145145

146-
def _get_abstract_distribution(self):
146+
def _prepare_abstract_distribution(self):
147147
# type: () -> AbstractDistribution
148148
raise NotImplementedError("Override in subclass")
149149

150+
def _prepare(self):
151+
# type: () -> None
152+
if self._dist is not None:
153+
return
154+
155+
abstract_dist = self._prepare_abstract_distribution()
156+
self._dist = abstract_dist.get_pkg_resources_distribution()
157+
assert self._dist is not None, "Distribution already installed"
158+
159+
# TODO: Abort cleanly here, as the resolution has been
160+
# based on the wrong name/version until now, and
161+
# so is wrong.
162+
# TODO: (Longer term) Rather than abort, reject this candidate
163+
# and backtrack. This would need resolvelib support.
164+
# These should be "proper" errors, not just asserts, as they
165+
# can result from user errors like a requirement "foo @ URL"
166+
# when the project at URL has a name of "bar" in its metadata.
167+
assert (
168+
self._name is None or
169+
self._name == canonicalize_name(self._dist.project_name)
170+
), "Name mismatch: {!r} vs {!r}".format(
171+
self._name, canonicalize_name(self._dist.project_name),
172+
)
173+
assert (
174+
self._version is None or
175+
self._version == self._dist.parsed_version
176+
), "Version mismatch: {!r} vs {!r}".format(
177+
self._version, self._dist.parsed_version,
178+
)
179+
150180
@property
151181
def dist(self):
152182
# type: () -> Distribution
153-
if self._dist is None:
154-
abstract_dist = self._get_abstract_distribution()
155-
self._dist = abstract_dist.get_pkg_resources_distribution()
156-
# TODO: Only InstalledDistribution can return None here :-(
157-
assert self._dist is not None
158-
# TODO: Abort cleanly here, as the resolution has been
159-
# based on the wrong name/version until now, and
160-
# so is wrong.
161-
# TODO: (Longer term) Rather than abort, reject this candidate
162-
# and backtrack. This would need resolvelib support.
163-
# These should be "proper" errors, not just asserts, as they
164-
# can result from user errors like a requirement "foo @ URL"
165-
# when the project at URL has a name of "bar" in its metadata.
166-
assert (
167-
self._name is None or
168-
self._name == canonicalize_name(self._dist.project_name)
169-
), "Name mismatch: {!r} vs {!r}".format(
170-
self._name, canonicalize_name(self._dist.project_name),
171-
)
172-
assert (
173-
self._version is None or
174-
self._version == self._dist.parsed_version
175-
), "Version mismatch: {!r} vs {!r}".format(
176-
self._version, self._dist.parsed_version,
177-
)
178-
183+
self._prepare()
179184
return self._dist
180185

181186
def _get_requires_python_specifier(self):
@@ -207,6 +212,7 @@ def get_dependencies(self):
207212

208213
def get_install_requirement(self):
209214
# type: () -> Optional[InstallRequirement]
215+
self._prepare()
210216
return self._ireq
211217

212218

@@ -228,7 +234,7 @@ def __init__(
228234
version=version,
229235
)
230236

231-
def _get_abstract_distribution(self):
237+
def _prepare_abstract_distribution(self):
232238
# type: () -> AbstractDistribution
233239
return self._factory.preparer.prepare_linked_requirement(self._ireq)
234240

@@ -251,7 +257,7 @@ def __init__(
251257
version=version,
252258
)
253259

254-
def _get_abstract_distribution(self):
260+
def _prepare_abstract_distribution(self):
255261
# type: () -> AbstractDistribution
256262
return self._factory.preparer.prepare_editable_requirement(self._ireq)
257263

0 commit comments

Comments
 (0)