1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
import collections
import itertools
import pathlib
import numpy as np
import pytest
import eccodes
SAMPLE_DATA_FOLDER = pathlib.Path(__file__).parent / "sample-data"
TEST_GRIB_DATA = SAMPLE_DATA_FOLDER / "tiggelam_cnmc_sfc.grib2"
TEST_GRIB_DATA2 = SAMPLE_DATA_FOLDER / "era5-levels-members.grib"
def test_filereader():
with eccodes.FileReader(TEST_GRIB_DATA) as reader:
count = len([None for _ in reader])
assert count == 7
def test_read_message():
with eccodes.FileReader(TEST_GRIB_DATA) as reader:
message = next(reader)
assert isinstance(message, eccodes.GRIBMessage)
def test_message_get():
dummy_default = object()
known_missing = "scaleFactorOfSecondFixedSurface"
with eccodes.FileReader(TEST_GRIB_DATA) as reader:
message = next(reader)
assert message.get("edition") == 2
assert message.get("nonexistent") is None
assert message.get("nonexistent", dummy_default) is dummy_default
assert message.get("centre", ktype=int) == 250
assert message.get("dataType:int") == 11
num_vals = message.get("numberOfValues")
assert message.get_size("values") == num_vals
vals = message.get("values")
assert len(vals) == num_vals
vals2 = message.data
assert np.all(vals == vals2)
assert message["Ni"] == 511
assert message["gridType:int"] == 0
with pytest.raises(KeyError):
message["invalid"]
# keys set as MISSING
assert message.is_missing(known_missing)
assert message.get(known_missing) is None
assert message.get(known_missing, dummy_default) is dummy_default
with pytest.raises(KeyError):
message[known_missing]
def test_message_set_plain():
missing_key = "scaleFactorOfFirstFixedSurface"
with eccodes.FileReader(TEST_GRIB_DATA) as reader:
message = next(reader)
message.set("centre", "ecmf")
vals = np.arange(message.get("numberOfValues"), dtype=np.float32)
message.set_array("values", vals)
message.set_missing(missing_key)
assert message.get("centre") == "ecmf"
assert np.all(message.get("values") == vals)
assert message.is_missing(missing_key)
def test_message_set_dict_with_checks():
with eccodes.FileReader(TEST_GRIB_DATA) as reader:
message = next(reader)
message.set(
{
"centre": "ecmf",
"numberOfValues": 10,
"shortName": "z",
}
)
with pytest.raises(TypeError):
message.set("centre", "ecmwf", 2)
with pytest.raises(ValueError):
message.set("stepRange", "0-12")
message.set({"stepType": "max", "stepRange": "0-12"})
def test_message_set_dict_no_checks():
with eccodes.FileReader(TEST_GRIB_DATA) as reader:
message = next(reader)
assert message.get("longitudeOfFirstGridPoint") == 344250000
assert message.get("longitudeOfLastGridPoint") == 16125000
message.set("swapScanningX", 1, check_values=False)
assert message.get("longitudeOfFirstGridPoint") == 16125000
assert message.get("longitudeOfLastGridPoint") == 344250000
def test_message_iter():
with eccodes.FileReader(TEST_GRIB_DATA2) as reader:
message = next(reader)
keys = list(message)
assert len(keys) >= 192
assert keys[-1] == "7777"
assert "centre" in keys
assert "shortName" in keys
keys2 = list(message.keys())
assert keys == keys2
items = collections.OrderedDict(message.items())
assert list(items.keys()) == keys
assert items["shortName"] == "z"
assert items["centre"] == "ecmf"
values = list(message.values())
assert values[keys.index("shortName")] == "z"
assert values[keys.index("centre")] == "ecmf"
assert values[-1] == "7777"
def test_message_iter_missingvalues():
missing_key = "level"
with eccodes.FileReader(TEST_GRIB_DATA2) as reader:
message = next(reader)
message[missing_key] = 42
message.set_missing(missing_key)
assert missing_key not in set(message)
assert missing_key not in set(message.keys())
assert missing_key not in dict(message.items())
def test_message_copy():
with eccodes.FileReader(TEST_GRIB_DATA2) as reader:
message = next(reader)
message2 = message.copy()
assert list(message.keys()) == list(message2.keys())
def test_write_message(tmp_path):
with eccodes.FileReader(TEST_GRIB_DATA2) as reader1:
fname = tmp_path / "foo.grib"
written = []
with open(fname, "wb") as fout:
for message in itertools.islice(reader1, 15):
message.write_to(fout)
written.append(message)
with eccodes.FileReader(fname) as reader2:
for message1, message2 in itertools.zip_longest(written, reader2):
assert message1 is not None
assert message2 is not None
for key in [
"edition",
"centre",
"typeOfLevel",
"level",
"dataDate",
"stepRange",
"dataType",
"shortName",
"packingType",
"gridType",
"number",
]:
assert message1[key] == message2[key]
assert np.all(message1.data == message2.data)
def test_message_from_samples():
message = eccodes.GRIBMessage.from_samples("regular_ll_sfc_grib2")
assert message["edition"] == 2
assert message["gridType"] == "regular_ll"
assert message["levtype"] == "sfc"
|