From 8d1a4e46f5d5c8e1c10f2703f5669d21890a973e Mon Sep 17 00:00:00 2001 From: Larry Bradley Date: Thu, 8 Aug 2024 16:42:40 -0400 Subject: [PATCH] Refactor optional dependency constants --- regions/_utils/optional_deps.py | 34 ++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/regions/_utils/optional_deps.py b/regions/_utils/optional_deps.py index 22438364..d79c8a02 100644 --- a/regions/_utils/optional_deps.py +++ b/regions/_utils/optional_deps.py @@ -1,13 +1,25 @@ # Licensed under a 3-clause BSD style license - see LICENSE.rst +""" +Checks for optional dependencies using lazy import from `PEP 562 +`_. +""" -try: - import matplotlib - HAS_MATPLOTLIB = True - MPL_VERSION = getattr(matplotlib, '__version__', None) - if MPL_VERSION is None: - MPL_VERSION = matplotlib._version.version - MPL_VERSION = MPL_VERSION.split('.') - MPL_VERSION = 10 * int(MPL_VERSION[0]) + int(MPL_VERSION[1]) -except ImportError: - HAS_MATPLOTLIB = False - MPL_VERSION = 0 +import importlib + +# This list is a duplicate of the dependencies in pyproject.toml "all". +# Note that in some cases the package names are different from the +# pip-install name (e.g.k scikit-image -> skimage). +optional_deps = ['matplotlib', 'shapely'] +deps = {key.upper(): key for key in optional_deps} +__all__ = [f'HAS_{pkg}' for pkg in deps] + + +def __getattr__(name): + if name in __all__: + try: + importlib.import_module(deps[name[4:]]) + except ImportError: + return False + return True + + raise AttributeError(f'Module {__name__!r} has no attribute {name!r}.')