From 85eebf6f00d939556848515dd364915c6464e078 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Mon, 29 Dec 2025 17:40:17 +0800 Subject: [PATCH 1/4] Add private functions --- doc/conf.py | 17 ++--------------- pygmt/_show_versions.py | 40 +++++++++++++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index c9558797ceb..7125c7d6959 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -5,24 +5,11 @@ """ import datetime -import importlib -from packaging.requirements import Requirement from pygmt import __commit__, __version__ -from pygmt.clib import required_gmt_version +from pygmt._show_versions import _get_dep_specifier from pygmt.sphinx_gallery import PyGMTScraper -# Dictionary for dependency name and minimum required versions. -requirements = { - Requirement(requirement).name: str(Requirement(requirement).specifier) - for requirement in importlib.metadata.requires("pygmt") -} -requirements.update( - { - "python": importlib.metadata.metadata("pygmt")["Requires-Python"], - "gmt": f">={required_gmt_version}", - } -) # Is a development version or not. isdev = "dev" in __version__ or __version__ == "unknown" # Some variables. @@ -142,7 +129,7 @@ ] # Enable substitutions using {{ key }} in the Markdown files myst_substitutions = { - "requires": requirements, + "requires": _get_dep_specifier(), } # Options for MyST-NB. diff --git a/pygmt/_show_versions.py b/pygmt/_show_versions.py index 1095c931113..f6cbfd8719e 100644 --- a/pygmt/_show_versions.py +++ b/pygmt/_show_versions.py @@ -9,12 +9,12 @@ import shutil import subprocess import sys -from importlib.metadata import PackageNotFoundError, requires, version +from importlib.metadata import PackageNotFoundError, metadata, requires, version from typing import TextIO from packaging.requirements import Requirement from packaging.version import Version -from pygmt.clib import Session, __gmt_version__ +from pygmt.clib import Session, __gmt_version__, required_gmt_version # Get semantic version through setuptools-scm __version__ = f"v{version('pygmt')}" # e.g. v0.1.2.dev3+g0ab3cd78 @@ -108,6 +108,36 @@ def _check_ghostscript_version(gs_version: str | None) -> str | None: return None +def _get_dep_info() -> dict[str, str]: + """ + Get version information of PyGMT's dependencies. + """ + dep_info = { + Requirement(v).name: _get_module_version(Requirement(v).name) + for v in requires("pygmt") + } + dep_info.update( + {"gdal": _get_gdal_version(), "ghostscript": _get_ghostscript_version()} + ) + return dep_info + + +def _get_dep_specifier() -> dict[str, str]: + """ + Get version specifiers of PyGMT's dependencies. + """ + dep_specifier = { + Requirement(v).name: str(Requirement(v).specifier) for v in requires("pygmt") + } + dep_specifier.update( + { + "python": metadata("pygmt")["Requires-Python"], + "gmt": f">={required_gmt_version}", + } + ) + return dep_specifier + + def show_versions(file: TextIO | None = sys.stdout) -> None: """ Print various dependency versions which are useful when submitting bug reports. @@ -128,11 +158,7 @@ def show_versions(file: TextIO | None = sys.stdout) -> None: "executable": sys.executable, "machine": platform.platform(), } - requirements = [Requirement(v).name for v in requires("pygmt")] # type: ignore[union-attr] - dep_info = {name: _get_module_version(name) for name in requirements} - dep_info.update( - {"gdal": _get_gdal_version(), "ghostscript": _get_ghostscript_version()} - ) + dep_info = _get_dep_info() lines = [] lines.append("PyGMT information:") From 9fced2db54b683735254192225fe71f9701df95d Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 30 Dec 2025 10:25:54 +0800 Subject: [PATCH 2/4] Fix typing --- pygmt/_show_versions.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pygmt/_show_versions.py b/pygmt/_show_versions.py index f6cbfd8719e..2fde5af527c 100644 --- a/pygmt/_show_versions.py +++ b/pygmt/_show_versions.py @@ -108,13 +108,13 @@ def _check_ghostscript_version(gs_version: str | None) -> str | None: return None -def _get_dep_info() -> dict[str, str]: +def _get_dep_info() -> dict[str, str | None]: """ Get version information of PyGMT's dependencies. """ dep_info = { Requirement(v).name: _get_module_version(Requirement(v).name) - for v in requires("pygmt") + for v in requires("pygmt") # type: ignore[union-attr] } dep_info.update( {"gdal": _get_gdal_version(), "ghostscript": _get_ghostscript_version()} @@ -127,7 +127,8 @@ def _get_dep_specifier() -> dict[str, str]: Get version specifiers of PyGMT's dependencies. """ dep_specifier = { - Requirement(v).name: str(Requirement(v).specifier) for v in requires("pygmt") + Requirement(v).name: str(Requirement(v).specifier) + for v in requires("pygmt") # type: ignore[union-attr] } dep_specifier.update( { From fc6269ac0bf4346de2a30ea87716ec514bc063a1 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 30 Dec 2025 13:43:14 +0800 Subject: [PATCH 3/4] Rename dep_info to dep_version --- pygmt/_show_versions.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pygmt/_show_versions.py b/pygmt/_show_versions.py index 2fde5af527c..f9a814ef7d7 100644 --- a/pygmt/_show_versions.py +++ b/pygmt/_show_versions.py @@ -108,7 +108,7 @@ def _check_ghostscript_version(gs_version: str | None) -> str | None: return None -def _get_dep_info() -> dict[str, str | None]: +def _get_dep_version() -> dict[str, str | None]: """ Get version information of PyGMT's dependencies. """ @@ -159,7 +159,7 @@ def show_versions(file: TextIO | None = sys.stdout) -> None: "executable": sys.executable, "machine": platform.platform(), } - dep_info = _get_dep_info() + dep_version = _get_dep_version() lines = [] lines.append("PyGMT information:") @@ -167,11 +167,11 @@ def show_versions(file: TextIO | None = sys.stdout) -> None: lines.append("System information:") lines.extend([f" {key}: {val}" for key, val in sys_info.items()]) lines.append("Dependency information:") - lines.extend([f" {key}: {val}" for key, val in dep_info.items()]) + lines.extend([f" {key}: {val}" for key, val in dep_version.items()]) lines.append("GMT library information:") lines.extend([f" {key}: {val}" for key, val in _get_clib_info().items()]) - if warnmsg := _check_ghostscript_version(dep_info["ghostscript"]): + if warnmsg := _check_ghostscript_version(dep_version["ghostscript"]): lines.append("WARNING:") lines.append(f" {warnmsg}") From 944806cf0b8dd91f42d10ff09135745a79bcf531 Mon Sep 17 00:00:00 2001 From: Dongdong Tian Date: Tue, 30 Dec 2025 13:51:39 +0800 Subject: [PATCH 4/4] Further simplify --- pygmt/_show_versions.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/pygmt/_show_versions.py b/pygmt/_show_versions.py index f9a814ef7d7..8dd18bc56e7 100644 --- a/pygmt/_show_versions.py +++ b/pygmt/_show_versions.py @@ -108,35 +108,31 @@ def _check_ghostscript_version(gs_version: str | None) -> str | None: return None +def _get_dep() -> list[Requirement]: + """ + Get requirements of the PyGMT package. + """ + return [Requirement(v) for v in requires("pygmt")] # type: ignore[union-attr] + + def _get_dep_version() -> dict[str, str | None]: """ Get version information of PyGMT's dependencies. """ - dep_info = { - Requirement(v).name: _get_module_version(Requirement(v).name) - for v in requires("pygmt") # type: ignore[union-attr] + return {req.name: _get_module_version(req.name) for req in _get_dep()} | { + "gdal": _get_gdal_version(), + "ghostscript": _get_ghostscript_version(), } - dep_info.update( - {"gdal": _get_gdal_version(), "ghostscript": _get_ghostscript_version()} - ) - return dep_info def _get_dep_specifier() -> dict[str, str]: """ Get version specifiers of PyGMT's dependencies. """ - dep_specifier = { - Requirement(v).name: str(Requirement(v).specifier) - for v in requires("pygmt") # type: ignore[union-attr] + return {req.name: str(req.specifier) for req in _get_dep()} | { + "python": metadata("pygmt")["Requires-Python"], + "gmt": f">={required_gmt_version}", } - dep_specifier.update( - { - "python": metadata("pygmt")["Requires-Python"], - "gmt": f">={required_gmt_version}", - } - ) - return dep_specifier def show_versions(file: TextIO | None = sys.stdout) -> None: