Skip to content

Commit b0bc302

Browse files
committedAug 28, 2024
Function to query library features
1 parent d5bc805 commit b0bc302

File tree

6 files changed

+49
-2
lines changed

6 files changed

+49
-2
lines changed
 

‎CHANGELOG.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Changelog for eccodes-python
77

88
- ECC-1790: Add codes_get_offset
99
- ECC-1899: API function to allow setting debug level
10+
- Function to query library features
1011

1112

1213
1.7.1 (2024-06-19)

‎eccodes/eccodes.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
#
1111
#
1212
from gribapi import (
13+
CODES_FEATURES_ALL,
14+
CODES_FEATURES_DISABLED,
15+
CODES_FEATURES_ENABLED,
1316
CODES_PRODUCT_ANY,
1417
CODES_PRODUCT_BUFR,
1518
CODES_PRODUCT_GRIB,
@@ -44,6 +47,7 @@
4447
codes_dump,
4548
codes_extract_offsets,
4649
codes_extract_offsets_sizes,
50+
codes_get_features,
4751
codes_get_gaussian_latitudes,
4852
codes_get_library_path,
4953
codes_get_version_info,
@@ -249,6 +253,9 @@
249253
"codes_definition_path",
250254
"codes_extract_offsets",
251255
"codes_extract_offsets_sizes",
256+
"CODES_FEATURES_ALL",
257+
"CODES_FEATURES_ENABLED",
258+
"CODES_FEATURES_DISABLED",
252259
"codes_get_api_version",
253260
"codes_get_array",
254261
"codes_get_double_array",
@@ -273,6 +280,7 @@
273280
"codes_get_values",
274281
"codes_get_version_info",
275282
"codes_get",
283+
"codes_get_features",
276284
"codes_grib_find_nearest_multiple",
277285
"codes_grib_find_nearest",
278286
"codes_grib_get_data",

‎gribapi/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
from .gribapi import __version__, lib
1515

1616
# The minimum recommended version for the ecCodes package
17-
min_recommended_version_str = "2.31.0"
18-
min_recommended_version_int = 23100
17+
min_recommended_version_str = "2.37.0"
18+
min_recommended_version_int = 23700
1919

2020
if lib.grib_get_api_version() < min_recommended_version_int:
2121
import warnings

‎gribapi/grib_api.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ int parse_keyval_string(const char *grib_tool, char *arg, int values_required, i
176176
int grib_get_data(const grib_handle *h, double *lats, double *lons, double *values);
177177
int grib_get_gaussian_latitudes(long trunc, double* lats);
178178

179+
int codes_is_feature_enabled(const char* feature);
180+
int codes_get_features(char* result, size_t* length, int select);
181+
179182
/* EXPERIMENTAL */
180183
typedef struct codes_bufr_header {
181184
unsigned long message_offset;

‎gribapi/gribapi.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@
7070
GRIB_NEAREST_SAME_DATA = 1 << 1
7171
GRIB_NEAREST_SAME_POINT = 1 << 2
7272

73+
# Constants for feature selection
74+
CODES_FEATURES_ALL = 0
75+
CODES_FEATURES_ENABLED = 1
76+
CODES_FEATURES_DISABLED = 2
77+
78+
7379
# ECC-1029: Disable function-arguments type-checking unless
7480
# environment variable is defined and equal to 1
7581
enable_type_checks = os.environ.get("ECCODES_PYTHON_ENABLE_TYPE_CHECKS") == "1"
@@ -2644,6 +2650,23 @@ def codes_extract_offsets_sizes(filepath, product_kind, is_strict=True):
26442650
i += 1
26452651

26462652

2653+
@require(select=int)
2654+
def codes_get_features(select=CODES_FEATURES_ALL):
2655+
"""
2656+
@brief Get the list of library features.
2657+
2658+
@param select One of CODES_FEATURES_ALL, CODES_FEATURES_ENABLED or CODES_FEATURES_DISABLED
2659+
@return space-separated string of feature names
2660+
@exception CodesInternalError
2661+
"""
2662+
ssize = 1024
2663+
result = ffi.new("char[]", ssize)
2664+
size_p = ffi.new("size_t *", ssize)
2665+
err = lib.codes_get_features(result, size_p, select)
2666+
GRIB_CHECK(err)
2667+
return ffi.string(result).decode(ENC)
2668+
2669+
26472670
# -------------------------------
26482671
# EXPERIMENTAL FEATURES
26492672
# -------------------------------

‎tests/test_eccodes.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,18 @@ def test_version_info():
8080
assert len(vinfo) == 2
8181

8282

83+
def test_codes_get_features():
84+
if eccodes.codes_get_api_version(int) < 23700:
85+
pytest.skip("ecCodes version too old")
86+
87+
features = eccodes.codes_get_features(eccodes.CODES_FEATURES_ALL)
88+
print(f"\n\tAll features = {features}")
89+
features = eccodes.codes_get_features(eccodes.CODES_FEATURES_DISABLED)
90+
print(f"\tDisabled features = {features}")
91+
features = eccodes.codes_get_features(eccodes.CODES_FEATURES_ENABLED)
92+
print(f"\tEnabled features = {features}")
93+
94+
8395
def test_codes_is_defined():
8496
gid = eccodes.codes_grib_new_from_samples("sh_sfc_grib1")
8597
assert eccodes.codes_is_defined(gid, "JS")

0 commit comments

Comments
 (0)
Failed to load comments.