Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions xarray/namedarray/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ def module_available(module: str, minversion: str | None = None) -> bool:
if minversion is not None:
version = importlib.metadata.version(module)

if version is None:
return False

return Version(version) >= Version(minversion)

return True
Expand Down
25 changes: 24 additions & 1 deletion xarray/tests/test_namedarray.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
_ShapeType_co,
)
from xarray.namedarray.core import NamedArray, from_array
from xarray.namedarray.utils import fake_target_chunksize
from xarray.namedarray.utils import fake_target_chunksize, module_available
from xarray.tests import requires_cftime

if TYPE_CHECKING:
Expand Down Expand Up @@ -666,3 +666,26 @@ def test_fake_target_chunksize_cftime() -> None:

assert faked_chunksize == 73
assert dtype == np.float64


def test_module_available_version_none() -> None:
"""module_available should return False gracefully when metadata.version returns None."""
import importlib.metadata as _metadata

original_version = _metadata.version

def mock_version(name: str) -> str | None:
if name == "packaging":
return None
return original_version(name)

_metadata.version = mock_version
try:
assert module_available("packaging", minversion="1.0.0") is False
finally:
_metadata.version = original_version


def test_module_available_valid() -> None:
"""module_available should return True for an installed module with version check."""
assert module_available("packaging", minversion="0.0.1") is True
Loading