From 522495f4f96bf801e74146fb22a6769695daa67e Mon Sep 17 00:00:00 2001 From: Daley Adrichem Date: Tue, 6 Feb 2024 15:44:12 +0100 Subject: [PATCH] Fix black --- .../object_model/interface/database.py | 158 ++++++++++++------ .../object_model/interface/measures.py | 22 ++- .../object_model/interface/scenarios.py | 3 +- flood_adapt/object_model/interface/site.py | 12 +- tests/test_integrator/test_hazard_run.py | 24 +-- .../interface/test_measures.py | 10 +- 6 files changed, 142 insertions(+), 87 deletions(-) diff --git a/flood_adapt/object_model/interface/database.py b/flood_adapt/object_model/interface/database.py index 522a4c048..c6eab2347 100644 --- a/flood_adapt/object_model/interface/database.py +++ b/flood_adapt/object_model/interface/database.py @@ -23,161 +23,211 @@ class IDatabase(ABC): site: ISite @abstractmethod - def __init__( - self, database_path: Union[str, os.PathLike], site_name: str - ) -> None: ... + def __init__(self, database_path: Union[str, os.PathLike], site_name: str) -> None: + ... @abstractmethod - def get_aggregation_areas(self) -> dict: ... + def get_aggregation_areas(self) -> dict: + ... @abstractmethod - def get_obs_points(self) -> GeoDataFrame: ... + def get_obs_points(self) -> GeoDataFrame: + ... @abstractmethod - def get_property_types(self) -> list: ... + def get_property_types(self) -> list: + ... @abstractmethod - def get_slr_scn_names(self) -> list: ... + def get_slr_scn_names(self) -> list: + ... @abstractmethod - def interp_slr(self, slr_scenario: str, year: float) -> float: ... + def interp_slr(self, slr_scenario: str, year: float) -> float: + ... @abstractmethod - def plot_slr_scenarios(self) -> str: ... + def plot_slr_scenarios(self) -> str: + ... @abstractmethod - def plot_wl(self, event: IEvent, input_wl_df: pd.DataFrame = None) -> str: ... + def plot_wl(self, event: IEvent, input_wl_df: pd.DataFrame = None) -> str: + ... @abstractmethod - def plot_river(self, event: IEvent, input_river_df: list[pd.DataFrame]) -> str: ... + def plot_river(self, event: IEvent, input_river_df: list[pd.DataFrame]) -> str: + ... @abstractmethod def plot_rainfall( self, event: IEvent, input_rainfall_df: pd.DataFrame = None - ) -> str: ... + ) -> str: + ... @abstractmethod - def plot_wind(self, event: IEvent, input_wind_df: pd.DataFrame = None) -> str: ... + def plot_wind(self, event: IEvent, input_wind_df: pd.DataFrame = None) -> str: + ... @abstractmethod - def get_buildings(self) -> GeoDataFrame: ... + def get_buildings(self) -> GeoDataFrame: + ... @abstractmethod - def get_projection(self, name: str) -> IProjection: ... + def get_projection(self, name: str) -> IProjection: + ... @abstractmethod - def save_projection(self, measure: IProjection) -> None: ... + def save_projection(self, measure: IProjection) -> None: + ... @abstractmethod - def edit_projection(self, measure: IProjection) -> None: ... + def edit_projection(self, measure: IProjection) -> None: + ... @abstractmethod - def delete_projection(self, name: str): ... + def delete_projection(self, name: str): + ... @abstractmethod - def copy_projection(self, old_name: str, new_name: str, new_description: str): ... + def copy_projection(self, old_name: str, new_name: str, new_description: str): + ... @abstractmethod - def get_event(self, name: str) -> IEvent: ... + def get_event(self, name: str) -> IEvent: + ... @abstractmethod - def save_event(self, measure: IEvent) -> None: ... + def save_event(self, measure: IEvent) -> None: + ... @abstractmethod - def write_to_csv(self, name: str, event: IEvent, df: pd.DataFrame) -> None: ... + def write_to_csv(self, name: str, event: IEvent, df: pd.DataFrame) -> None: + ... @abstractmethod - def write_cyc(self, event: IEvent, track: TropicalCyclone): ... + def write_cyc(self, event: IEvent, track: TropicalCyclone): + ... @abstractmethod - def edit_event(self, measure: IEvent) -> None: ... + def edit_event(self, measure: IEvent) -> None: + ... @abstractmethod - def delete_event(self, name: str): ... + def delete_event(self, name: str): + ... @abstractmethod - def copy_event(self, old_name: str, new_name: str, new_description: str): ... + def copy_event(self, old_name: str, new_name: str, new_description: str): + ... @abstractmethod - def get_measure(self, name: str) -> IMeasure: ... + def get_measure(self, name: str) -> IMeasure: + ... @abstractmethod - def save_measure(self, measure: IMeasure) -> None: ... + def save_measure(self, measure: IMeasure) -> None: + ... @abstractmethod - def edit_measure(self, measure: IMeasure): ... + def edit_measure(self, measure: IMeasure): + ... @abstractmethod - def delete_measure(self, name: str): ... + def delete_measure(self, name: str): + ... @abstractmethod - def copy_measure(self, old_name: str, new_name: str, new_description: str): ... + def copy_measure(self, old_name: str, new_name: str, new_description: str): + ... @abstractmethod - def get_strategy(self, name: str) -> IStrategy: ... + def get_strategy(self, name: str) -> IStrategy: + ... @abstractmethod - def save_strategy(self, measure: IStrategy) -> None: ... + def save_strategy(self, measure: IStrategy) -> None: + ... @abstractmethod - def delete_strategy(self, name: str): ... + def delete_strategy(self, name: str): + ... @abstractmethod - def get_scenario(self, name: str) -> IScenario: ... + def get_scenario(self, name: str) -> IScenario: + ... @abstractmethod - def save_scenario(self, measure: IScenario) -> None: ... + def save_scenario(self, measure: IScenario) -> None: + ... @abstractmethod - def edit_scenario(self, measure: IScenario) -> None: ... + def edit_scenario(self, measure: IScenario) -> None: + ... @abstractmethod - def delete_scenario(self, name: str): ... + def delete_scenario(self, name: str): + ... @abstractmethod - def get_benefit(self, name: str) -> IBenefit: ... + def get_benefit(self, name: str) -> IBenefit: + ... @abstractmethod - def save_benefit(self, benefit: IBenefit) -> None: ... + def save_benefit(self, benefit: IBenefit) -> None: + ... @abstractmethod - def edit_benefit(self, measure: IBenefit) -> None: ... + def edit_benefit(self, measure: IBenefit) -> None: + ... @abstractmethod - def delete_benefit(self, name: str) -> None: ... + def delete_benefit(self, name: str) -> None: + ... @abstractmethod - def check_benefit_scenarios(self, benefit: IBenefit) -> None: ... + def check_benefit_scenarios(self, benefit: IBenefit) -> None: + ... @abstractmethod - def create_benefit_scenarios(self, benefit: IBenefit) -> None: ... + def create_benefit_scenarios(self, benefit: IBenefit) -> None: + ... @abstractmethod - def run_benefit(self, benefit_name: Union[str, list[str]]) -> None: ... + def run_benefit(self, benefit_name: Union[str, list[str]]) -> None: + ... @abstractmethod - def get_model_boundary(self) -> dict[str, Any]: ... + def get_model_boundary(self) -> dict[str, Any]: + ... @abstractmethod - def get_projections(self) -> dict[str, Any]: ... + def get_projections(self) -> dict[str, Any]: + ... @abstractmethod - def get_events(self) -> dict[str, Any]: ... + def get_events(self) -> dict[str, Any]: + ... @abstractmethod - def get_measures(self) -> dict[str, Any]: ... + def get_measures(self) -> dict[str, Any]: + ... @abstractmethod - def get_strategies(self) -> dict[str, Any]: ... + def get_strategies(self) -> dict[str, Any]: + ... @abstractmethod - def get_scenarios(self) -> dict[str, Any]: ... + def get_scenarios(self) -> dict[str, Any]: + ... @abstractmethod - def get_benefits(self) -> dict[str, Any]: ... + def get_benefits(self) -> dict[str, Any]: + ... @abstractmethod - def get_outputs(self) -> dict[str, Any]: ... + def get_outputs(self) -> dict[str, Any]: + ... @abstractmethod - def run_scenario(self, scenario_name: Union[str, list[str]]) -> None: ... + def run_scenario(self, scenario_name: Union[str, list[str]]) -> None: + ... diff --git a/flood_adapt/object_model/interface/measures.py b/flood_adapt/object_model/interface/measures.py index c38fc58d3..38ea3a2da 100644 --- a/flood_adapt/object_model/interface/measures.py +++ b/flood_adapt/object_model/interface/measures.py @@ -10,7 +10,6 @@ UnitfulLength, UnitfulLengthRefValue, UnitfulVolume, - UnitTypesLength, UnitTypesVolume, ) @@ -74,14 +73,14 @@ def validate_polygon_file( cls, polygon_file: Optional[str], values: Any ) -> Optional[str]: if ( - values.get("selection_type") not in [SelectionType.aggregation_area, SelectionType.all] + values.get("selection_type") + not in [SelectionType.aggregation_area, SelectionType.all] and polygon_file is None ): raise ValueError( "If `selection_type` is not 'aggregation_area' or 'all', then `polygon_file` needs to be set." ) return polygon_file - class ImpactMeasureModel(MeasureModel): @@ -163,11 +162,16 @@ class GreenInfrastructureModel(HazardMeasureModel): aggregation_area_name: Optional[str] = None percent_area: Optional[float] = None - @validator("type", always=True) def validate_type(cls, type: HazardType, values: Any) -> HazardType: - if type not in [HazardType.water_square, HazardType.greening, HazardType.total_storage]: - raise ValueError("Type must be one of 'water_square', 'greening', or 'total_storage'") + if type not in [ + HazardType.water_square, + HazardType.greening, + HazardType.total_storage, + ]: + raise ValueError( + "Type must be one of 'water_square', 'greening', or 'total_storage'" + ) return type @validator("volume") @@ -194,7 +198,10 @@ def validate_height( def validate_percent_area( cls, percent_area: Optional[float], values: Any ) -> Optional[float]: - if values.get("type", "") in [HazardType.total_storage , HazardType.water_square]: + if values.get("type", "") in [ + HazardType.total_storage, + HazardType.water_square, + ]: if percent_area is not None: raise ValueError( "Percent area cannot be set for total storage or water square type measures" @@ -232,6 +239,7 @@ def validate_aggregation_area_type( ) return aggregation_area_type + class IMeasure(ABC): """This is a class for a FloodAdapt measure""" diff --git a/flood_adapt/object_model/interface/scenarios.py b/flood_adapt/object_model/interface/scenarios.py index 610eaaf27..f0478a4fa 100644 --- a/flood_adapt/object_model/interface/scenarios.py +++ b/flood_adapt/object_model/interface/scenarios.py @@ -37,4 +37,5 @@ def save(self, filepath: Union[str, os.PathLike]): ... @abstractmethod - def run(self) -> None: ... + def run(self) -> None: + ... diff --git a/flood_adapt/object_model/interface/site.py b/flood_adapt/object_model/interface/site.py index 005016ee1..55674e072 100644 --- a/flood_adapt/object_model/interface/site.py +++ b/flood_adapt/object_model/interface/site.py @@ -191,9 +191,9 @@ class Obs_pointModel(BaseModel): name: Union[int, str] description: Optional[str] = "" - ID: Optional[int] = ( - None # if the observation station is also a tide gauge, this ID should be the same as for obs_station - ) + ID: Optional[ + int + ] = None # if the observation station is also a tide gauge, this ID should be the same as for obs_station lat: float lon: float @@ -242,9 +242,9 @@ class SiteModel(BaseModel): obs_point: Optional[list[Obs_pointModel]] = None benefits: BenefitsModel scs: Optional[SCSModel] = None # optional for the US to use SCS rainfall curves - standard_objects: Optional[StandardObjectModel] = ( - StandardObjectModel() - ) # optional for the US to use standard objects + standard_objects: Optional[ + StandardObjectModel + ] = StandardObjectModel() # optional for the US to use standard objects class ISite(ABC): diff --git a/tests/test_integrator/test_hazard_run.py b/tests/test_integrator/test_hazard_run.py index b6b093d42..78bcff682 100644 --- a/tests/test_integrator/test_hazard_run.py +++ b/tests/test_integrator/test_hazard_run.py @@ -548,16 +548,16 @@ def test_multiple_rivers(test_db: None): # Overwrite river data of Event test_scenario.direct_impacts.hazard.event.attrs.river[0].source = "constant" test_scenario.direct_impacts.hazard.event.attrs.river[1].source = "shape" - test_scenario.direct_impacts.hazard.event.attrs.river[0].constant_discharge = ( - UnitfulDischarge(value=2000.0, units="cfs") - ) + test_scenario.direct_impacts.hazard.event.attrs.river[ + 0 + ].constant_discharge = UnitfulDischarge(value=2000.0, units="cfs") test_scenario.direct_impacts.hazard.event.attrs.river[1].shape_type = "gaussian" - test_scenario.direct_impacts.hazard.event.attrs.river[1].base_discharge = ( - UnitfulDischarge(value=1000.0, units="cfs") - ) - test_scenario.direct_impacts.hazard.event.attrs.river[1].shape_peak = ( - UnitfulDischarge(value=2500.0, units="cfs") - ) + test_scenario.direct_impacts.hazard.event.attrs.river[ + 1 + ].base_discharge = UnitfulDischarge(value=1000.0, units="cfs") + test_scenario.direct_impacts.hazard.event.attrs.river[ + 1 + ].shape_peak = UnitfulDischarge(value=2500.0, units="cfs") test_scenario.direct_impacts.hazard.event.attrs.river[1].shape_duration = 8 test_scenario.direct_impacts.hazard.event.attrs.river[1].shape_peak_time = 0 @@ -576,9 +576,9 @@ def test_multiple_rivers(test_db: None): test_scenario.direct_impacts.hazard.site.attrs.river[1].name = name test_scenario.direct_impacts.hazard.site.attrs.river[1].x_coordinate = x test_scenario.direct_impacts.hazard.site.attrs.river[1].y_coordinate = y - test_scenario.direct_impacts.hazard.site.attrs.river[1].mean_discharge = ( - UnitfulDischarge(value=mean_discharge, units="cfs") - ) + test_scenario.direct_impacts.hazard.site.attrs.river[ + 1 + ].mean_discharge = UnitfulDischarge(value=mean_discharge, units="cfs") test_scenario.direct_impacts.hazard.site.attrs.river[1].description = description # Change name of reference model diff --git a/tests/test_object_model/interface/test_measures.py b/tests/test_object_model/interface/test_measures.py index 4a97a8b28..8f2e6cb71 100644 --- a/tests/test_object_model/interface/test_measures.py +++ b/tests/test_object_model/interface/test_measures.py @@ -7,11 +7,8 @@ MeasureModel, SelectionType, ) - from flood_adapt.object_model.io.unitfulvalue import ( - UnitfulDischarge, UnitfulLength, - UnitfulLengthRefValue, UnitfulVolume, UnitTypesLength, UnitTypesVolume, @@ -199,7 +196,7 @@ def test_green_infrastructure_model_correct_total_storage_polygon_input(self): polygon_file="test_polygon_file", selection_type=SelectionType.polygon, volume=UnitfulVolume(value=1, units=UnitTypesVolume.m3), - ) # No height or percent_area needed for total storage + ) # No height or percent_area needed for total storage # Assert assert green_infrastructure.name == "test_green_infrastructure" @@ -221,7 +218,7 @@ def test_green_infrastructure_model_correct_water_square_polygon_input(self): selection_type=SelectionType.polygon, volume=UnitfulVolume(value=1, units=UnitTypesVolume.m3), height=UnitfulLength(value=1, units=UnitTypesLength.meters), - ) # No percent_area needed for water square + ) # No percent_area needed for water square # Assert assert green_infrastructure.name == "test_green_infrastructure" @@ -230,7 +227,6 @@ def test_green_infrastructure_model_correct_water_square_polygon_input(self): assert green_infrastructure.polygon_file == "test_polygon_file" assert green_infrastructure.selection_type == "polygon" - def test_green_infrastructure_model_no_aggregation_area_name(self): # Arrange with pytest.raises(ValueError) as excinfo: @@ -532,4 +528,4 @@ def test_green_infrastructure_model_water_square_fails( ) # Assert - assert error_message in str(excinfo.value) \ No newline at end of file + assert error_message in str(excinfo.value)