"""Utility functions for printing version information.
The original script is from
`xarray <https://github.com/pydata/xarray/blob/master/xarray/util/print_versions.py>`__
"""
import importlib
import locale
import os
import platform
import struct
import subprocess
import sys
from typing import IO, List, Optional, Tuple
[docs]def get_sys_info() -> List[Tuple[str, Optional[str]]]:
"""Return system information as a dict.
From https://github.com/numpy/numpy/blob/master/setup.py#L64-L89
"""
blob = []
def _minimal_ext_cmd(cmd: List[str]) -> bytes:
# construct minimal environment
env = {}
for k in ["SYSTEMROOT", "PATH", "HOME"]:
v = os.environ.get(k)
if v is not None:
env[k] = v
# LANGUAGE is used on win32
env["LANGUAGE"] = "C"
env["LANG"] = "C"
env["LC_ALL"] = "C"
out = subprocess.check_output(cmd, stderr=subprocess.STDOUT, env=env)
return out
commit = None
try:
out = _minimal_ext_cmd(["git", "rev-parse", "HEAD"])
commit = out.strip().decode("ascii")
except (subprocess.SubprocessError, OSError):
pass
blob.append(("commit", commit))
(sysname, _, release, _, machine, processor) = platform.uname()
blob.extend(
[
("python", sys.version),
("python-bits", f"{struct.calcsize('P') * 8}"),
("OS", f"{sysname}"),
("OS-release", f"{release}"),
("machine", f"{machine}"),
("processor", f"{processor}"),
("byteorder", f"{sys.byteorder}"),
("LC_ALL", f'{os.environ.get("LC_ALL", "None")}'),
("LANG", f'{os.environ.get("LANG", "None")}'),
("LOCALE", ".".join(str(i) for i in locale.getlocale())),
]
)
return blob
[docs]def netcdf_and_hdf5_versions() -> List[Tuple[str, Optional[str]]]:
"""Get netcdf and hdf5 versions."""
libhdf5_version = None
libnetcdf_version = None
try:
import netCDF4
libhdf5_version = netCDF4.__hdf5libversion__
libnetcdf_version = netCDF4.__netcdf4libversion__
except ImportError:
try:
import h5py
libhdf5_version = h5py.version.hdf5_version
except ImportError:
pass
return [("libhdf5", libhdf5_version), ("libnetcdf", libnetcdf_version)]
[docs]def show_versions(file: IO = sys.stdout) -> None:
"""Print the versions of pygeohydro stack and its dependencies.
Parameters
----------
file : file-like, optional
print to the given file-like object. Defaults to sys.stdout.
"""
sys_info = get_sys_info()
try:
sys_info.extend(netcdf_and_hdf5_versions())
except OSError as e:
print(f"Error collecting netcdf / hdf5 version: {e}")
deps = [
# (MODULE_NAME, f(mod) -> mod version)
# pygeohydro stack
("pygeohydro", lambda mod: mod.__version__),
("pygeoogc", lambda mod: mod.__version__),
("pygeoutils", lambda mod: mod.__version__),
("py3dep", lambda mod: mod.__version__),
("pynhd", lambda mod: mod.__version__),
("pydaymet", lambda mod: mod.__version__),
# dependencies
("xarray", lambda mod: mod.__version__),
("rasterio", lambda mod: mod.__version__),
("geopandas", lambda mod: mod.__version__),
("pandas", lambda mod: mod.__version__),
("orjson", lambda mod: mod.__version__),
("shapely", lambda mod: mod.__version__),
("scipy", lambda mod: mod.__version__),
("netCDF4", lambda mod: mod.__version__),
("defusedxml", lambda mod: mod.__version__),
("owslib", lambda mod: mod.__version__),
("pyproj", lambda mod: mod.__version__),
("requests", lambda mod: mod.__version__),
("pygeos", lambda mod: mod.__version__),
("matplotlib", lambda mod: mod.__version__),
# optionals
("bottleneck", lambda mod: mod.__version__),
("dask", lambda mod: mod.__version__),
("cartopy", lambda mod: mod.__version__),
# setup/test
("setuptools", lambda mod: mod.__version__),
("pip", lambda mod: mod.__version__),
("conda", lambda mod: mod.__version__),
("mamba", lambda mod: mod.__version__),
("pytest", lambda mod: mod.__version__),
# Misc.
("IPython", lambda mod: mod.__version__),
("sphinx", lambda mod: mod.__version__),
]
deps_blob: List[Tuple[str, Optional[str]]] = []
for (modname, ver_f) in deps:
try:
if modname in sys.modules:
mod = sys.modules[modname]
else:
mod = importlib.import_module(modname)
except ModuleNotFoundError:
deps_blob.append((modname, None))
else:
try:
ver = ver_f(mod)
deps_blob.append((modname, ver))
except NotImplementedError:
deps_blob.append((modname, "installed"))
print("\nINSTALLED VERSIONS", file=file)
print("------------------", file=file)
for k, stat in sys_info:
print(f"{k}: {stat}", file=file)
print("", file=file)
for k, stat in deps_blob:
print(f"{k}: {stat}", file=file)