1
1
"""Routines to support optional packages"""
2
+ from __future__ import annotations
3
+
4
+ import typing as ty
5
+ from types import ModuleType
6
+
2
7
from packaging .version import Version
3
8
4
9
from .tripwire import TripWire
5
10
6
11
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 )
14
19
return False
15
20
21
+ return check
22
+
16
23
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 ]]:
18
29
"""Return package-like thing and module setup for package `name`
19
30
20
31
Parameters
@@ -81,7 +92,7 @@ def optional_package(name, trip_msg=None, min_version=None):
81
92
elif min_version is None :
82
93
check_version = lambda pkg : True
83
94
else :
84
- check_version = lambda pkg : _check_pkg_version (pkg , min_version )
95
+ check_version = _check_pkg_version (min_version )
85
96
# fromlist=[''] results in submodule being returned, rather than the top
86
97
# level module. See help(__import__)
87
98
fromlist = ['' ] if '.' in name else []
@@ -107,11 +118,11 @@ def optional_package(name, trip_msg=None, min_version=None):
107
118
trip_msg = (
108
119
f'We need package { name } for these functions, but ``import { name } `` raised { exc } '
109
120
)
110
- pkg = TripWire (trip_msg )
121
+ trip = TripWire (trip_msg )
111
122
112
- def setup_module ():
123
+ def setup_module () -> None :
113
124
import unittest
114
125
115
126
raise unittest .SkipTest (f'No { name } for these tests' )
116
127
117
- return pkg , False , setup_module
128
+ return trip , False , setup_module
0 commit comments