Skip to content

Commit bc41ecf

Browse files
committed
Add module version compatibility check.
1 parent feef10b commit bc41ecf

1 file changed

Lines changed: 24 additions & 12 deletions

File tree

src/highdicom/utils.py

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
is_tiled_image,
1515
)
1616

17-
from importlib import import_module
17+
from importlib import import_module, metadata
18+
from packaging.requirements import Requirement
1819
from types import ModuleType
19-
from typing import Optional
2020

2121
# Several functions that were initially defined in this module were moved to
2222
# highdicom.spatial to consolidate similar functionality and prevent circular
@@ -275,21 +275,33 @@ def import_optional_dependency(
275275
ImportError
276276
When the specified module cannot be imported.
277277
"""
278+
for req_str in metadata.requires('highdicom'):
279+
req = Requirement(req_str)
280+
if req.name == module_name:
281+
break
278282

279-
#Update as new optional dependencies are supported
280-
versions = {}
283+
else:
284+
raise ValueError(
285+
f'`{module_name}` is not a requirement of highdicom'
286+
f' but is required for {feature}.'
287+
)
281288

282289
try:
283-
return import_module(name=module_name)
290+
module = import_module(name=module_name)
291+
installed_version = metadata.version(module_name)
284292

285-
except ImportError as error:
286-
module_version = (
287-
versions[module_name] if module_name in versions.keys() else 'Unknown'
288-
)
293+
if installed_version not in req.specifier:
294+
raise ImportError(
295+
f'Optional dependency `{module_name}` has an unsuitable'
296+
f' version. Found {installed_version}, but highdicom requires'
297+
f' {module_name}{req.specifier}.'
298+
)
289299

300+
return module
301+
302+
except ImportError as error:
290303
raise ImportError(
291304
f'Optional dependency `{module_name}` could not be imported'
292-
+ (f' but is required for {feature}.' if feature else '.')
293-
+ f' The minimum required version for `{module_name}` is {module_version}.'
294-
305+
f' but is required for {feature}.'
306+
f' highdicom requires {module_name}{req.specifier}.'
295307
) from error

0 commit comments

Comments
 (0)