22from typing import Dict , Any , Optional , Type , List , Union , Tuple , get_origin , get_args , Literal
33from datetime import datetime
44import typing_inspect
5+ import logging
6+
57from dataclasses import fields , is_dataclass
68
79from ..configs import *
810from ..utils .validate_fields import validate_field_string , build_id_field_string
911
12+ if not logging .getLogger ().hasHandlers ():
13+ logging .basicConfig (
14+ level = logging .INFO , # default level
15+ format = "%(asctime)s [%(levelname)s] %(name)s: %(message)s" ,
16+ )
17+
18+ logger = logging .getLogger (__name__ )
19+
1020def is_optional_type (field_type ):
1121 """
1222 Check if a given type is Optional.
@@ -20,10 +30,12 @@ class BaseRequest:
2030 def __init__ (self , base_url : str , base_path = "" ):
2131 self .base_url = base_url
2232 self .base_path = base_path
33+ self .logger = logging .getLogger (self .__class__ .__name__ )
2334
2435 def format_url (self , path : str , query_params : Dict [str , Any ] = None ) -> str :
2536 return f"{ self .base_url } { path } "
26-
37+
38+ @staticmethod
2739 def convert_array_field (field_name : str , value : Any , item_type : Type ) -> Any :
2840 """
2941 Convert and validate array query parameters based on API requirements.
@@ -33,6 +45,7 @@ def convert_array_field(field_name: str, value: Any, item_type: Type) -> Any:
3345 :param item_type: The expected type of the array elements.
3446 :return: A validated and converted value based on array size and field name.
3547 """
48+ logger = logging .getLogger ("BaseRequest.convert_array_field" )
3649 try :
3750 # Ensure the value is treated as a list
3851 if not isinstance (value , list ):
@@ -74,7 +87,10 @@ def convert_array_field(field_name: str, value: Any, item_type: Type) -> Any:
7487
7588 # Default behavior for fields without double underscores
7689 return converted_array
90+
7791 except (ValueError , TypeError ) as e :
92+
93+ logger .error ("Invalid value for array field '%s': %s" , field_name , e )
7894 return {"error" : f"Invalid value for array field '{ field_name } ': { e } " }
7995
8096 def validate_and_convert (self , field_name : str , field_type : Type , value : Any , required : bool ) -> Any :
@@ -88,6 +104,8 @@ def validate_and_convert(self, field_name: str, field_type: Type, value: Any, re
88104
89105 # Skip validation for optional fields with None value
90106 if not required and value is None :
107+ print ("Required field '%s' not provided" , field_name )
108+ self .logger .error ("Required field '%s' not provided" , field_name )
91109 return None
92110
93111 if value is not None :
@@ -195,7 +213,9 @@ def validate_and_convert(self, field_name: str, field_type: Type, value: Any, re
195213 return bool (value )
196214 elif field_type == str :
197215 return str (value )
198- except (ValueError , TypeError ):
216+
217+ except (ValueError , TypeError ) as e :
218+ self .logger .error ("Validation error for field '%s': %s" , field_name , e )
199219 return {"error" : f"Invalid value for field '{ field_name } ': Expected { field_type } , got { type (value ).__name__ } ." }
200220
201221 return None
@@ -214,7 +234,7 @@ def process_model(model: Type, data: Dict[str, Any]) -> Tuple[Dict[str, Any], Di
214234 errors = {}
215235
216236 for field_name , field_type in model .__annotations__ .items ():
217- print (field_name , field_type )
237+ # print(field_name, field_type)
218238 # Use the provided field name for validation; apply mappings after validation
219239 original_field_name = field_name
220240 mapped_field_name = MAPPINGS .get (field_name , field_name )
@@ -227,7 +247,11 @@ def process_model(model: Type, data: Dict[str, Any]) -> Tuple[Dict[str, Any], Di
227247
228248 if value is None :
229249 if not is_optional :
230- errors [original_field_name ] = f"'{ original_field_name } ' is required but not provided."
250+ msg = f"'{ original_field_name } ' is required but not provided."
251+ self .logger .error (msg )
252+ errors [original_field_name ] = msg
253+ # raise ValueError(msg)
254+
231255 continue
232256
233257 # Process nested models
0 commit comments