From f739fcbacb456fbd7ad2bb614f2dfda3b5820a30 Mon Sep 17 00:00:00 2001 From: develop-cs <43383361+develop-cs@users.noreply.github.com> Date: Fri, 10 Jan 2025 12:22:10 +0100 Subject: [PATCH 1/3] docs: clean docstrings and change doc palette Signed-off-by: develop-cs <43383361+develop-cs@users.noreply.github.com> --- .github/workflows/ci-cd-mkdocs.yml | 2 +- .pre-commit-config.yaml | 10 +- README.md | 4 +- docs/mkdocs.yaml | 20 +-- pyproject.toml | 3 +- src/meteole/__init__.py | 19 --- src/meteole/_arome.py | 30 ++-- src/meteole/_arpege.py | 43 ++--- src/meteole/_vigilance.py | 35 ++-- src/meteole/clients.py | 85 ++++++---- src/meteole/errors.py | 52 +++--- src/meteole/forecast.py | 259 +++++++++++++++++++---------- 12 files changed, 327 insertions(+), 235 deletions(-) diff --git a/.github/workflows/ci-cd-mkdocs.yml b/.github/workflows/ci-cd-mkdocs.yml index f928cf5..fca9d4a 100644 --- a/.github/workflows/ci-cd-mkdocs.yml +++ b/.github/workflows/ci-cd-mkdocs.yml @@ -36,7 +36,7 @@ with: path: "docs/site/" publish: - if: success() && github.ref == 'refs/heads/main' + if: success() && startsWith(github.ref, 'refs/tags') name: Publish doc needs: build permissions: diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e06ea91..f3420de 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,20 +27,20 @@ repos: - id: check-added-large-files args: [--maxkb=500] - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.8.3 + rev: v0.8.6 hooks: - id: ruff args: [--fix] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.13.0 + rev: v1.14.1 hooks: - id: mypy args: [--config-file=pyproject.toml] files: src additional_dependencies: [pydantic~=2.0,types-pytz,types-requests,types-python-dateutil] - repo: https://github.com/gitleaks/gitleaks - rev: v8.21.2 + rev: v8.22.1 hooks: - id: gitleaks - repo: https://github.com/pypa/pip-audit @@ -49,12 +49,12 @@ repos: - id: pip-audit args: [--skip-editable] - repo: https://github.com/compilerla/conventional-pre-commit - rev: v3.6.0 + rev: v4.0.0 hooks: - id: conventional-pre-commit stages: [commit-msg] args: [feat, fix, ci, chore, test, docs] - repo: https://github.com/kynan/nbstripout - rev: 0.7.1 + rev: 0.8.1 hooks: - id: nbstripout diff --git a/README.md b/README.md index eb746ad..a69c61b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

CI - Coverage + Coverage Versions Python Downloads @@ -120,7 +120,7 @@ vigi.get_vignette() vignette de vigilance -To have more documentation from MeteoFrance in Vigilance Bulletin : +To have more documentation from Meteo-France in Vigilance Bulletin : - [Meteo France Documentation](https://donneespubliques.meteofrance.fr/?fond=produit&id_produit=305&id_rubrique=50) ## Contributing diff --git a/docs/mkdocs.yaml b/docs/mkdocs.yaml index 271e661..e58cfb0 100644 --- a/docs/mkdocs.yaml +++ b/docs/mkdocs.yaml @@ -5,7 +5,7 @@ repo_name: MAIF/meteole site_author: OSSbyMAIF Team docs_dir: pages theme: - name: 'material' + name: material logo: assets/img/svg/meteole-fond-clair.svg favicon: assets/img/svg/meteole-git.svg palette: @@ -14,14 +14,14 @@ theme: toggle: icon: material/brightness-auto name: Switch to light mode - primary: white - accent: red + primary: light green + accent: lime # Palette toggle for light mode - media: "(prefers-color-scheme: light)" scheme: default - primary: white - accent: red + primary: light green + accent: lime toggle: icon: material/brightness-7 name: Switch to dark mode @@ -30,13 +30,13 @@ theme: - media: "(prefers-color-scheme: dark)" scheme: slate primary: black - accent: red + accent: lime toggle: icon: material/brightness-4 name: Switch to system preference font: - text: 'Roboto' - code: 'Roboto Mono' + text: Urbanist + code: Source Code Pro language: en features: - content.tabs.link @@ -81,6 +81,4 @@ nav: - User Guide: - How to: how_to.md - Advanced User Guide: - - Coverages: coverage_parameters.md -extra_css: - - assets/css/mkdocs_extra.css \ No newline at end of file + - Coverages: coverage_parameters.md \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 018897d..98577a4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,14 +4,13 @@ build-backend = "setuptools.build_meta" [project] name = "meteole" -version = "0.0.1" +version = "0.1.0b1" requires-python = ">3.8.0" description = "A Python client library for forecast model APIs (e.g., Météo-France)." readme = "README.md" license = {text = "Apache-2.0"} authors = [ {name = "ThomasBouche"}, - {name = "develop-cs"}, {name = "GratienDSX"}, ] diff --git a/src/meteole/__init__.py b/src/meteole/__init__.py index 3d093e8..1d4015f 100644 --- a/src/meteole/__init__.py +++ b/src/meteole/__init__.py @@ -1,4 +1,3 @@ -import logging from importlib.metadata import version from meteole._arome import AromeForecast @@ -8,21 +7,3 @@ __all__ = ["AromeForecast", "ArpegeForecast", "Vigilance"] __version__ = version("meteole") - - -def setup_logger(): - """Setup logger with proper StreamHandler and formatter""" - logger = logging.getLogger(__name__) - logger.setLevel(logging.INFO) - - handler = logging.StreamHandler() - handler.setLevel(logging.INFO) - - # formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') - formatter = logging.Formatter("%(message)s") - handler.setFormatter(formatter) - - return logger.addHandler(handler) - - -logger = setup_logger() diff --git a/src/meteole/_arome.py b/src/meteole/_arome.py index 145bb17..5600c23 100644 --- a/src/meteole/_arome.py +++ b/src/meteole/_arome.py @@ -1,16 +1,10 @@ -"""The interface for the observational data from the meteo-France API. - -See : -- https://portail-api.meteofrance.fr/web/fr/api/arome -""" - from __future__ import annotations import logging from typing import final from meteole.clients import BaseClient, MeteoFranceClient -from meteole.forecast import Forecast +from meteole.forecast import WeatherForecast logger = logging.getLogger(__name__) @@ -50,8 +44,17 @@ @final -class AromeForecast(Forecast): - """Access the AROME numerical forecast data.""" +class AromeForecast(WeatherForecast): + """Access the AROME numerical weather forecast data from Meteo-France API. + + Doc: + - https://portail-api.meteofrance.fr/web/fr/api/arome + + Attributes: + territory: Covered area (e.g., FRANCE, ANTIL, ...). + precision: Precision value of the forecast. + capabilities: DataFrame containing details on all available coverage ids. + """ # Model constants MODEL_NAME: str = "arome" @@ -62,9 +65,14 @@ class AromeForecast(Forecast): DEFAULT_PRECISION: float = 0.01 CLIENT_CLASS: type[BaseClient] = MeteoFranceClient - def _validate_parameters(self): - """Assert the parameters are valid.""" + def _validate_parameters(self) -> None: + """Check the territory and the precision parameters. + + Raise: + ValueError: At least, one parameter is not good. + """ if self.precision not in [0.01, 0.025]: raise ValueError("Parameter `precision` must be in (0.01, 0.025). It is inferred from argument `territory`") + if self.territory not in AVAILABLE_AROME_TERRITORY: raise ValueError(f"Parameter `territory` must be in {AVAILABLE_AROME_TERRITORY}") diff --git a/src/meteole/_arpege.py b/src/meteole/_arpege.py index f676c45..3616203 100644 --- a/src/meteole/_arpege.py +++ b/src/meteole/_arpege.py @@ -1,15 +1,9 @@ -"""The interface for the observational data from the meteo-France API. - -See : -- https://portail-api.meteofrance.fr/web/fr/api/arpege -""" - from __future__ import annotations from typing import Any, final from meteole.clients import BaseClient, MeteoFranceClient -from meteole.forecast import Forecast +from meteole.forecast import WeatherForecast AVAILABLE_ARPEGE_TERRITORY: list[str] = ["EUROPE", "GLOBE", "ATOURX", "EURAT"] @@ -68,8 +62,17 @@ @final -class ArpegeForecast(Forecast): - """Access the ARPEGE numerical forecast data.""" +class ArpegeForecast(WeatherForecast): + """Access the ARPEGE numerical weather forecast data from Meteo-France API. + + Doc: + - https://portail-api.meteofrance.fr/web/fr/api/arpege + + Attributes: + territory: Covered area (e.g., FRANCE, ANTIL, ...). + precision: Precision value of the forecast. + capabilities: DataFrame containing details on all available coverage ids. + """ # Model constants MODEL_NAME: str = "arpege" @@ -87,24 +90,20 @@ def __init__( territory: str = "EUROPE", **kwargs: Any, ): - """ - Initializes an ArpegeForecast object for accessing ARPEGE forecast data. + """Initializes an ArpegeForecast object. The `precision` of the forecast is inferred from the specified `territory`. Args: - territory (str, optional): The ARPEGE territory to fetch. Defaults to "EUROPE". - api_key (str | None, optional): The API key for authentication. Defaults to None. - token (str | None, optional): The API token for authentication. Defaults to None. - application_id (str | None, optional): The Application ID for authentication. Defaults to None. - cache_dir (str | None, optional): Path to the cache directory. Defaults to None. - If not provided, the cache directory is set to "/tmp/cache". + territory: The ARPEGE territory to fetch. Defaults to "EUROPE". + api_key: The API key for authentication. Defaults to None. + token: The API token for authentication. Defaults to None. + application_id: The Application ID for authentication. Defaults to None. Notes: - See `MeteoFranceClient` for additional details on the parameters `api_key`, `token`, and `application_id`. - Available territories are listed in the `AVAILABLE_TERRITORY` constant. - """ super().__init__( client=client, @@ -113,7 +112,11 @@ def __init__( **kwargs, ) - def _validate_parameters(self): - """Assert the parameters are valid.""" + def _validate_parameters(self) -> None: + """Check the territory and the precision parameters. + + Raise: + ValueError: At least, one parameter is not good. + """ if self.territory not in AVAILABLE_ARPEGE_TERRITORY: raise ValueError(f"The parameter precision must be in {AVAILABLE_ARPEGE_TERRITORY}") diff --git a/src/meteole/_vigilance.py b/src/meteole/_vigilance.py index 0216013..6f5b695 100644 --- a/src/meteole/_vigilance.py +++ b/src/meteole/_vigilance.py @@ -17,14 +17,13 @@ @final class Vigilance: - """Wrapper around the meteo-France API for the vigilance data. - Ressources are: + """Easy access to the vigilance data of Meteo-France. + + Resources are: - textesvigilance - cartevigilance - Documentation - ------------- - See: + Docs: - https://portail-api.meteofrance.fr/web/fr/api/DonneesPubliquesVigilance - https://donneespubliques.meteofrance.fr/client/document/descriptiftechnique_vigilancemetropole_ donneespubliques_v4_20230911_307.pdf @@ -49,7 +48,7 @@ def __init__( client: BaseClient | None = None, **kwargs: Any, ) -> None: - """TODO""" + """Initialize attributes""" if client is not None: self._client = client else: @@ -57,11 +56,10 @@ def __init__( self._client = MeteoFranceClient(**kwargs) def get_bulletin(self) -> dict[str, Any]: - """ - Retrieve the vigilance bulletin. + """Retrieve the vigilance bulletin. Returns: - dict: a Dict representing the vigilance bulletin + Dictionary representing the vigilance bulletin """ path: str = self.VIGILANCE_BASE_PATH + self.API_VERSION + "/textesvigilance/encours" @@ -72,7 +70,7 @@ def get_bulletin(self) -> dict[str, Any]: return resp.json() except MissingDataError as e: - if "no matching blob" in e.message: + if "no matching blob" in str(e): logger.warning("Ongoing vigilance requires no publication") else: logger.error(f"Unexpected error: {e}") @@ -82,11 +80,10 @@ def get_bulletin(self) -> dict[str, Any]: return {} def get_map(self) -> dict[str, Any]: - """ - Get the vigilance map with predicted risk displayed. + """Get the vigilance map with predicted risk displayed. Returns: - dict: a Dict with the predicted risk. + Dictionary with the predicted risk. """ path: str = self.VIGILANCE_BASE_PATH + self.API_VERSION + "/cartevigilance/encours" logger.debug(f"GET {path}") @@ -96,12 +93,12 @@ def get_map(self) -> dict[str, Any]: return resp.json() def get_phenomenon(self) -> tuple[pd.DataFrame, pd.DataFrame]: - """ - Get risk prediction by phenomenon and by domain. + """Get risk prediction by phenomenon and by domain. Returns: - pd.DataFrame: a DataFrame with phenomenon by id - pd.DataFrame: a DataFrame with phenomenon by domain + Tuple of: + A DataFrame with phenomenon by id + A DataFrame with phenomenon by domain """ df_carte = pd.DataFrame(self.get_map()) periods_data = df_carte.loc["periods", "product"] @@ -128,9 +125,7 @@ def get_phenomenon(self) -> tuple[pd.DataFrame, pd.DataFrame]: return df_phenomenon, df_timelaps def get_vignette(self) -> None: - """ - Get png. - """ + """Get png file.""" path: str = self.VIGILANCE_BASE_PATH + self.API_VERSION + "/vignettenationale-J-et-J1/encours" logger.debug(f"GET {path}") diff --git a/src/meteole/clients.py b/src/meteole/clients.py index 698b323..2e51104 100644 --- a/src/meteole/clients.py +++ b/src/meteole/clients.py @@ -20,24 +20,36 @@ class HttpStatus(int, Enum): """Http status codes""" - OK: int = 200 - BAD_REQUEST: int = 400 - UNAUTHORIZED: int = 401 - FORBIDDEN: int = 403 - NOT_FOUND: int = 404 - TOO_MANY_REQUESTS: int = 429 - INTERNAL_ERROR: int = 500 - BAD_GATEWAY: int = 502 - UNAVAILABLE: int = 503 - GATEWAY_TIMEOUT: int = 504 + OK = 200 + BAD_REQUEST = 400 + UNAUTHORIZED = 401 + FORBIDDEN = 403 + NOT_FOUND = 404 + TOO_MANY_REQUESTS = 429 + INTERNAL_ERROR = 500 + BAD_GATEWAY = 502 + UNAVAILABLE = 503 + GATEWAY_TIMEOUT = 504 class BaseClient(ABC): - """TODO""" + """(Abstract) + + Base class for weather forecast provider clients. + """ @abstractmethod def get(self, path: str, *, params: dict[str, Any] | None = None, max_retries: int = 5) -> Response: - """TODO""" + """Retrieve some data with retry capability. + + Args: + path: Path to a resource. + params: The query parameters of the request. + max_retries: The maximum number of retry attempts in case of failure. + + Returns: + The response returned by the API. + """ raise NotImplementedError @@ -46,17 +58,11 @@ class MeteoFranceClient(BaseClient): This class handles the connection setup and token refreshment required for authenticating and making requests to the Meteo France API. - - Attributes: - api_key (str | None): The API key for accessing the Meteo France API. - token (str | None): The authentication token for accessing the API. - application_id (str | None): The application ID used for identification. - verify (Path | None): The path to a file or directory of trusted CA certificates for SSL verification. """ # Class constants API_BASE_URL: str = "https://public-api.meteofrance.fr/public/" - TOKEN_URL: str = "https://portail-api.meteofrance.fr/token" + TOKEN_URL: str = "https://portail-api.meteofrance.fr/token" # noqa: S105 GET_TOKEN_TIMEOUT_SEC: int = 10 INVALID_JWT_ERROR_CODE: str = "900901" RETRY_DELAY_SEC: int = 10 @@ -70,13 +76,13 @@ def __init__( certs_path: Path | None = None, ) -> None: """ - Initializes the MeteoFranceClient object. + Initialize attributes. Args: - api_key (str | None): The API key for accessing the Meteo France API. - token (str | None): The authentication token for accessing the API. - application_id (str | None): The application ID used for identification. - verify (Path | None): The path to a file or directory of trusted CA certificates for SSL verification. + token: The authentication token for accessing the API. + api_key: The API key for accessing the Meteo France API. + application_id: The application ID used for identification. + certs_path: The path to a file or directory of trusted CA certificates for SSL verification. """ self._token = token self._api_key = api_key @@ -92,16 +98,15 @@ def __init__( def get(self, path: str, *, params: dict[str, Any] | None = None, max_retries: int = 5) -> Response: """ - Makes a GET request to the API with optional retries. + Make a GET request to the API with optional retries. Args: - url (str): The URL to send the GET request to. - params (dict, optional): The query parameters to include in the request. Defaults to None. - max_retries (int, optional): The maximum number of retry attempts in case of failure. Defaults to 5. + path: Path to a resource. + params: The query parameters of the request. + max_retries: The maximum number of retry attempts in case of failure. Returns: - requests.Response: The response returned by the API. - + The response returned by the API. """ url: str = self.API_BASE_URL + path attempt: int = 0 @@ -157,8 +162,10 @@ def get(self, path: str, *, params: dict[str, Any] | None = None, max_retries: i raise GenericMeteofranceApiError(f"Failed to get a successful response from API after {attempt} retries") def _connect(self): - """Connect to the MeteoFrance API. + """(Protected) + Connect to the Meteo-France API. + Note: If the API key is provided, it is used to authenticate the user. If the token is provided, it is used to authenticate the user. If the application ID is provided, a token is requested from the API. @@ -183,11 +190,15 @@ def _connect(self): self._session.headers.update({"Authorization": f"Bearer {self._token}"}) def _get_token(self) -> str: - """request a token from the meteo-France API. + """(Protected) + Request a token from the Meteo-France API. The token lasts 1 hour, and is used to authenticate the user. If a new token is requested before the previous one expires, the previous one is invalidated. A local cache is used to avoid requesting a new token at each run of the script. + + Rerturns: + A JWT. """ if self._token_expired is False and self._token is not None: # Use cached token @@ -216,11 +227,13 @@ def _get_token(self) -> str: return token def _is_token_expired(self, response: Response) -> bool: - """Check if the token is expired. + """(Protected) + Check if the token is expired. - Returns - ------- - bool + Args: + response: A request's response from the API. + + Returns: True if the token is expired, False otherwise. """ result: bool = False diff --git a/src/meteole/errors.py b/src/meteole/errors.py index ebb8527..e596eb7 100644 --- a/src/meteole/errors.py +++ b/src/meteole/errors.py @@ -1,53 +1,61 @@ +"""Error implementations""" + from __future__ import annotations +from typing import Any, MutableMapping + import xmltodict class GenericMeteofranceApiError(Exception): - """Exception raised errors in the input parameters where a required field is missing. + """Exception raised when a required field is missing in the input parameters. Args: - message (str): Human-readable string descipting the exceptetion. - description (str): More detailed description of the error.""" + message: Human-readable string describing the exception. + description: More detailed description of the error. + """ - def init(self, text: str) -> None: + def __init__(self, text: str) -> None: """Initialize the exception with an error message parsed from an XML string. Args: - text (str): XML string containing the error details, + text: XML string containing the error details, expected to follow a specific schema with 'am:fault' as the root element and 'am:message' and 'am:description' as child elements.""" + try: + # Parse error message with xmltodict + data: MutableMapping[str, Any] = xmltodict.parse(text) + msg_content: str = data["am:fault"]["am:message"] + description: str = data["am:fault"]["am:description"] + message: str = f"{msg_content}\n {description}" + except Exception: + message = text - # parse the error message with xmltodict - data = xmltodict.parse(text) - message = data["am:fault"]["am:message"] - description = data["am:fault"]["am:description"] - self.message = f"{message}\n {description}" - super().__init__(self.message) + super().__init__(message) class MissingDataError(Exception): """Exception raised errors in the input data is missing""" - def init(self, text: str) -> None: + def __init__(self, text: str) -> None: """Initialize the exception with an error message parsed from an XML string. Args: - text (str): XML string containing the error details, + text: XML string containing the error details, expected to follow a specific schema with 'am:fault' as the root element and 'am:message' and 'am:description' as child elements.""" - # parse the error message with xmltodict try: - data = xmltodict.parse(text) - exception = data["mw:fault"]["mw:description"]["ns0:ExceptionReport"]["ns0:Exception"] - code = exception["@exceptionCode"] - locator = exception["@locator"] - exception_text = exception["ns0:ExceptionText"] - message = f"Error code: {code}\nLocator: {locator}\nText: {exception_text}" + # Parse error message with xmltodict + data: MutableMapping[str, Any] = xmltodict.parse(text) + exception: dict[Any, Any] = data["mw:fault"]["mw:description"]["ns0:ExceptionReport"]["ns0:Exception"] + code: str = exception["@exceptionCode"] + locator: str = exception["@locator"] + exception_text: str = exception["ns0:ExceptionText"] + message: str = f"Error code: {code}\nLocator: {locator}\nText: {exception_text}" except Exception: message = text - self.message = message - super().__init__(self.message) + + super().__init__(message) diff --git a/src/meteole/forecast.py b/src/meteole/forecast.py index cfb9400..04aa745 100644 --- a/src/meteole/forecast.py +++ b/src/meteole/forecast.py @@ -20,14 +20,17 @@ logger = logging.getLogger(__name__) -class Forecast(ABC): - """(Abstract class) - Provides a unified interface to query AROME and ARPEGE endpoints - - Attributes - ---------- - capabilities: pandas.DataFrame - coverage dataframe containing the details of all available coverage_ids +class WeatherForecast(ABC): + """(Abstract) + Base class for weather forecast models. + + Note: Currently, this class is highly related to Meteo-France models. + This will not be the case in the future. + + Attributes: + territory: Covered area (e.g., FRANCE, ANTIL, ...). + precision: Precision value of the forecast. + capabilities: DataFrame containing details on all available coverage ids. """ # Class constants @@ -54,7 +57,14 @@ def __init__( precision: float = DEFAULT_PRECISION, **kwargs: Any, ): - """Init the Forecast object.""" + """Initialize attributes. + + Args: + territory: The ARPEGE territory to fetch. + api_key: The API key for authentication. Defaults to None. + token: The API token for authentication. Defaults to None. + application_id: The Application ID for authentication. Defaults to None. + """ self.territory = territory # "FRANCE", "ANTIL", or others (see API doc) self.precision = precision self._validate_parameters() @@ -73,14 +83,26 @@ def __init__( @property def capabilities(self) -> pd.DataFrame: - """TODO""" + """Getter method of the capabilities attribute. + + Returns: + DataFrame of details on all available coverage ids. + """ if self._capabilities is None: self._capabilities = self._build_capabilities() return self._capabilities @property - def indicators(self) -> pd.DataFrame: - """TODO""" + def indicators(self) -> list[str]: + """Getter method of the indicators. + + Indicators are identifying the kind of a predicted value (i.e., measurement). + + Warning: This method is deprecated as INDICATORS is now a class constant. + + Returns: + List of covered indicators. + """ warn( "The 'indicators' attribute is deprecated, it will be removed soon. " "Use 'INDICATORS' instead (class constant).", @@ -90,35 +112,42 @@ def indicators(self) -> pd.DataFrame: return self.INDICATORS @abstractmethod - def _validate_parameters(self): - """Assert parameters are valid.""" - pass + def _validate_parameters(self) -> None: + """Check the territory and the precision parameters. + + Raise: + ValueError: At least, one parameter is not good. + """ + raise NotImplementedError def get_capabilities(self) -> pd.DataFrame: - "Returns the coverage dataframe containing the details of all available coverage_ids" + """Explicit "getter method" of the capabilities attribute. + + Returns: + DataFrame of details on all available coverage ids. + """ return self.capabilities - def get_coverage_description(self, coverage_id: str) -> dict: - """This endpoint returns the available axis (times, heights) to properly query coverage + def get_coverage_description(self, coverage_id: str) -> dict[str, Any]: + """Return the available axis (times, heights) of a coverage. - TODO: other informations can be fetched from this endpoint, not yet implemented. + TODO: Other informations can be fetched, not yet implemented. Args: - coverage_id (str): use :meth:`get_capabilities()` to list all available coverage_id - """ + coverage_id: An id of a coverage, use get_capabilities() to get them. - # Get coverage description + Returns: + A dictionary containing more info on the coverage. + """ description = self._get_coverage_description(coverage_id) grid_axis = description["wcs:CoverageDescriptions"]["wcs:CoverageDescription"]["gml:domainSet"][ "gmlrgrid:ReferenceableGridByVectors" ]["gmlrgrid:generalGridAxis"] return { - "forecast_horizons": [ - int(time / 3600) for time in self.__class__._get_available_feature(grid_axis, "time") - ], - "heights": self.__class__._get_available_feature(grid_axis, "height"), - "pressures": self.__class__._get_available_feature(grid_axis, "pressure"), + "forecast_horizons": [int(time / 3600) for time in self._get_available_feature(grid_axis, "time")], + "heights": self._get_available_feature(grid_axis, "height"), + "pressures": self._get_available_feature(grid_axis, "pressure"), } def get_coverage( @@ -133,24 +162,30 @@ def get_coverage( interval: str | None = None, coverage_id: str = "", ) -> pd.DataFrame: - """Returns the data associated with the coverage_id for the selected parameters. + """Return the coverage data (i.e., the weather forecast data). Args: - coverage_id (str): coverage_id, get the list using :meth:`get_capabilities` - lat (tuple): minimum and maximum latitude - long (tuple): minimum and maximum longitude - heights (list): heights in meters - pressures (list): pressures in hPa - forecast_horizons (list): list of integers, representing the forecast horizon in hours + indicator: Indicator of a coverage to retrieve. + lat: Minimum and maximum latitude. + long: Minimum and maximum longitude. + heights: Heights in meters. + pressures: Pressures in hPa. + forecast_horizons: List of integers, representing the forecast horizons in hours. + run: The model inference timestamp. If None, defaults to the latest available run. + Expected format: "YYYY-MM-DDTHH:MM:SSZ". + interval: The aggregation period. Must be None for instant indicators; + raises an error if specified. Defaults to "P1D" for time-aggregated indicators such + as TOTAL_PRECIPITATION. + coverage_id: An id of a coverage, use get_capabilities() to get them. Returns: pd.DataFrame: The complete run for the specified execution. """ - # ensure we only have one of coverage_id, indicator + # Ensure we only have one of coverage_id, indicator if not bool(indicator) ^ bool(coverage_id): raise ValueError("Argument `indicator` or `coverage_id` need to be set (only one of them)") - if indicator: + if indicator is not None: coverage_id = self._get_coverage_id(indicator, run, interval) logger.info(f"Using `coverage_id={coverage_id}`") @@ -180,7 +215,12 @@ def get_coverage( return pd.concat(df_list, axis=0).reset_index(drop=True) def _build_capabilities(self) -> pd.DataFrame: - "Returns the coverage dataframe containing the details of all available coverage_ids" + """(Protected) + Fetch and build the model capabilities. + + Returns: + DataFrame all the details. + """ logger.info("Fetching all available coverages...") @@ -222,14 +262,14 @@ def _get_coverage_id( run: str | None = None, interval: str | None = None, ) -> str: - """ - Retrieves a `coverage_id` from the capabilities based on the provided parameters. + """(Protected) + Retrieve a `coverage_id` from the capabilities based on the provided parameters. Args: - indicator (str): The indicator to retrieve. This parameter is required. - run (str | None, optional): The model inference timestamp. If None, defaults to the latest available run. + indicator: The indicator to retrieve. This parameter is required. + run: The model inference timestamp. If None, defaults to the latest available run. Expected format: "YYYY-MM-DDTHH:MM:SSZ". Defaults to None. - interval (str | None, optional): The aggregation period. Must be None for instant indicators; + interval: The aggregation period. Must be None for instant indicators; raises an error if specified. Defaults to "P1D" for time-aggregated indicators such as TOTAL_PRECIPITATION. @@ -292,7 +332,8 @@ def _get_coverage_id( def _raise_if_invalid_or_fetch_default( self, param_name: str, inputs: list[int] | None, availables: list[int] ) -> list[int]: - """Checks validity of `inputs`. + """(Protected) + Checks validity of `inputs`. Checks if the elements in `inputs` are in `availables` and raises a ValueError if not. If `inputs` is empty or None, uses the first element from `availables` as the default value. @@ -320,8 +361,12 @@ def _raise_if_invalid_or_fetch_default( logger.info(f"Using `{param_name}={inputs}`") return inputs - def _fetch_capabilities(self) -> dict: - """The Capabilities of the AROME/ARPEGE service.""" + def _fetch_capabilities(self) -> dict[Any, Any]: + """Fetch the model capabilities. + + Returns: + Raw capabilities (dictionary). + """ url = f"{self._model_base_path}/{self._entry_point}/GetCapabilities" params = { @@ -346,10 +391,11 @@ def _fetch_capabilities(self) -> dict: logger.error(f"Response: {xml}") raise e - def _get_coverage_description(self, coverage_id: str) -> dict: - """Get the description of a coverage. + def _get_coverage_description(self, coverage_id: str) -> dict[Any, Any]: + """(Protected) + Get the description of a coverage. - .. warning:: + Warning: The return value is the raw XML data. Not yet parsed to be usable. In the future, it should be possible to use it to @@ -372,7 +418,12 @@ def _get_coverage_description(self, coverage_id: str) -> dict: return xmltodict.parse(response.text) def _transform_grib_to_df(self) -> pd.DataFrame: - "Transform grib file into pandas dataframe" + """(Protected) + Transform grib file into pandas dataframe. + + Returns: + DataFrame of the read data. + """ ds = xr.open_dataset(self.filepath, engine="cfgrib") df = ds.to_dataframe().reset_index() @@ -387,7 +438,8 @@ def _get_data_single_forecast( lat: tuple, long: tuple, ) -> pd.DataFrame: - """Returns the forecasts for a given time and indicator. + """(Protected) + Return the forecast's data for a given time and indicator. Args: coverage_id (str): the indicator. @@ -496,8 +548,8 @@ def _get_coverage_file( file_format: str = "grib", filepath: Path | None = None, ) -> Path: - """ - Retrieves raster data for a specified model prediction and saves it to a file. + """(Protected) + Retrieve raster data for a specified model prediction and saves it to a file. If no `filepath` is provided, the file is saved to a default cache directory under the current working directory. @@ -565,14 +617,28 @@ def _get_coverage_file( return self.filepath @staticmethod - def _get_available_feature(grid_axis, feature_name): - features = [] - feature_grid_axis = [ - ax for ax in grid_axis if ax["gmlrgrid:GeneralGridAxis"]["gmlrgrid:gridAxesSpanned"] == feature_name + def _get_available_feature(grid_axis: list[dict[str, Any]], feature_name: str) -> list[int]: + """(Protected) + Retrieve available features. + + TODO: add more details here. + + Args: + grid_axis: ? + feature_name: ? + + Returns: + List of available feature. + """ + feature_grid_axis: list[dict[str, Any]] = [ + ax for ax in grid_axis if str(ax["gmlrgrid:GeneralGridAxis"]["gmlrgrid:gridAxesSpanned"]) == feature_name ] - if feature_grid_axis: - features = feature_grid_axis[0]["gmlrgrid:GeneralGridAxis"]["gmlrgrid:coefficients"].split(" ") - features = [int(feature) for feature in features] + + features: list[int] = ( + list(map(int, feature_grid_axis[0]["gmlrgrid:GeneralGridAxis"]["gmlrgrid:coefficients"].split(" "))) + if len(feature_grid_axis) > 0 + else [] + ) return features def get_combined_coverage( @@ -598,8 +664,9 @@ def get_combined_coverage( runs (list[str]): A list of runs for each indicator. Format should be "YYYY-MM-DDTHH:MM:SSZ". heights (list[int] | None): A list of heights in meters to filter by (default is None). pressures (list[int] | None): A list of pressures in hPa to filter by (default is None). - intervals (list[str] | None): A list of aggregation periods (default is None). Must be `None` or "" for instant indicators; - otherwise, raises an exception. Defaults to 'P1D' for time-aggregated indicators. + intervals (list[str] | None): A list of aggregation periods (default is None). + Must be `None` or "" for instant indicators ; otherwise, raises an exception. + Defaults to 'P1D' for time-aggregated indicators. lat (tuple): The latitude range as (min_latitude, max_latitude). Defaults to FRANCE_METRO_LATITUDES. long (tuple): The longitude range as (min_longitude, max_longitude). Defaults to FRANCE_METRO_LONGITUDES. forecast_horizons (list[int] | None): A list of forecast horizon values in hours. Defaults to None. @@ -609,9 +676,8 @@ def get_combined_coverage( Raises: ValueError: If the length of `heights` does not match the length of `indicator_names`. - """ - if not runs: + if runs is None: runs = [None] coverages = [ self._get_combined_coverage_for_single_run( @@ -639,7 +705,7 @@ def _get_combined_coverage_for_single_run( long: tuple = FRANCE_METRO_LONGITUDES, forecast_horizons: list[int] | None = None, ) -> pd.DataFrame: - """ + """(Protected) Get a combined DataFrame of coverage data for a given run considering a list of indicators. This method retrieves and aggregates coverage data for specified indicators, with options @@ -651,8 +717,9 @@ def _get_combined_coverage_for_single_run( run (str): A single runs for each indicator. Format should be "YYYY-MM-DDTHH:MM:SSZ". heights (list[int] | None): A list of heights in meters to filter by (default is None). pressures (list[int] | None): A list of pressures in hPa to filter by (default is None). - intervals (Optional[list[str]]): A list of aggregation periods (default is None). Must be `None` or "" for instant indicators; - otherwise, raises an exception. Defaults to 'P1D' for time-aggregated indicators. + intervals (Optional[list[str]]): A list of aggregation periods (default is None). + Must be `None` or "" for instant indicators ; otherwise, raises an exception. + Defaults to 'P1D' for time-aggregated indicators. lat (tuple): The latitude range as (min_latitude, max_latitude). Defaults to FRANCE_METRO_LATITUDES. long (tuple): The longitude range as (min_longitude, max_longitude). Defaults to FRANCE_METRO_LONGITUDES. forecast_horizons (list[int] | None): A list of forecast horizon values in hours. Defaults to None. @@ -662,16 +729,29 @@ def _get_combined_coverage_for_single_run( Raises: ValueError: If the length of `heights` does not match the length of `indicator_names`. - """ - def _check_params_length(params: list | None, arg_name: str) -> list: - """assert length is ok or raise""" + def _check_params_length(params: list[Any] | None, arg_name: str) -> list[Any]: + """(Protected) + Assert length is ok or raise an error. + + Args: + params: list of parameters. + arg_name: argument name. + + Returns: + The given parameters unchanged. + + Raises: + ValueError: The length of {arg_name} must match the length of indicator_names. + """ if params is None: return [None] * len(indicator_names) if len(params) != len(indicator_names): raise ValueError( - f"The length of {arg_name} must match the length of indicator_names. If you want multiple {arg_name} for a single indicator, create multiple entries in `indicator_names`." + f"The length of {arg_name} must match the length of indicator_names." + f" If you want multiple {arg_name} for a single indicator, create multiple" + " entries in `indicator_names`." ) return params @@ -719,14 +799,16 @@ def _check_params_length(params: list | None, arg_name: str) -> list: ) def _get_forecast_horizons(self, coverage_ids: list[str]) -> list[list[int]]: - """ + """(Protected) Retrieve the times for each coverage_id. - Parameters: - coverage_ids (list[str]): List of coverage IDs. + + Args: + coverage_ids: List of coverage IDs. + Returns: - list[list[int]]: List of times for each coverage ID. + List of times for each coverage ID. """ - indicator_times = [] + indicator_times: list[list[int]] = [] for coverage_id in coverage_ids: times = self.get_coverage_description(coverage_id)["forecast_horizons"] indicator_times.append(times) @@ -736,13 +818,16 @@ def find_common_forecast_horizons( self, list_coverage_id: list[str], ) -> list[int]: - """ - Find common forecast_horizons among coverage IDs. - indicator_names (list[str]): List of indicator names. - run (Optional[str]): Identifies the model inference. Defaults to latest if None. Format "YYYY-MM-DDTHH:MM:SSZ". - intervals (Optional[list[str]]): List of aggregation periods. Must be None for instant indicators, otherwise raises. Defaults to P1D for time-aggregated indicators like TOTAL_PRECIPITATION. + """Find common forecast_horizons among coverage IDs. + + Args: + indicator_names: List of indicator names. + run: Identifies the model inference. Defaults to latest if None. Format "YYYY-MM-DDTHH:MM:SSZ". + intervals: List of aggregation periods. Must be None for instant indicators, otherwise raises. + Defaults to P1D for time-aggregated indicators like TOTAL_PRECIPITATION. + Returns: - list[int]: Common forecast_horizons + List of common forecast_horizons. """ indicator_forecast_horizons = self._get_forecast_horizons(list_coverage_id) @@ -757,13 +842,15 @@ def find_common_forecast_horizons( return sorted(common_forecast_horizons) def _validate_forecast_horizons(self, coverage_ids: list[str], forecast_horizons: list[int]) -> list[str]: - """ + """(Protected) Validate forecast_horizons for a list of coverage IDs. - Parameters: - coverage_ids (list[str]): List of coverage IDs. - forecast_horizons (list[int]): List of time forecasts to validate. + + Args: + coverage_ids: List of coverage IDs. + forecast_horizons: List of time forecasts to validate. + Returns: - list[str]: List of invalid coverage IDs. + List of invalid coverage IDs. """ indicator_forecast_horizons = self._get_forecast_horizons(coverage_ids) From fe24786ac788d024fd3e7ec99f07ec7adf1718cb Mon Sep 17 00:00:00 2001 From: develop-cs <43383361+develop-cs@users.noreply.github.com> Date: Fri, 10 Jan 2025 12:26:55 +0100 Subject: [PATCH 2/3] chore: update coverage Signed-off-by: develop-cs <43383361+develop-cs@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a69c61b..fcf73e0 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@

CI - Coverage + Coverage Versions Python Downloads From 27e9d6fa9290255bfef3b7957e7a2d3558c95007 Mon Sep 17 00:00:00 2001 From: develop-cs <43383361+develop-cs@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:58:13 +0100 Subject: [PATCH 3/3] docs: fix favicon Signed-off-by: develop-cs <43383361+develop-cs@users.noreply.github.com> --- docs/mkdocs.yaml | 2 +- docs/pages/assets/img/png/meteole-git.png | Bin 0 -> 101410 bytes docs/pages/assets/img/svg/meteole-git.svg | 1 - 3 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 docs/pages/assets/img/png/meteole-git.png delete mode 100644 docs/pages/assets/img/svg/meteole-git.svg diff --git a/docs/mkdocs.yaml b/docs/mkdocs.yaml index e58cfb0..3a867ce 100644 --- a/docs/mkdocs.yaml +++ b/docs/mkdocs.yaml @@ -7,7 +7,7 @@ docs_dir: pages theme: name: material logo: assets/img/svg/meteole-fond-clair.svg - favicon: assets/img/svg/meteole-git.svg + favicon: assets/img/png/meteole-git.png palette: # Palette toggle for automatic mode - media: "(prefers-color-scheme)" diff --git a/docs/pages/assets/img/png/meteole-git.png b/docs/pages/assets/img/png/meteole-git.png new file mode 100644 index 0000000000000000000000000000000000000000..25f7bc42113642a01217c4003b17baf88ba12d81 GIT binary patch literal 101410 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

KmJ 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 T&QxgRyZ|n*ExzPp66@4|*s@#y literal 0 HcmV?d00001 diff --git a/docs/pages/assets/img/svg/meteole-git.svg b/docs/pages/assets/img/svg/meteole-git.svg deleted file mode 100644 index 552bbfb..0000000 --- a/docs/pages/assets/img/svg/meteole-git.svg +++ /dev/null @@ -1 +0,0 @@ -This attachment was removed because it contains data that could pose a security risk. \ No newline at end of file