diff --git a/eccodes/highlevel/_bufr/coder.py b/eccodes/highlevel/_bufr/coder.py index ab9a095..2c28e31 100644 --- a/eccodes/highlevel/_bufr/coder.py +++ b/eccodes/highlevel/_bufr/coder.py @@ -345,9 +345,7 @@ def commit(self, entry) -> None: codes_set(self._handle, f"#{rank}#{key}", value) else: if array.dtype.type == np.str_: - if array.size == 1: # [1] - codes_set(self._handle, key, array.data[0][0]) - elif array.size > 1 and not np.any(array != array.data[0][0]): + if array.size > 1 and not np.any(array != array.data[0][0]): codes_set_array(self._handle, key, array.data[0][0:1]) else: codes_set_array(self._handle, key, array.data.ravel()) @@ -384,8 +382,6 @@ def commit(self, entry) -> None: codes_release(self._clone_handle) self._clone_handle = 0 - # [1] This is a workaround for ECC-1623. - # # [2] If all values in an array are the same, encode only a single scalar value. # # [3] The key 'centre' is also an alias for the header key 'headerCentre', diff --git a/tests/test_bufr_data.py b/tests/test_bufr_data.py index ba775ae..7525ac6 100644 --- a/tests/test_bufr_data.py +++ b/tests/test_bufr_data.py @@ -332,3 +332,22 @@ def test_data_assignment_with_non_native_types(): bufr["satelliteIdentifier"] = np.int16(0) bufr["satelliteIdentifier"] = np.int32(0) bufr["latitude"] = np.float32(0) + + +def test_data_set_string_uncompressed(): # ECC-2220 + bufr = BUFRMessage("BUFR4") + bufr["unexpandedDescriptors"] = [1025] + bufr["stormIdentifier"] = "70A" + assert bufr["stormIdentifier"] == "70A" + bufr.pack() + assert bufr["stormIdentifier"] == "70A" + + +def test_data_set_string_compressed(): # ECC-2220 + bufr = BUFRMessage("BUFR4") + bufr["compressedData"] = 1 + bufr["unexpandedDescriptors"] = [1025] + bufr["stormIdentifier"] = "70A" + assert bufr["stormIdentifier"] == "70A" + bufr.pack() + assert bufr["stormIdentifier"] == "70A"