Skip to content

Commit cc44618

Browse files
committed
dev
1 parent 700a9ed commit cc44618

File tree

2 files changed

+53
-96
lines changed

2 files changed

+53
-96
lines changed

cf/functions.py

Lines changed: 47 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
import atexit
22
import csv
3-
import ctypes.util
4-
import importlib
53
import logging
64
import os
75
import platform
86
import re
9-
import sys
107
import warnings
118
from collections.abc import Iterable
129
from itertools import product
@@ -34,7 +31,7 @@
3431
from .docstring import _docstring_substitution_definitions
3532

3633

37-
# Instruction to close /proc/mem at exit.
34+
# Instruction to close /proc/meminfo at exit.
3835
def _close_proc_meminfo():
3936
try:
4037
_meminfo_file.close()
@@ -3134,34 +3131,6 @@ def _section(x, axes=None, stop=None, chunks=False, min_step=1):
31343131
return out
31353132

31363133

3137-
def _get_module_info(module, alternative_name=False, try_except=False):
3138-
"""Helper function for processing modules for cf.environment."""
3139-
if try_except:
3140-
module_name = None
3141-
try:
3142-
importlib.import_module(module)
3143-
module_name = module
3144-
except ImportError:
3145-
if (
3146-
alternative_name
3147-
): # where a module has a different (e.g. old) name
3148-
try:
3149-
importlib.import_module(alternative_name)
3150-
module_name = alternative_name
3151-
except ImportError:
3152-
pass
3153-
3154-
if not module_name:
3155-
return ("not available", "")
3156-
else:
3157-
module_name = module
3158-
3159-
return (
3160-
importlib.import_module(module_name).__version__,
3161-
importlib.util.find_spec(module_name).origin,
3162-
)
3163-
3164-
31653134
def environment(display=True, paths=True):
31663135
"""Return the names and versions of the cf package and its
31673136
dependencies.
@@ -3188,97 +3157,84 @@ def environment(display=True, paths=True):
31883157
31893158
>>> cf.environment()
31903159
Platform: Linux-6.8.0-60-generic-x86_64-with-glibc2.39
3160+
Python: 3.12.8 /home/miniconda3/bin/python
3161+
packaging: 24.1 /home/miniconda3/lib/python3.12/site-packages/packaging/__init__.py
3162+
numpy: 2.2.6 /home/miniconda3/lib/python3.12/site-packages/numpy/__init__.py
3163+
cfdm.core: 1.12.2.0 /home/miniconda3/lib/python3.12/site-packages/cfdm/cfdm/core/__init__.py
3164+
packaging: 24.1 /home/miniconda3/lib/python3.12/site-packages/packaging/__init__.py
3165+
udunits2 library: libudunits2.so.0
31913166
HDF5 library: 1.14.2
31923167
netcdf library: 4.9.4-development
3193-
udunits2 library: libudunits2.so.0
3194-
esmpy/ESMF: 8.7.0 /home/miniconda/lib/python3.12/site-packages/esmpy/__init__.py
3195-
Python: 3.12.8 /home/miniconda/bin/python
3196-
dask: 2025.5.1 /home/miniconda/lib/python3.12/site-packages/dask/__init__.py
3197-
netCDF4: 1.7.2 /home/miniconda/lib/python3.12/site-packages/netCDF4/__init__.py
3198-
h5netcdf: 1.3.0 /home/miniconda/lib/python3.12/site-packages/h5netcdf/__init__.py
3199-
h5py: 3.12.1 /home/miniconda/lib/python3.12/site-packages/h5py/__init__.py
3200-
s3fs: 2024.12.0 /home/miniconda/lib/python3.12/site-packages/s3fs/__init__.py
3201-
psutil: 6.1.1 /home/miniconda/lib/python3.12/site-packages/psutil/__init__.py
3202-
packaging: 24.2 /home/miniconda/lib/python3.12/site-packages/packaging/__init__.py
3203-
numpy: 2.2.2 /home/miniconda/lib/python3.12/site-packages/numpy/__init__.py
3204-
scipy: 1.15.2 /home/miniconda/lib/python3.12/site-packages/scipy/__init__.py
3205-
matplotlib: 3.10.0 /home/miniconda/lib/python3.12/site-packages/matplotlib/__init__.py
3206-
cftime: 1.6.4.post1 /home/miniconda/lib/python3.12/site-packages/cftime/__init__.py
3207-
cfunits: 3.3.7 /home/miniconda/lib/python3.12/site-packages/cfunits/__init__.py
3208-
cfplot: 3.3.0 /home/miniconda/lib/python3.12/site-packages/cfplot/__init__.py
3209-
cfdm: 1.12.2.0 /home/miniconda/lib/python3.12/site-packages/cfdm/__init__.py
3210-
cf: NEXTVERSION /home/miniconda/lib/python3.12/site-packages/cf/__init__.py
3168+
netCDF4: 1.7.2 /home/miniconda3/lib/python3.12/site-packages/netCDF4/__init__.py
3169+
h5netcdf: 1.3.0 /home/miniconda3/lib/python3.12/site-packages/h5netcdf/__init__.py
3170+
h5py: 3.12.1 /home/miniconda3/lib/python3.12/site-packages/h5py/__init__.py
3171+
zarr: 3.0.8 /home/miniconda3/lib/python3.12/site-packages/zarr/__init__.py
3172+
s3fs: 2024.12.0 /home/miniconda3/lib/python3.12/site-packages/s3fs/__init__.py
3173+
scipy: 1.15.1 /home/miniconda3/lib/python3.12/site-packages/scipy/__init__.py
3174+
dask: 2025.5.1 /home/miniconda3/lib/python3.12/site-packages/dask/__init__.py
3175+
cftime: 1.6.4.post1 /home/miniconda3/lib/python3.12/site-packages/cftime/__init__.py
3176+
cfunits: 3.3.7 /home/miniconda3/lib/python3.12/site-packages/cfunits/__init__.py
3177+
cfdm: 1.12.2.0 /home/miniconda3/lib/python3.12/site-packages/cfdm/__init__.py
3178+
esmpy/ESMF: 8.7.0 /home/miniconda3/lib/python3.12/site-packages/esmpy/__init__.py
3179+
psutil: 6.1.1 /home/miniconda3/lib/python3.12/site-packages/psutil/__init__.py
3180+
matplotlib: 3.10.0 /home/miniconda3/lib/python3.12/site-packages/matplotlib/__init__.py
3181+
cfplot: 3.4.0 /home/miniconda3/lib/python3.12/site-packages/cfplot/__init__.py
3182+
cf: NEXTVERSION /home/miniconda3/lib/python3.12/site-packages/cf/__init__.py
32113183
32123184
>>> cf.environment(paths=False)
32133185
Platform: Linux-6.8.0-60-generic-x86_64-with-glibc2.39
3186+
Python: 3.12.8
3187+
packaging: 24.1
3188+
numpy: 2.2.6
3189+
cfdm.core: 1.12.2.0
3190+
packaging: 24.1
3191+
udunits2 library: libudunits2.so.0
32143192
HDF5 library: 1.14.2
32153193
netcdf library: 4.9.4-development
3216-
udunits2 library: libudunits2.so.0
3217-
esmpy/ESMF: 8.7.0
3218-
Python: 3.12.8
3219-
dask: 2025.5.1
32203194
netCDF4: 1.7.2
32213195
h5netcdf: 1.3.0
32223196
h5py: 3.12.1
3197+
zarr: 3.0.8
32233198
s3fs: 2024.12.0
3224-
psutil: 6.1.1
3225-
packaging: 24.2
3226-
numpy: 2.2.2
3227-
scipy: 1.15.2
3228-
matplotlib: 3.10.0
3199+
scipy: 1.15.1
3200+
dask: 2025.5.1
32293201
cftime: 1.6.4.post1
32303202
cfunits: 3.3.7
3231-
cfplot: 3.3.0
32323203
cfdm: 1.12.2.0
3204+
esmpy/ESMF: 8.7.0
3205+
psutil: 6.1.1
3206+
matplotlib: 3.10.0
3207+
cfplot: 3.4.0
32333208
cf: NEXTVERSION
32343209
32353210
"""
3211+
# Get cfdm env
3212+
out = cfdm.environment(display=False, paths=paths)
3213+
3214+
_get_module_info = cfdm.functions._get_module_info
32363215
dependency_version_paths_mapping = {
3237-
# Platform first, then use an ordering to group libraries as follows...
3238-
"Platform": (platform.platform(), ""),
3239-
# Underlying C and Fortran based libraries first
3240-
"HDF5 library": (netCDF4.__hdf5libversion__, ""),
3241-
"netcdf library": (netCDF4.__netcdf4libversion__, ""),
3242-
"udunits2 library": (ctypes.util.find_library("udunits2"), ""),
32433216
"esmpy/ESMF": (
32443217
_get_module_info("esmpy", alternative_name="ESMF", try_except=True)
32453218
),
3246-
# Now Python itself
3247-
"Python": (platform.python_version(), sys.executable),
3248-
# Then Dask (cover first from below as it's important under-the-hood)
3249-
"dask": _get_module_info("dask"),
3250-
# Then Python libraries not related to CF
3251-
"netCDF4": _get_module_info("netCDF4"),
3252-
"h5netcdf": _get_module_info("h5netcdf"),
3253-
"h5py": _get_module_info("h5py"),
3254-
"s3fs": _get_module_info("s3fs"),
32553219
"psutil": _get_module_info("psutil"),
3256-
"packaging": _get_module_info("packaging"),
3257-
"numpy": _get_module_info("numpy"),
3258-
"scipy": _get_module_info("scipy"),
32593220
"matplotlib": _get_module_info("matplotlib", try_except=True),
3260-
# Finally the CF related Python libraries, with the cf version last
3261-
# as it is the most relevant (cfdm penultimate for similar reason)
3262-
"cftime": _get_module_info("cftime"),
3263-
"cfunits": _get_module_info("cfunits"),
32643221
"cfplot": _get_module_info("cfplot", try_except=True),
3265-
"cfdm": _get_module_info("cfdm"),
32663222
"cf": (__version__, _os_path_abspath(__file__)),
32673223
}
32683224
string = "{0}: {1!s}"
32693225
if paths:
3270-
# Include path information, else exclude, when unpacking tuple
3226+
# Include path information, else exclude, when unpacking tuple.
32713227
string += " {2!s}"
32723228

3273-
out = [
3274-
string.format(dep, *info)
3275-
for dep, info in dependency_version_paths_mapping.items()
3276-
]
3277-
3278-
out = "\n".join(out)
3229+
out.extend(
3230+
[
3231+
string.format(dep, *info)
3232+
for dep, info in dependency_version_paths_mapping.items()
3233+
]
3234+
)
32793235

32803236
if display:
3281-
print(out) # pragma: no cover
3237+
print("\n".join(out)) # pragma: no cover
32823238
else:
32833239
return out
32843240

cf/test/test_functions.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -286,13 +286,14 @@ def test_Configuration(self):
286286
def test_environment(self):
287287
e = cf.environment(display=False)
288288
ep = cf.environment(display=False, paths=False)
289-
self.assertIsInstance(e, str)
290-
self.assertIsInstance(ep, str)
291289

292-
components = ["Platform: ", "udunits2 library: ", "numpy: ", "cfdm: "]
290+
self.assertIsInstance(e, list)
291+
self.assertIsInstance(ep, list)
292+
293+
components = ["Platform: ", "netCDF4: ", "numpy: ", "cftime: "]
293294
for component in components:
294-
self.assertIn(component, e)
295-
self.assertIn(component, ep)
295+
self.assertTrue(any(s.startswith(component) for s in e))
296+
self.assertTrue(any(s.startswith(component) for s in ep))
296297
for component in [
297298
f"cf: {cf.__version__} {os.path.abspath(cf.__file__)}",
298299
f"Python: {platform.python_version()} {sys.executable}",

0 commit comments

Comments
 (0)