Source code for sbpy.utils.core
# Licensed under a 3-clause BSD style license - see LICENSE.rst
"""
sbpy utils module
created on March 12, 2019
"""
__all__ = ["required_packages", "optional_packages"]
from importlib import import_module
from warnings import warn
from ..exceptions import RequiredPackageUnavailable, OptionalPackageUnavailable
[docs]
def required_packages(*packages, message=None):
"""Verifies the arguments are valid packages.
Parameters
----------
*modules : str
The names of packages to test.
message : str
An additional message to show the user, e.g., the reason for the
requirement.
Raises
------
`~sbpy.exceptions.RequiredPackageUnavailable`
Examples
--------
>>> from sbpy.utils import required_packages
>>> required_packages("unavailable_package")
Traceback (most recent call last):
...
sbpy.exceptions.RequiredPackageUnavailable: `unavailable_package` is required.
"""
for package in packages:
try:
import_module(package)
except ModuleNotFoundError as exc:
_message = "" if message is None else " " + message
raise RequiredPackageUnavailable(
f"`{package}` is required.{_message}") from None
[docs]
def optional_packages(*packages, message=None):
"""Decorator that warns if the arguments are not valid packages.
Parameters
----------
*modules : str
The names of packages to test.
message : str
An additional note to show the user, e.g., a description of the fallback
behavior.
Returns
-------
success : bool
``True`` if all optional packages are available.
Warnings
--------
`~sbpy.exceptions.OptionalPackageUnavailable`
Examples
--------
>>> from sbpy.utils import optional_packages
>>> optional_packages("unavailable_package") # doctest: +SKIP
OptionalPackageUnavailable: Optional package `unavailable_package` is unavailable.
"""
# the doctest line is skipped to avoid polluting the testing suite with a warning
for package in packages:
try:
import_module(package)
except ModuleNotFoundError:
_message = "" if message is None else " " + message
warn(
f"`{package}`.{_message}",
OptionalPackageUnavailable,
)
return False
return True