1
1
import distutils .version
2
2
import importlib
3
+ import sys
3
4
import types
5
+ from typing import Optional
4
6
import warnings
5
7
6
8
# Update install.rst when updating versions!
@@ -58,7 +60,11 @@ def _get_version(module: types.ModuleType) -> str:
58
60
59
61
60
62
def import_optional_dependency (
61
- name : str , extra : str = "" , raise_on_missing : bool = True , on_version : str = "raise"
63
+ name : str ,
64
+ extra : str = "" ,
65
+ raise_on_missing : bool = True ,
66
+ on_version : str = "raise" ,
67
+ min_version : Optional [str ] = None ,
62
68
):
63
69
"""
64
70
Import an optional dependency.
@@ -70,8 +76,7 @@ def import_optional_dependency(
70
76
Parameters
71
77
----------
72
78
name : str
73
- The module name. This should be top-level only, so that the
74
- version may be checked.
79
+ The module name.
75
80
extra : str
76
81
Additional text to include in the ImportError message.
77
82
raise_on_missing : bool, default True
@@ -85,7 +90,9 @@ def import_optional_dependency(
85
90
* ignore: Return the module, even if the version is too old.
86
91
It's expected that users validate the version locally when
87
92
using ``on_version="ignore"`` (see. ``io/html.py``)
88
-
93
+ min_version : str, default None
94
+ Specify a minimum version that is different from the global pandas
95
+ minimum version required.
89
96
Returns
90
97
-------
91
98
maybe_module : Optional[ModuleType]
@@ -110,13 +117,20 @@ def import_optional_dependency(
110
117
else :
111
118
return None
112
119
113
- minimum_version = VERSIONS .get (name )
120
+ # Handle submodules: if we have submodule, grab parent module from sys.modules
121
+ parent = name .split ("." )[0 ]
122
+ if parent != name :
123
+ install_name = parent
124
+ module_to_get = sys .modules [install_name ]
125
+ else :
126
+ module_to_get = module
127
+ minimum_version = min_version if min_version is not None else VERSIONS .get (parent )
114
128
if minimum_version :
115
- version = _get_version (module )
129
+ version = _get_version (module_to_get )
116
130
if distutils .version .LooseVersion (version ) < minimum_version :
117
131
assert on_version in {"warn" , "raise" , "ignore" }
118
132
msg = (
119
- f"Pandas requires version '{ minimum_version } ' or newer of '{ name } ' "
133
+ f"Pandas requires version '{ minimum_version } ' or newer of '{ parent } ' "
120
134
f"(version '{ version } ' currently installed)."
121
135
)
122
136
if on_version == "warn" :
0 commit comments