diff --git a/services/logs/oas_commit b/services/logs/oas_commit index e3713dde3..b129c2291 100644 --- a/services/logs/oas_commit +++ b/services/logs/oas_commit @@ -1 +1 @@ -0e64886dd0847341800d7191ed193b75413be998 +98c11e0ee4834ddaaa474eccc437d234e6276a70 diff --git a/services/logs/src/stackit/logs/api_client.py b/services/logs/src/stackit/logs/api_client.py index 07bd934b4..09ab0a5e7 100644 --- a/services/logs/src/stackit/logs/api_client.py +++ b/services/logs/src/stackit/logs/api_client.py @@ -66,6 +66,7 @@ class ApiClient: "date": datetime.date, "datetime": datetime.datetime, "decimal": decimal.Decimal, + "UUID": uuid.UUID, "object": object, } _pool = None @@ -265,7 +266,7 @@ def response_deserialize( response_text = None return_data = None try: - if response_type == "bytearray": + if response_type in ("bytearray", "bytes"): return_data = response_data.data elif response_type == "file": return_data = self.__deserialize_file(response_data) @@ -326,25 +327,20 @@ def sanitize_for_serialization(self, obj): return obj.isoformat() elif isinstance(obj, decimal.Decimal): return str(obj) - elif isinstance(obj, dict): - obj_dict = obj + return {key: self.sanitize_for_serialization(val) for key, val in obj.items()} + + # Convert model obj to dict except + # attributes `openapi_types`, `attribute_map` + # and attributes which value is not None. + # Convert attribute name to json key in + # model definition for request. + if hasattr(obj, "to_dict") and callable(getattr(obj, "to_dict")): + obj_dict = obj.to_dict() else: - # Convert model obj to dict except - # attributes `openapi_types`, `attribute_map` - # and attributes which value is not None. - # Convert attribute name to json key in - # model definition for request. - if hasattr(obj, "to_dict") and callable(getattr(obj, "to_dict")): # noqa: B009 - obj_dict = obj.to_dict() - else: - obj_dict = obj.__dict__ - - if isinstance(obj_dict, list): - # here we handle instances that can either be a list or something else, and only became a real list by calling to_dict() # noqa: E501 - return self.sanitize_for_serialization(obj_dict) + obj_dict = obj.__dict__ - return {key: self.sanitize_for_serialization(val) for key, val in obj_dict.items()} + return self.sanitize_for_serialization(obj_dict) def deserialize(self, response_text: str, response_type: str, content_type: Optional[str]): """Deserializes response into an object. @@ -417,6 +413,8 @@ def __deserialize(self, data, klass): return self.__deserialize_datetime(data) elif klass is decimal.Decimal: return decimal.Decimal(data) + elif klass is uuid.UUID: + return uuid.UUID(data) elif issubclass(klass, Enum): return self.__deserialize_enum(data, klass) else: diff --git a/services/logs/src/stackit/logs/models/access_token.py b/services/logs/src/stackit/logs/models/access_token.py index 4dc83b2d8..76001033e 100644 --- a/services/logs/src/stackit/logs/models/access_token.py +++ b/services/logs/src/stackit/logs/models/access_token.py @@ -28,6 +28,7 @@ StrictStr, field_validator, ) +from pydantic_core import to_jsonable_python from typing_extensions import Annotated, Self @@ -70,6 +71,9 @@ class AccessToken(BaseModel): @field_validator("display_name") def display_name_validate_regular_expression(cls, value): """Validates the regular expression""" + if not isinstance(value, str): + value = str(value) + if not re.match(r"^[a-zA-Z][\w -]*$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z][\w -]*$/") return value @@ -103,7 +107,8 @@ def valid_until_change_year_zero_to_one(cls, value): return value model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -114,8 +119,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/access_token_list.py b/services/logs/src/stackit/logs/models/access_token_list.py index 60f6fe16b..07a80ca2d 100644 --- a/services/logs/src/stackit/logs/models/access_token_list.py +++ b/services/logs/src/stackit/logs/models/access_token_list.py @@ -18,6 +18,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import BaseModel, ConfigDict +from pydantic_core import to_jsonable_python from typing_extensions import Self from stackit.logs.models.access_token import AccessToken @@ -32,7 +33,8 @@ class AccessTokenList(BaseModel): __properties: ClassVar[List[str]] = ["tokens"] model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -43,8 +45,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/create_access_token_payload.py b/services/logs/src/stackit/logs/models/create_access_token_payload.py index 7d6235e60..24d2ac8ed 100644 --- a/services/logs/src/stackit/logs/models/create_access_token_payload.py +++ b/services/logs/src/stackit/logs/models/create_access_token_payload.py @@ -19,6 +19,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from pydantic_core import to_jsonable_python from typing_extensions import Annotated, Self @@ -42,6 +43,9 @@ class CreateAccessTokenPayload(BaseModel): @field_validator("display_name") def display_name_validate_regular_expression(cls, value): """Validates the regular expression""" + if not isinstance(value, str): + value = str(value) + if not re.match(r"^[a-zA-Z][\w -]*$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z][\w -]*$/") return value @@ -55,7 +59,8 @@ def permissions_validate_enum(cls, value): return value model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -66,8 +71,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/create_logs_instance_payload.py b/services/logs/src/stackit/logs/models/create_logs_instance_payload.py index 7452c8a33..f6cd14dee 100644 --- a/services/logs/src/stackit/logs/models/create_logs_instance_payload.py +++ b/services/logs/src/stackit/logs/models/create_logs_instance_payload.py @@ -19,6 +19,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from pydantic_core import to_jsonable_python from typing_extensions import Annotated, Self @@ -42,12 +43,16 @@ class CreateLogsInstancePayload(BaseModel): @field_validator("display_name") def display_name_validate_regular_expression(cls, value): """Validates the regular expression""" + if not isinstance(value, str): + value = str(value) + if not re.match(r"^[a-zA-Z][\w -]*$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z][\w -]*$/") return value model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -58,8 +63,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/logs_instance.py b/services/logs/src/stackit/logs/models/logs_instance.py index 056f19f4f..36ef629c2 100644 --- a/services/logs/src/stackit/logs/models/logs_instance.py +++ b/services/logs/src/stackit/logs/models/logs_instance.py @@ -21,6 +21,7 @@ from uuid import UUID from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from pydantic_core import to_jsonable_python from typing_extensions import Annotated, Self @@ -88,6 +89,9 @@ def created_change_year_zero_to_one(cls, value): @field_validator("display_name") def display_name_validate_regular_expression(cls, value): """Validates the regular expression""" + if not isinstance(value, str): + value = str(value) + if not re.match(r"^[a-zA-Z][\w -]*$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z][\w -]*$/") return value @@ -100,7 +104,8 @@ def status_validate_enum(cls, value): return value model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -111,8 +116,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/logs_instances_list.py b/services/logs/src/stackit/logs/models/logs_instances_list.py index 029676079..e8691f2a9 100644 --- a/services/logs/src/stackit/logs/models/logs_instances_list.py +++ b/services/logs/src/stackit/logs/models/logs_instances_list.py @@ -18,6 +18,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import BaseModel, ConfigDict +from pydantic_core import to_jsonable_python from typing_extensions import Self from stackit.logs.models.logs_instance import LogsInstance @@ -32,7 +33,8 @@ class LogsInstancesList(BaseModel): __properties: ClassVar[List[str]] = ["instances"] model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -43,8 +45,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/update_access_token_payload.py b/services/logs/src/stackit/logs/models/update_access_token_payload.py index ecf5fb35d..0e2c9a0f1 100644 --- a/services/logs/src/stackit/logs/models/update_access_token_payload.py +++ b/services/logs/src/stackit/logs/models/update_access_token_payload.py @@ -19,6 +19,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import BaseModel, ConfigDict, Field, field_validator +from pydantic_core import to_jsonable_python from typing_extensions import Annotated, Self @@ -41,12 +42,16 @@ def display_name_validate_regular_expression(cls, value): if value is None: return value + if not isinstance(value, str): + value = str(value) + if not re.match(r"^[a-zA-Z][\w -]*$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z][\w -]*$/") return value model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -57,8 +62,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: diff --git a/services/logs/src/stackit/logs/models/update_logs_instance_payload.py b/services/logs/src/stackit/logs/models/update_logs_instance_payload.py index 2a35324c1..9d74933db 100644 --- a/services/logs/src/stackit/logs/models/update_logs_instance_payload.py +++ b/services/logs/src/stackit/logs/models/update_logs_instance_payload.py @@ -19,6 +19,7 @@ from typing import Any, ClassVar, Dict, List, Optional, Set from pydantic import BaseModel, ConfigDict, Field, StrictStr, field_validator +from pydantic_core import to_jsonable_python from typing_extensions import Annotated, Self @@ -45,12 +46,16 @@ def display_name_validate_regular_expression(cls, value): if value is None: return value + if not isinstance(value, str): + value = str(value) + if not re.match(r"^[a-zA-Z][\w -]*$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z][\w -]*$/") return value model_config = ConfigDict( - populate_by_name=True, + validate_by_name=True, + validate_by_alias=True, validate_assignment=True, protected_namespaces=(), ) @@ -61,8 +66,7 @@ def to_str(self) -> str: def to_json(self) -> str: """Returns the JSON representation of the model using alias""" - # TODO: pydantic v2: use .model_dump_json(by_alias=True, exclude_unset=True) instead - return json.dumps(self.to_dict()) + return json.dumps(to_jsonable_python(self.to_dict())) @classmethod def from_json(cls, json_str: str) -> Optional[Self]: