def test_grib_multi_support_reset_file(): try: # TODO: read an actual multi-field GRIB here fpath = get_sample_fullpath("GRIB2.tmpl") if fpath is None: return eccodes.codes_grib_multi_support_on() with open(fpath, "rb") as f: eccodes.codes_grib_multi_support_reset_file(f) finally: eccodes.codes_grib_multi_support_off()
def multi_enabled(file: T.IO[bytes]) -> T.Iterator[None]: """Context manager that enables MULTI-FIELD support in ecCodes from a clean state""" eccodes.codes_grib_multi_support_on() # # Explicitly reset the multi_support global state that gets confused by random access # # @alexamici: I'm note sure this is thread-safe. See :#141 # eccodes.codes_grib_multi_support_reset_file(file) try: yield except Exception: eccodes.codes_grib_multi_support_off() raise eccodes.codes_grib_multi_support_off()
def multi_enabled(file): """Context manager that enables MULTI-FIELD support in ecCodes from a clean state""" eccodes.codes_grib_multi_support_on() # # Explicitly reset the multi_support global state that gets confused by random access # # @alexamici: I'm note sure this is thread-safe. See :#141 # context = eccodes.lib.codes_context_get_default() eccodes.lib.codes_grib_multi_support_reset_file(context, file) try: yield except Exception: eccodes.codes_grib_multi_support_off() raise eccodes.codes_grib_multi_support_off()
def test_grib_multi_field_write(tmpdir): # Note: eccodes.codes_grib_multi_new() calls codes_grib_multi_support_on() # hence the 'finally' block try: gid = eccodes.codes_grib_new_from_samples("GRIB2") mgid = eccodes.codes_grib_multi_new() section_num = 4 for step in range(12, 132, 12): eccodes.codes_set(gid, "step", step) eccodes.codes_grib_multi_append(gid, section_num, mgid) output = tmpdir.join("test_grib_multi_field_write.grib2") with open(str(output), "wb") as fout: eccodes.codes_grib_multi_write(mgid, fout) eccodes.codes_grib_multi_release(mgid) eccodes.codes_release(gid) finally: eccodes.codes_grib_multi_support_off()
# hide the pyeccodes import error from the majority of the users # that have problems with the ecCodes bindings try: import pyeccodes.compat as eccodes # type: ignore except ImportError: raise exc eccodes_version = eccodes.codes_get_api_version() LOG = logging.getLogger(__name__) _MARKER = object() # # MULTI-FIELD support is very tricky. Random access via the index needs multi support to be off. # eccodes.codes_grib_multi_support_off() @contextlib.contextmanager def multi_enabled(file: T.IO[bytes]) -> T.Iterator[None]: """Context manager that enables MULTI-FIELD support in ecCodes from a clean state""" eccodes.codes_grib_multi_support_on() # # Explicitly reset the multi_support global state that gets confused by random access # # @alexamici: I'm note sure this is thread-safe. See :#141 # eccodes.codes_grib_multi_support_reset_file(file) try: yield except Exception: