@@ -194,27 +194,15 @@ def myfunc():
194
194
if not have_module :
195
195
not_found_message = f"No module named '{ fullname } '"
196
196
elif require is not None :
197
- import packaging .requirements
198
-
199
- try :
200
- import importlib_metadata
201
- except ImportError :
202
- import importlib .metadata as importlib_metadata
203
-
204
- req = packaging .requirements .Requirement (require )
205
197
try :
206
- have_module = req .specifier .contains (
207
- importlib_metadata .version (req .name ),
208
- prereleases = True ,
209
- )
210
- except importlib_metadata .PackageNotFoundError as e :
198
+ have_module = _check_requirement (require )
199
+ except ModuleNotFoundError as e :
211
200
raise ValueError (
212
201
f"Found module '{ fullname } ' but cannot test requirement '{ require } '. "
213
202
"Requirements must match distribution name, not module name."
214
203
) from e
215
204
216
- if not have_module :
217
- not_found_message = f"No distribution can be found matching '{ require } '"
205
+ not_found_message = f"No distribution can be found matching '{ require } '"
218
206
219
207
if not have_module :
220
208
if error_on_import :
@@ -247,6 +235,37 @@ def myfunc():
247
235
return module
248
236
249
237
238
+ def _check_requirement (require : str ) -> bool :
239
+ """Verify that a package requirement is satisfied
240
+
241
+ If the package is required, a ``ModuleNotFoundError`` is raised
242
+ by ``importlib.metadata``.
243
+
244
+ Parameters
245
+ ----------
246
+ require : str
247
+ A dependency requirement as defined in PEP-508
248
+
249
+ Returns
250
+ -------
251
+ satisfied : bool
252
+ True if the installed version of the dependency matches
253
+ the specified version, False otherwise.
254
+ """
255
+ import packaging .requirements
256
+
257
+ try :
258
+ import importlib .metadata as importlib_metadata
259
+ except ImportError : # PY37
260
+ import importlib_metadata
261
+
262
+ req = packaging .requirements .Requirement (require )
263
+ return req .specifier .contains (
264
+ importlib_metadata .version (req .name ),
265
+ prereleases = True ,
266
+ )
267
+
268
+
250
269
def have_module (module_like : types .ModuleType ) -> bool :
251
270
return not isinstance (module_like , DelayedImportErrorModule )
252
271
0 commit comments