@@ -143,39 +143,44 @@ def version(self):
143
143
self ._version = self .dist .parsed_version
144
144
return self ._version
145
145
146
- def _get_abstract_distribution (self ):
146
+ def _prepare_abstract_distribution (self ):
147
147
# type: () -> AbstractDistribution
148
148
raise NotImplementedError ("Override in subclass" )
149
149
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
+
150
180
@property
151
181
def dist (self ):
152
182
# 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 ()
179
184
return self ._dist
180
185
181
186
def _get_requires_python_specifier (self ):
@@ -207,6 +212,7 @@ def get_dependencies(self):
207
212
208
213
def get_install_requirement (self ):
209
214
# type: () -> Optional[InstallRequirement]
215
+ self ._prepare ()
210
216
return self ._ireq
211
217
212
218
@@ -228,7 +234,7 @@ def __init__(
228
234
version = version ,
229
235
)
230
236
231
- def _get_abstract_distribution (self ):
237
+ def _prepare_abstract_distribution (self ):
232
238
# type: () -> AbstractDistribution
233
239
return self ._factory .preparer .prepare_linked_requirement (self ._ireq )
234
240
@@ -251,7 +257,7 @@ def __init__(
251
257
version = version ,
252
258
)
253
259
254
- def _get_abstract_distribution (self ):
260
+ def _prepare_abstract_distribution (self ):
255
261
# type: () -> AbstractDistribution
256
262
return self ._factory .preparer .prepare_editable_requirement (self ._ireq )
257
263
0 commit comments