11import  distutils .version 
22import  importlib 
3+ import  sys 
34import  types 
5+ from  typing  import  Optional 
46import  warnings 
57
68# Update install.rst when updating versions! 
@@ -58,7 +60,11 @@ def _get_version(module: types.ModuleType) -> str:
5860
5961
6062def  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 ,
6268):
6369    """ 
6470    Import an optional dependency. 
@@ -70,8 +76,7 @@ def import_optional_dependency(
7076    Parameters 
7177    ---------- 
7278    name : str 
73-         The module name. This should be top-level only, so that the 
74-         version may be checked. 
79+         The module name. 
7580    extra : str 
7681        Additional text to include in the ImportError message. 
7782    raise_on_missing : bool, default True 
@@ -85,7 +90,9 @@ def import_optional_dependency(
8590        * ignore: Return the module, even if the version is too old. 
8691          It's expected that users validate the version locally when 
8792          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. 
8996    Returns 
9097    ------- 
9198    maybe_module : Optional[ModuleType] 
@@ -110,13 +117,20 @@ def import_optional_dependency(
110117        else :
111118            return  None 
112119
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 )
114128    if  minimum_version :
115-         version  =  _get_version (module )
129+         version  =  _get_version (module_to_get )
116130        if  distutils .version .LooseVersion (version ) <  minimum_version :
117131            assert  on_version  in  {"warn" , "raise" , "ignore" }
118132            msg  =  (
119-                 f"Pandas requires version '{ minimum_version } { name }  
133+                 f"Pandas requires version '{ minimum_version } { parent }  
120134                f"(version '{ version }  
121135            )
122136            if  on_version  ==  "warn" :
0 commit comments