"""Utility methods to print system information for debugging.Adapted from :func:`rioxarray.show_versions` and :func:`pandas.show_versions`."""importplatformimportshutilimportsubprocessimportsysfromimportlib.metadataimportPackageNotFoundError,requires,versionfromtypingimportTextIOfrompackaging.requirementsimportRequirementfrompackaging.versionimportVersionfrompygmt.clibimportSession,__gmt_version__# Get semantic version through setuptools-scm__version__=f'v{version("pygmt")}'# e.g. v0.1.2.dev3+g0ab3cd78__commit__=__version__.split("+g")[-1]if"+g"in__version__else""# 0ab3cd78def_get_clib_info()->dict[str,str]:""" Get information about the GMT shared library. """withSession()aslib:returnlib.infodef_get_module_version(modname:str)->str|None:""" Get version information of a Python module. """try:returnversion(modname)exceptPackageNotFoundError:returnNonedef_get_ghostscript_version()->str|None:""" Get Ghostscript version. """matchsys.platform:casenameifnamein{"linux","darwin"}orname.startswith("freebsd"):cmds=["gs"]case"win32":cmds=["gswin64c.exe","gswin32c.exe"]case_:returnNoneforgs_cmdincmds:if(gsfullpath:=shutil.which(gs_cmd))isnotNone:returnsubprocess.check_output([gsfullpath,"--version"],universal_newlines=True).strip()returnNonedef_check_ghostscript_version(gs_version:str|None)->str|None:""" Check if the Ghostscript version is compatible with GMT versions. """ifgs_versionisNone:return"Ghostscript is not detected. Your installation may be broken."matchVersion(gs_version):casevifv<Version("9.53"):return(f"Ghostscript v{gs_version} is too old and may have serious bugs. ""Please consider upgrading your Ghostscript.")casevifVersion("10.00")<=v<Version("10.02"):return(f"Ghostscript v{gs_version} has known bugs. ""Please consider upgrading to version v10.02 or later.")casevifv>=Version("10.02")andVersion(__gmt_version__)<Version("6.5.0"):return(f"GMT v{__gmt_version__} doesn't support Ghostscript v{gs_version}. ""Please consider upgrading to GMT>=6.5.0 or downgrading to Ghostscript ""v9.56.")returnNone
[docs]defshow_versions(file:TextIO|None=sys.stdout):""" Print various dependency versions which are useful when submitting bug reports. This includes information about: - PyGMT itself - System information (Python version, Operating System) - Core dependency versions (NumPy, pandas, Xarray, etc) - GMT library information It also warns users if the installed Ghostscript version has serious bugs or is incompatible with the installed GMT version. """sys_info={"python":sys.version.replace("\n"," "),"executable":sys.executable,"machine":platform.platform(),}requirements=[Requirement(v).nameforvinrequires("pygmt")]+["gdal"]# type: ignore[union-attr]dep_info={name:_get_module_version(name)fornameinrequirements}dep_info.update({"ghostscript":_get_ghostscript_version()})lines=[]lines.append("PyGMT information:")lines.append(f" version: {__version__}")lines.append("System information:")lines.extend([f" {key}: {val}"forkey,valinsys_info.items()])lines.append("Dependency information:")lines.extend([f" {key}: {val}"forkey,valindep_info.items()])lines.append("GMT library information:")lines.extend([f" {key}: {val}"forkey,valin_get_clib_info().items()])ifwarnmsg:=_check_ghostscript_version(dep_info["ghostscript"]):lines.append("WARNING:")lines.append(f" {warnmsg}")print("\n".join(lines),file=file)