Skip to content

GLM-met

Developing

Environment

A Docker container can be used to create a development environment. You can either build the Docker image:

docker build -t glm-met-dev .devcontainer

Or, you can develop glm-met using a dev container.

Code style

Code linting and formatting uses ruff and black. A script to format the glm-met repository can be run: ./scripts/format.sh.

pre-commit is used to run ruff and black.

Tests

pytest is used for testing glm-met.

If testing, please add tests under the tests directory. If you need test data for running tests, add them as pytest.fixtures in conftest.py.

Extending

The glm-met package can be extended to support downloading data from a range of meteorological data providers.

There are two base classes that can be extended to provide with functionality for a new meteorological data provider. Theses base classes can be found in glm_met/glm_met.py.

Specifically, there is a base class GlmMet that should be extended to define a class that comprises attributes and methods necessary to retrieve meteorological data from a specific data provider. This base class has four abstract methods that any class inheriting GlmMet must override and provide an implementation for:

  • get_variables() - a method to download requested weather variables from a data provider.
  • write_met() - a method to write data downloaded from a data provider to disk.
  • convert_to_glm() - a method to convert data downloaded from a data provider to GLM format.
  • write_glm_met() - a method to write meteorological data in GLM format to disk.

Overriding, and providing an implementation for these methods, these methods ensures that the class for a new meteorological data provider offers functionality to retrieve user / client requested data and format this data ready for GLM.

The typical development pattern for a new meteorological data provider (e.g. open-meteo's Climate API) is:

Create a new directory and package for the new data provider inside the glm_met directory:

glm_met/
    openmeteo/
        __init__.py
    __init__.py
    glm_met.py

Create a new module within the openmeteo directory (e.g. named climate.py):

glm_met/
    openmeteo/
        __init__.py
        climate.py
    __init__.py
    glm_met.py

In climate.py create a new class that extends the GlmMet base class (which is defined in glm_met.py):

# add to climate.py
from glm_met import glm_met

class MetData(glm_met.MetData):
    def __init__(self, metadata: dict, data: pd.DataFrame):
        """
        Class for meteorological data and its associated metadata.

        Used within instances of `ClimateChange` class to store
        meteoroligcal data downloaded from the open-meteo
        climate API.
        """
        self.metadata = metadata
        self.data = data


class ClimateChange(glm_met.GlmMet):
    """
    Class for retrieving and processing daily climate change data from
    open-meteo's Climate API.
    """


    def __init__(
        self,
    ):
        """
        Initialize the `ClimateChange` object for retrieving and storing
        meteorological data from open-meteo's Climate API.
        """

        def get_variables(self) -> None:
            """Override GlmMet.get_variables() with implementation to 
            get variables from weather data provider."""
            # implementation here

        def write_met(self) -> None:
            """Override GlmMet.write_met() with implementation to
            save weather data from data provider."""
            # implementation here

        def convert_to_glm(self) -> None:
            """Override GlmMet.convert_to_glm() with implementation to
            convert weather data to GLM format."""
            # implementation here

        def write_glm_met(self) -> None:
            """Override GlmMet.write_glm_met() with implementation to
            save weather data in GLM format."""
            # implementation here