Skip to content

Commit

Permalink
Merge branch 'main' into fix/enforce-override
Browse files Browse the repository at this point in the history
  • Loading branch information
salemsd authored Feb 10, 2025
2 parents 0496787 + 05bacae commit 7d365a3
Show file tree
Hide file tree
Showing 62 changed files with 2,148 additions and 2,384 deletions.
8 changes: 8 additions & 0 deletions docs/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
v0.1.8_RC2 (2025-01-22)
-------------------
- upload renewable thermal matrices method added
- bug fix clusters/{area}/list.ini file was missing
- bug fix for input/thermal/series/{area}/{cluster}/series.txt /data.txt and modulation.txt, wrong path
at cluster creation


v0.1.8_RC1 (2025-01-22)
-------------------

Expand Down
3 changes: 1 addition & 2 deletions mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@
mypy_path = src
packages= antares
strict = true
enable_error_code = "explicit-override"

enable_error_code = "explicit-override"
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "antares_craft"
version = "0.1.8_RC1"
version = "0.1.8_RC2"
description = """Antares Craft python library under construction. It will allow to create, update and read antares studies."""
readme = "CONCATENATED_README.md"
license = {file = "LICENSE"}
Expand Down
24 changes: 24 additions & 0 deletions src/antares/craft/exceptions/exceptions.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,12 @@ def __init__(self, study_name: str, message: str) -> None:
super().__init__(self.message)


class StudySettingsReadError(Exception):
def __init__(self, study_name: str, message: str) -> None:
self.message = f"Could not read settings for study {study_name}: " + message
super().__init__(self.message)


class StudyDeletionError(Exception):
def __init__(self, study_id: str, message: str) -> None:
self.message = f"Could not delete the study {study_id}: " + message
Expand All @@ -256,6 +262,12 @@ def __init__(self, study_id: str, new_folder_name: str, message: str) -> None:
super().__init__(self.message)


class StudyImportError(Exception):
def __init__(self, study_id: str, message: str):
self.message = f"Could not import the study {study_id} : {message}"
super().__init__(self.message)


class ThermalMatrixDownloadError(Exception):
def __init__(self, area_name: str, cluster_name: str, matrix_name: str, message: str) -> None:
self.message = (
Expand All @@ -264,12 +276,24 @@ def __init__(self, area_name: str, cluster_name: str, matrix_name: str, message:
super().__init__(self.message)


class ThermalMatrixUpdateError(Exception):
def __init__(self, area_name: str, cluster_name: str, message: str) -> None:
self.message = f"Could not upload matrix for cluster {cluster_name} inside area {area_name}: " + message
super().__init__(self.message)


class RenewableMatrixDownloadError(Exception):
def __init__(self, area_name: str, renewable_name: str, message: str) -> None:
self.message = f"Could not download matrix for cluster {renewable_name} inside area {area_name}: " + message
super().__init__(self.message)


class RenewableMatrixUpdateError(Exception):
def __init__(self, area_name: str, renewable_name: str, message: str) -> None:
self.message = f"Could not upload matrix for cluster {renewable_name} inside area {area_name}: " + message
super().__init__(self.message)


class MatrixUploadError(Exception):
def __init__(self, area_id: str, matrix_type: str, message: str) -> None:
self.message = f"Error uploading {matrix_type} matrix for area {area_id}: {message}"
Expand Down
61 changes: 34 additions & 27 deletions src/antares/craft/model/area.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
"""

from types import MappingProxyType
from typing import Any, Dict, List, Mapping, Optional, Set
from typing import Any, Mapping, Optional

import pandas as pd

Expand All @@ -26,6 +26,13 @@
from antares.craft.model.renewable import RenewableCluster, RenewableClusterProperties
from antares.craft.model.st_storage import STStorage, STStorageProperties
from antares.craft.model.thermal import ThermalCluster, ThermalClusterProperties
from antares.craft.service.base_services import (
BaseAreaService,
BaseHydroService,
BaseRenewableService,
BaseShortTermStorageService,
BaseThermalService,
)
from antares.craft.tools.alias_generators import to_space
from antares.craft.tools.all_optional_meta import all_optional_model
from antares.craft.tools.contents_tool import EnumIgnoreCase, transform_name_to_id
Expand Down Expand Up @@ -55,14 +62,14 @@ class DefaultAreaProperties(BaseModel, extra="forbid", populate_by_name=True):
non_dispatch_power: bool = True
dispatch_hydro_power: bool = True
other_dispatch_power: bool = True
filter_synthesis: Set[FilterOption] = {
filter_synthesis: set[FilterOption] = {
FilterOption.HOURLY,
FilterOption.DAILY,
FilterOption.WEEKLY,
FilterOption.MONTHLY,
FilterOption.ANNUAL,
}
filter_by_year: Set[FilterOption] = {
filter_by_year: set[FilterOption] = {
FilterOption.HOURLY,
FilterOption.DAILY,
FilterOption.WEEKLY,
Expand Down Expand Up @@ -121,11 +128,11 @@ class AreaUi(BaseModel, extra="forbid", populate_by_name=True, alias_generator=t
layer: Optional[int] = None
x: Optional[int] = None
y: Optional[int] = None
color_rgb: Optional[List[int]] = None
color_rgb: Optional[list[int]] = None

layer_x: Optional[Dict[int, int]] = None
layer_y: Optional[Dict[int, int]] = None
layer_color: Optional[Dict[int, str]] = None
layer_x: Optional[dict[int, int]] = None
layer_y: Optional[dict[int, int]] = None
layer_color: Optional[dict[int, str]] = None


class AreaUiLocal(BaseModel):
Expand All @@ -151,7 +158,7 @@ def __init__(

@computed_field # type: ignore[misc]
@property
def ui(self) -> Dict[str, Optional[int]]:
def ui(self) -> dict[str, Optional[int]]:
return dict(
x=self._x,
y=self._y,
Expand All @@ -163,17 +170,17 @@ def ui(self) -> Dict[str, Optional[int]]:

@computed_field # type: ignore[misc]
@property
def layerX(self) -> Dict[int, int]:
def layerX(self) -> dict[int, int]:
return self._layer_x

@computed_field # type: ignore[misc]
@property
def layerY(self) -> Dict[int, int]:
def layerY(self) -> dict[int, int]:
return self._layer_y

@computed_field # type: ignore[misc]
@property
def layerColor(self) -> Dict[int, str]:
def layerColor(self) -> dict[int, str]:
return self._layer_color

def yield_area_ui(self) -> AreaUi:
Expand All @@ -189,18 +196,18 @@ def yield_area_ui(self) -> AreaUi:


class Area:
def __init__( # type: ignore # TODO: Find a way to avoid circular imports
def __init__(
self,
name: str,
area_service,
storage_service,
thermal_service,
renewable_service,
hydro_service,
area_service: BaseAreaService,
storage_service: BaseShortTermStorageService,
thermal_service: BaseThermalService,
renewable_service: BaseRenewableService,
hydro_service: BaseHydroService,
*,
renewables: Optional[Dict[str, RenewableCluster]] = None,
thermals: Optional[Dict[str, ThermalCluster]] = None,
st_storages: Optional[Dict[str, STStorage]] = None,
renewables: Optional[dict[str, RenewableCluster]] = None,
thermals: Optional[dict[str, ThermalCluster]] = None,
st_storages: Optional[dict[str, STStorage]] = None,
hydro: Optional[Hydro] = None,
properties: Optional[AreaProperties] = None,
ui: Optional[AreaUi] = None,
Expand Down Expand Up @@ -299,23 +306,23 @@ def get_reserves_matrix(self) -> pd.DataFrame:
def get_misc_gen_matrix(self) -> pd.DataFrame:
return self._area_service.get_misc_gen_matrix(self.id)

def delete_thermal_clusters(self, thermal_clusters: List[ThermalCluster]) -> None:
def delete_thermal_clusters(self, thermal_clusters: list[ThermalCluster]) -> None:
self._area_service.delete_thermal_clusters(self.id, thermal_clusters)
for cluster in thermal_clusters:
self._thermals.pop(cluster.id)

def delete_thermal_cluster(self, thermal_cluster: ThermalCluster) -> None:
self.delete_thermal_clusters([thermal_cluster])

def delete_renewable_clusters(self, renewable_clusters: List[RenewableCluster]) -> None:
def delete_renewable_clusters(self, renewable_clusters: list[RenewableCluster]) -> None:
self._area_service.delete_renewable_clusters(self.id, renewable_clusters)
for cluster in renewable_clusters:
self._renewables.pop(cluster.id)

def delete_renewable_cluster(self, renewable_cluster: RenewableCluster) -> None:
self.delete_renewable_clusters([renewable_cluster])

def delete_st_storages(self, storages: List[STStorage]) -> None:
def delete_st_storages(self, storages: list[STStorage]) -> None:
self._area_service.delete_st_storages(self.id, storages)
for storage in storages:
self._st_storages.pop(storage.id)
Expand Down Expand Up @@ -349,7 +356,7 @@ def create_misc_gen(self, series: pd.DataFrame) -> None:
def create_hydro(
self,
properties: Optional[HydroProperties] = None,
matrices: Optional[Dict[HydroMatrixName, pd.DataFrame]] = None,
matrices: Optional[dict[HydroMatrixName, pd.DataFrame]] = None,
) -> Hydro:
# todo: is it necessary to create allocation or correlation ?
hydro = self._area_service.create_hydro(self.id, properties, matrices)
Expand All @@ -358,17 +365,17 @@ def create_hydro(

def read_st_storages(
self,
) -> List[STStorage]:
) -> list[STStorage]:
return self._storage_service.read_st_storages(self.id)

def read_renewables(
self,
) -> List[RenewableCluster]:
) -> list[RenewableCluster]:
return self._renewable_service.read_renewables(self.id)

def read_thermal_clusters(
self,
) -> List[ThermalCluster]:
) -> list[ThermalCluster]:
return self._thermal_service.read_thermal_clusters(self.id)

def read_hydro(
Expand Down
17 changes: 9 additions & 8 deletions src/antares/craft/model/binding_constraint.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@
# This file is part of the Antares project.

from enum import Enum
from typing import Any, Dict, List, Optional, Union
from typing import Any, Optional, Union

import pandas as pd

from antares.craft.service.base_services import BaseBindingConstraintService
from antares.craft.tools.all_optional_meta import all_optional_model
from antares.craft.tools.contents_tool import EnumIgnoreCase, transform_name_to_id
from pydantic import BaseModel, Field, model_validator
Expand Down Expand Up @@ -76,12 +77,12 @@ class ConstraintTerm(TermOperators):
id: str = Field(init=False)

@model_validator(mode="before")
def fill_id(cls, v: Dict[str, Any]) -> Dict[str, Any]:
def fill_id(cls, v: dict[str, Any]) -> dict[str, Any]:
v["id"] = cls.generate_id(v["data"])
return v

@classmethod
def generate_id(cls, data: Union[Dict[str, str], LinkData, ClusterData]) -> str:
def generate_id(cls, data: Union[dict[str, str], LinkData, ClusterData]) -> str:
if isinstance(data, dict):
if "area1" in data:
return "%".join(sorted((data["area1"].lower(), data["area2"].lower())))
Expand Down Expand Up @@ -120,12 +121,12 @@ class BindingConstraintProperties(DefaultBindingConstraintProperties):


class BindingConstraint:
def __init__( # type: ignore # TODO: Find a way to avoid circular imports
def __init__(
self,
name: str,
binding_constraint_service,
binding_constraint_service: BaseBindingConstraintService,
properties: Optional[BindingConstraintProperties] = None,
terms: Optional[List[ConstraintTerm]] = None,
terms: Optional[list[ConstraintTerm]] = None,
):
self._name = name
self._binding_constraint_service = binding_constraint_service
Expand All @@ -149,10 +150,10 @@ def properties(self) -> BindingConstraintProperties:
def properties(self, new_properties: BindingConstraintProperties) -> None:
self._properties = new_properties

def get_terms(self) -> Dict[str, ConstraintTerm]:
def get_terms(self) -> dict[str, ConstraintTerm]:
return self._terms

def add_terms(self, terms: List[ConstraintTerm]) -> None:
def add_terms(self, terms: list[ConstraintTerm]) -> None:
added_terms = self._binding_constraint_service.add_constraint_terms(self, terms)
for term in added_terms:
self._terms[term.id] = term
Expand Down
11 changes: 6 additions & 5 deletions src/antares/craft/model/hydro.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@
# This file is part of the Antares project.

from enum import Enum
from typing import Dict, Optional
from typing import Optional

import pandas as pd

from antares.craft.service.base_services import BaseHydroService
from antares.craft.tools.all_optional_meta import all_optional_model
from pydantic import BaseModel
from pydantic.alias_generators import to_camel
Expand Down Expand Up @@ -90,12 +91,12 @@ def yield_hydro_properties(self) -> HydroProperties:


class Hydro:
def __init__( # type: ignore #
def __init__(
self,
service,
service: BaseHydroService,
area_id: str,
properties: Optional[HydroProperties] = None,
matrices: Optional[Dict[HydroMatrixName, pd.DataFrame]] = None,
matrices: Optional[dict[HydroMatrixName, pd.DataFrame]] = None,
):
self._area_id = area_id
self._service = service
Expand All @@ -111,7 +112,7 @@ def properties(self) -> Optional[HydroProperties]:
return self._properties

@property
def matrices(self) -> Optional[Dict[HydroMatrixName, pd.DataFrame]]:
def matrices(self) -> Optional[dict[HydroMatrixName, pd.DataFrame]]:
return self._matrices

def get_maxpower(self) -> pd.DataFrame:
Expand Down
5 changes: 3 additions & 2 deletions src/antares/craft/model/link.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import pandas as pd

from antares.craft.model.commons import FilterOption, sort_filter_values
from antares.craft.service.base_services import BaseLinkService
from antares.craft.tools.alias_generators import to_kebab
from antares.craft.tools.all_optional_meta import all_optional_model
from antares.craft.tools.contents_tool import transform_name_to_id
Expand Down Expand Up @@ -133,11 +134,11 @@ def yield_link_ui(self) -> LinkUi:


class Link:
def __init__( # type: ignore # TODO: Find a way to avoid circular imports
def __init__(
self,
area_from: str,
area_to: str,
link_service,
link_service: BaseLinkService,
properties: Optional[LinkProperties] = None,
ui: Optional[LinkUi] = None,
):
Expand Down
5 changes: 3 additions & 2 deletions src/antares/craft/model/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

import pandas as pd

from antares.craft.service.base_services import BaseOutputService
from pydantic import BaseModel


Expand Down Expand Up @@ -75,10 +76,10 @@ def to_api_query(self, object_type: str) -> str:


class Output:
def __init__(self, name: str, archived: bool, output_service): # type: ignore
def __init__(self, name: str, archived: bool, output_service: BaseOutputService):
self._name = name
self._archived = archived
self._output_service = output_service
self._output_service: BaseOutputService = output_service

@property
def name(self) -> str:
Expand Down
Loading

0 comments on commit 7d365a3

Please sign in to comment.