11"""Routines to support optional packages"""
2+ from __future__ import annotations
3+
4+ import typing as ty
5+ from types import ModuleType
6+
27from packaging .version import Version
38
49from .tripwire import TripWire
510
611
7- def _check_pkg_version (pkg , min_version ) :
8- # Default version checking function
9- if isinstance ( min_version , str ):
10- min_version = Version ( min_version )
11- try :
12- return min_version <= Version ( pkg . __version__ )
13- except AttributeError :
12+ def _check_pkg_version (min_version : str | Version ) -> ty . Callable [[ ModuleType ], bool ] :
13+ min_ver = Version ( min_version ) if isinstance ( min_version , str ) else min_version
14+
15+ def check ( pkg : ModuleType ) -> bool :
16+ pkg_ver = getattr ( pkg , '__version__' , None )
17+ if isinstance ( pkg_ver , str ):
18+ return min_ver <= Version ( pkg_ver )
1419 return False
1520
21+ return check
22+
1623
17- def optional_package (name , trip_msg = None , min_version = None ):
24+ def optional_package (
25+ name : str ,
26+ trip_msg : str | None = None ,
27+ min_version : str | Version | ty .Callable [[ModuleType ], bool ] | None = None ,
28+ ) -> tuple [ModuleType | TripWire , bool , ty .Callable [[], None ]]:
1829 """Return package-like thing and module setup for package `name`
1930
2031 Parameters
@@ -81,7 +92,7 @@ def optional_package(name, trip_msg=None, min_version=None):
8192 elif min_version is None :
8293 check_version = lambda pkg : True
8394 else :
84- check_version = lambda pkg : _check_pkg_version (pkg , min_version )
95+ check_version = _check_pkg_version (min_version )
8596 # fromlist=[''] results in submodule being returned, rather than the top
8697 # level module. See help(__import__)
8798 fromlist = ['' ] if '.' in name else []
@@ -107,11 +118,11 @@ def optional_package(name, trip_msg=None, min_version=None):
107118 trip_msg = (
108119 f'We need package { name } for these functions, but ``import { name } `` raised { exc } '
109120 )
110- pkg = TripWire (trip_msg )
121+ trip = TripWire (trip_msg )
111122
112- def setup_module ():
123+ def setup_module () -> None :
113124 import unittest
114125
115126 raise unittest .SkipTest (f'No { name } for these tests' )
116127
117- return pkg , False , setup_module
128+ return trip , False , setup_module
0 commit comments