diff --git a/requirements.txt b/requirements.txt index 2c24336..1b10f94 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ requests==2.31.0 +pydantic==2.5.3 diff --git a/whatsapp_api_client_python/API.py b/whatsapp_api_client_python/API.py index d260ce9..ea8bf6c 100644 --- a/whatsapp_api_client_python/API.py +++ b/whatsapp_api_client_python/API.py @@ -32,6 +32,7 @@ def __init__( apiTokenInstance: str, debug_mode: bool = False, raise_errors: bool = False, + create_models: bool = False, host: str = "https://api.green-api.com", media: str = "https://media.green-api.com" ): @@ -39,6 +40,7 @@ def __init__( self.media = media self.debug_mode = debug_mode self.raise_errors = raise_errors + self.create_models = create_models self.idInstance = idInstance self.apiTokenInstance = apiTokenInstance @@ -88,11 +90,13 @@ def request( raise GreenAPIError(error_message) self.logger.log(logging.CRITICAL, error_message) - return GreenAPIResponse(None, error_message) + return GreenAPIResponse(None, error_message, self.create_models) self.__handle_response(response) - return GreenAPIResponse(response.status_code, response.text) + return GreenAPIResponse( + response.status_code, response.text, self.create_models + ) def raw_request(self, **arguments: Any) -> GreenAPIResponse: try: @@ -104,11 +108,13 @@ def raw_request(self, **arguments: Any) -> GreenAPIResponse: raise GreenAPIError(error_message) self.logger.log(logging.CRITICAL, error_message) - return GreenAPIResponse(None, error_message) + return GreenAPIResponse(None, error_message, self.create_models) self.__handle_response(response) - return GreenAPIResponse(response.status_code, response.text) + return GreenAPIResponse( + response.status_code, response.text, self.create_models + ) def __handle_response(self, response: Response) -> Optional[NoReturn]: status_code = response.status_code diff --git a/whatsapp_api_client_python/response.py b/whatsapp_api_client_python/response.py index 60e51ce..58f0a6b 100644 --- a/whatsapp_api_client_python/response.py +++ b/whatsapp_api_client_python/response.py @@ -1,15 +1,31 @@ from json import loads -from typing import Optional +from typing import Generic, Optional, Type, TypeVar +from .responses.base import BaseResponse -class Response: +Model = TypeVar("Model", bound=BaseResponse) + + +class Response(Generic[Model]): code: Optional[int] data: Optional[dict] = None error: Optional[str] = None - def __init__(self, code: Optional[int], text: str): + create_models: bool = False + model: Optional[Model] = None + + def __init__(self, code: Optional[int], text: str, create_models: bool): self.code = code if self.code == 200: self.data = loads(text) else: self.error = text + + self.create_models = create_models + + def create_model(self, response_type: Type[BaseResponse]) -> None: + if self.create_models: + self.model = response_type(**self.data) + + +__all__ = ["Response"] diff --git a/whatsapp_api_client_python/responses/__init__.py b/whatsapp_api_client_python/responses/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/whatsapp_api_client_python/responses/base.py b/whatsapp_api_client_python/responses/base.py new file mode 100644 index 0000000..23da605 --- /dev/null +++ b/whatsapp_api_client_python/responses/base.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel, ConfigDict +from pydantic.alias_generators import to_camel + + +class BaseResponse(BaseModel): + model_config = ConfigDict(alias_generator=to_camel) + + +__all__ = ["BaseResponse"]