Skip to content

Commit

Permalink
Merge pull request #56 from paul-florentin-charles/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
paul-florentin-charles committed Jan 31, 2024
2 parents cc52fe7 + b3cd72f commit b39e782
Show file tree
Hide file tree
Showing 13 changed files with 97 additions and 85 deletions.
4 changes: 2 additions & 2 deletions app.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ def monthly_averages() -> Response:
params: tuple = parse_args(request.args, param.file_name)

all_rainfall.bar_rainfall_averages()
plt.savefig(params[0])
plt.savefig(params[0], format="svg")
plt.close()

return send_file(params[0], mimetype=MediaType.IMG_SVG, as_attachment=True)
Expand All @@ -276,7 +276,7 @@ def seasonal_averages() -> Response:
params: tuple = parse_args(request.args, param.file_name)

all_rainfall.bar_rainfall_averages(monthly=False)
plt.savefig(params[0])
plt.savefig(params[0], format="svg")
plt.close()

return send_file(params[0], mimetype=MediaType.IMG_SVG, as_attachment=True)
Expand Down
File renamed without changes.
18 changes: 10 additions & 8 deletions src/api/schemas.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
"""
Provides a bunch of Marshmallow Schemas to validate rainfall data processed through the API.
"""
from __future__ import annotations

from http import HTTPStatus
from typing import Optional, Union
from typing import Union

from flasgger import Schema, fields

import src.api.swagger.parameters_specs as param
from src.core.utils.enums.months import Month
from src.core.utils.enums.seasons import Season
from src.core.utils.enums.time_modes import TimeMode
import src.api.swagger.parameters_specs as param


class BaseSchema(Schema):
class BaseRainfallSchema(Schema):
"""
Base schema for depicting a value linked to rainfall data.
It could be either float values or integer values (rainfall/years).
Expand All @@ -22,13 +24,13 @@ class BaseSchema(Schema):
name: str = fields.Str()
value: Union[float, int] = fields.Number()
begin_year: int = fields.Int(load_default=param.begin_year["default"])
end_year: Optional[int] = fields.Int(allow_none=True)
end_year: int | None = fields.Int(allow_none=True)
time_mode: TimeMode = fields.Enum(TimeMode, load_default=TimeMode.YEARLY)
month: Optional[Month] = fields.Enum(Month, allow_none=True)
season: Optional[Season] = fields.Enum(Season, allow_none=True)
month: Month | None = fields.Enum(Month, allow_none=True)
season: Season | None = fields.Enum(Season, allow_none=True)


class RainfallSchema(BaseSchema):
class RainfallSchema(BaseRainfallSchema):
"""
Schema for depicting a float value in mm (rainfall value).
"""
Expand All @@ -44,7 +46,7 @@ class RelativeDistanceToRainfallNormalSchema(RainfallSchema):
normal_year: int = fields.Int(load_default=param.normal_year["default"])


class YearsAboveOrBelowNormalSchema(BaseSchema):
class YearsAboveOrBelowNormalSchema(BaseRainfallSchema):
"""
Schema for giving the number of years above or below rainfall normal.
"""
Expand Down
9 changes: 7 additions & 2 deletions src/api/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
"""
Collection of utility functions for API purposes.
"""
from typing import Union, Optional
from __future__ import annotations

from typing import Union

from flask import Response
from werkzeug.datastructures.structures import MultiDict
Expand Down Expand Up @@ -52,7 +54,10 @@ def swagger_type_to_python_type(swagger_type: str) -> Union[type, None]:


def manage_time_mode_errors(
response_dict: dict, time_mode: str, month: Optional[str], season: Optional[str]
response_dict: dict,
time_mode: str,
month: str | None = None,
season: str | None = None,
) -> Union[Response, dict]:
"""
Manage errors related to time mode issues.
Expand Down
14 changes: 8 additions & 6 deletions src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from yaml import safe_load, parser # type: ignore

CONFIG_FNAME: str = "config.yaml"
CONFIG_FNAME: str = "config.yml"


class Config:
Expand Down Expand Up @@ -35,13 +35,15 @@ def get_dataset_url(self) -> str:
:return: The dataset URL as a String.
"""
dataset_url: str = self.yaml_config["base_url"]

yaml_dataset_config: dict = self.yaml_config["dataset"]
dataset_url += f"/dataset/{yaml_dataset_config['id']}"
dataset_url += f"/resource/{yaml_dataset_config['resource_id']}"
dataset_url += f"/download/{yaml_dataset_config['file_name']}"

return dataset_url
return dataset_url + "/".join(
[
f"/dataset/{yaml_dataset_config['id']}",
f"resource/{yaml_dataset_config['resource_id']}",
f"download/{yaml_dataset_config['file_name']}",
]
)

def get_dataset_path(self) -> str:
"""
Expand Down
53 changes: 27 additions & 26 deletions src/core/models/all_rainfall.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
Provides an all-in-one class to manipulate rainfall data for every timeframe.
At a yearly, monthly and seasonal level.
"""
from __future__ import annotations

from pathlib import Path
from typing import Optional, Union
from typing import Union

import pandas as pd

Expand Down Expand Up @@ -87,9 +88,9 @@ def export_all_data_to_csv(self, folder_path="csv_data") -> str:
def export_as_csv(
self,
time_mode: str,
month: Optional[str] = None,
season: Optional[str] = None,
path: Optional[str] = None,
month: str | None = None,
season: str | None = None,
path: str | None = None,
) -> Union[str, None]:
"""
Export the data state of a specific time mode as a CSV.
Expand All @@ -115,10 +116,10 @@ def export_as_csv(
def get_average_rainfall(
self,
time_mode: str,
begin_year: Optional[int] = None,
end_year: Optional[int] = None,
month: Optional[str] = None,
season: Optional[str] = None,
begin_year: int | None = None,
end_year: int | None = None,
month: str | None = None,
season: str | None = None,
) -> Union[float, None]:
"""
Computes Rainfall average for a specific year range and time mode.
Expand Down Expand Up @@ -146,8 +147,8 @@ def get_normal(
self,
time_mode: str,
begin_year: int,
month: Optional[str] = None,
season: Optional[str] = None,
month: str | None = None,
season: str | None = None,
) -> Union[float, None]:
"""
Computes Rainfall normal from a specific year and time mode.
Expand All @@ -168,16 +169,16 @@ def get_normal(
if entity is None:
return entity

return entity.get_normal(begin_year)
return entity.get_normal(begin_year, self.round_precision)

def get_relative_distance_from_normal(
self,
time_mode: str,
normal_year: int,
begin_year: int,
end_year: Optional[int] = None,
month: Optional[str] = None,
season: Optional[str] = None,
end_year: int | None = None,
month: str | None = None,
season: str | None = None,
) -> Union[float, None]:
"""
Computes relative distance to Rainfall normal for a specific year range and time mode.
Expand Down Expand Up @@ -209,9 +210,9 @@ def get_rainfall_standard_deviation(
self,
time_mode: str,
begin_year: int,
end_year: Optional[int] = None,
month: Optional[str] = None,
season: Optional[str] = None,
end_year: int | None = None,
month: str | None = None,
season: str | None = None,
) -> Union[float, None]:
"""
Compute the standard deviation of a column specified by its label within DataFrame
Expand Down Expand Up @@ -243,9 +244,9 @@ def get_years_below_normal(
time_mode: str,
normal_year: int,
begin_year: int,
end_year: Optional[int] = None,
month: Optional[str] = None,
season: Optional[str] = None,
end_year: int | None = None,
month: str | None = None,
season: str | None = None,
) -> Union[int, None]:
"""
Computes the number of years below rainfall normal for a specific year range and time mode.
Expand Down Expand Up @@ -276,9 +277,9 @@ def get_years_above_normal(
time_mode: str,
normal_year: int,
begin_year: int,
end_year: Optional[int] = None,
month: Optional[str] = None,
season: Optional[str] = None,
end_year: int | None = None,
month: str | None = None,
season: str | None = None,
) -> Union[int, None]:
"""
Computes the number of years above rainfall normal for a specific year range and time mode.
Expand Down Expand Up @@ -314,7 +315,7 @@ def get_last_year(self) -> int:

return self.yearly_rainfall.get_last_year()

def bar_rainfall_averages(self, monthly: Optional[bool] = True) -> list:
def bar_rainfall_averages(self, monthly: bool | None = True) -> list:
"""
Plots a bar graphic displaying average rainfall for each month or each season.
Expand All @@ -328,7 +329,7 @@ def bar_rainfall_averages(self, monthly: Optional[bool] = True) -> list:

return plotting.bar_seasonal_rainfall_averages(self.seasonal_rainfalls, label)

def bar_rainfall_linreg_slopes(self, monthly: Optional[bool] = True) -> list:
def bar_rainfall_linreg_slopes(self, monthly: bool | None = True) -> list:
"""
Plots a bar graphic displaying linear regression slope for each month or each season.
Expand All @@ -342,7 +343,7 @@ def bar_rainfall_linreg_slopes(self, monthly: Optional[bool] = True) -> list:
return plotting.bar_seasonal_rainfall_linreg_slopes(self.seasonal_rainfalls)

def get_entity_for_time_mode(
self, time_mode: str, month: Optional[str] = None, season: Optional[str] = None
self, time_mode: str, month: str | None = None, season: str | None = None
) -> Union[YearlyRainfall, MonthlyRainfall, SeasonalRainfall, None]:
"""
Retrieve current entity for specified time mode,
Expand Down
7 changes: 3 additions & 4 deletions src/core/models/monthly_rainfall.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
"""
Provides a rich class to manipulate Monthly Rainfall data.
"""

from typing import Optional
from __future__ import annotations

import pandas as pd

Expand All @@ -19,8 +18,8 @@ def __init__(
self,
raw_data: pd.DataFrame,
month: Month,
start_year: Optional[int] = 1971,
round_precision: Optional[int] = 2,
start_year=1971,
round_precision=2,
):
self.month: Month = month
super().__init__(raw_data, start_year, round_precision)
Expand Down
7 changes: 3 additions & 4 deletions src/core/models/seasonal_rainfall.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
"""
Provides a rich class to manipulate Seasonal Rainfall data.
"""

from typing import Optional
from __future__ import annotations

import pandas as pd

Expand All @@ -19,8 +18,8 @@ def __init__(
self,
raw_data: pd.DataFrame,
season: Season,
start_year: Optional[int] = 1971,
round_precision: Optional[int] = 2,
start_year=1971,
round_precision=2,
):
self.season: Season = season
super().__init__(raw_data, start_year, round_precision)
Expand Down
Loading

0 comments on commit b39e782

Please sign in to comment.