Introduction
The entire grib2io codebase has been rewritten. grib2io v1 was an optimized version of its predecessor, ncepgrib2 (formerly a part of the pygrib package). grib2io v2 has taken a different approach to handling the vast amount of GRIB2 metadata.
The Grib2Message object uses dynamic inheritance where it is comprised of a base object (for GRIB2 Sections 0 and 1). The rest of the GRIB2 message makes use of templates, so grib2io defines each grid, product, and data representation template as a class. When a GRIB2 message is read from file or created from scratch, `Grib2Message.__new__()` is used to create the custom Grib2Message object based on the template numbers.
In the Grib2Message object, GRIB2 section metadata values are stored in class variables of the section name (e.g. section0, section1, etc). The Grib2Message base class and template classes contain metadata that are class variable that are dataclass field objects. Their default values are descriptor classes that live in `grib2io/templates`. **_Each GRIB2 metadata attribute has a descriptor class defined for it_**. This allows for real-time mapping between a GRIB2 numeric metadata value stored in the section array and its "decoded" state.
Why refactor in this manner? The Grib2Message object now becomes a lightweight object container. The GRIB2 metadata only exists in 1 location -- its respective section array and you access the decoded variable through its descriptor class, not another variable in the object.
Highlights
* Rewrite of `Grib2Message` object leveraging dynamic inheritance; template classes; and descriptor classes for metadata (see Introduction above for more information). (39)
* Added support for spatial interpolation using [NCEPLIBS-sp](https://github.com/NOAA-EMC/NCEPLIBS-sp) and [NCEPLIBS-ip](https://github.com/NOAA-EMC/NCEPLIBS-ip) libraries. (#52)
* Improved perforamance when indexing GRIB2 messages. Instead of storing many attributes of each message, the actual Grib2Message object is stored along with message offset information.
* **_IMPORTANT:_** For `grib2io.open`, GRIB2 message number counting now begins at zero (0).
* Improved `grib2io.open.select()` functionality. Since each Grib2Message object is indexed, the select method can easily access **_ANY_** Grib2Message metadata attribute.
* Improved performance when unpacking data values. The GRIB2 data section is only read from file when `Grib2Message.data` is referenced. (40)
* Added support for Reduced and Rotated Lat/Lon grids. (42 and 59)
* Added support for Product Definition Template 4.48. (49)
* Date and time metadata objects are now of type `datetime.datetime` or `datetime.timedelta`. (1)
* Improved xarray backend support.
**Full Changelog**: https://github.com/NOAA-MDL/grib2io/compare/v1.1.0...v2.0.0b1