# Licensed under a 3-clause BSD style license - see LICENSE.rst """Checks for optional dependencies using lazy import from `PEP 562 `_. """ import importlib import warnings # First, the top-level packages: # TODO: This list is a duplicate of the dependencies in setup.cfg "all", but # some of the package names are different from the pip-install name (e.g., # beautifulsoup4 -> bs4). _optional_deps = ['asdf', 'bleach', 'bottleneck', 'bs4', 'bz2', 'h5py', 'html5lib', 'IPython', 'jplephem', 'lxml', 'matplotlib', 'mpmath', 'pandas', 'PIL', 'pytz', 'scipy', 'skyfield', 'sortedcontainers', 'lzma', 'pyarrow'] _formerly_optional_deps = ['yaml'] # for backward compatibility _deps = {k.upper(): k for k in _optional_deps + _formerly_optional_deps} # Any subpackages that have different import behavior: _deps['PLT'] = 'matplotlib.pyplot' __all__ = [f"HAS_{pkg}" for pkg in _deps] def __getattr__(name): if name in __all__: module_name = name[4:] if module_name == "YAML": warnings.warn( "PyYaml is now a strict dependency. HAS_YAML is deprecated as " "of v5.0 and will be removed in a subsequent version.", category=AstropyDeprecationWarning) try: importlib.import_module(_deps[module_name]) except (ImportError, ModuleNotFoundError): return False return True raise AttributeError(f"Module {__name__!r} has no attribute {name!r}.")