@@ -191,7 +191,7 @@ def is_forkable(self, value):
191191 def fork (self , key : str ) -> "Serializer" :
192192 """
193193 Return new serializer for a key
194- :return: serialized value
194+ :return: serializer
195195 """
196196 serializer = Serializer (** self .opts ._asdict ())
197197 serializer .set_serialization_depth (self .serialization_depth + 1 )
@@ -200,23 +200,47 @@ def fork(self, key: str) -> "Serializer":
200200 logger .debug ("Fork serializer for key:%s" , key )
201201 return serializer
202202
203- def serialize (self , value ):
203+ def serialize (self , value , ** kwargs ):
204+ """
205+ Orchestrates the serialization process.
206+
207+ Args:
208+ value: The value to be serialized.
209+ **kwargs: Only to ensure that no key is passed
210+ since None and Ellipsis are valid keys.
211+
212+ Returns:
213+ The serialized value.
214+ """
204215 if self .is_valid_callable (value ):
205216 value = value ()
217+ logger .debug ("Process callable resulting type:%s" , get_type (value ))
206218
219+ if kwargs :
220+ if "key" in kwargs :
221+ # since None and ... are valid keys
222+ return self .serialize_with_fork (value = value , key = kwargs ["key" ])
223+ raise ValueError ("Malformed structure of kwargs. Only `key` accepted" )
224+
225+ return self .apply_callback (value = value )
226+
227+ def apply_callback (self , value ):
228+ """
229+ Apply a proper callback to serialize the value
230+ :return: serialized value
231+ :raises: IsNotSerializable
232+ """
207233 for types , callback in self .serialize_types :
208234 if isinstance (value , types ):
209235 return callback (value )
210- raise IsNotSerializable (f"Unserializable type:{ type (value )} value:{ value } " )
236+ raise IsNotSerializable (f"Unserializable type:{ get_type (value )} value:{ value } " )
211237
212238 def serialize_with_fork (self , value , key ):
213- # TODO: merge this function with the serialize function
214- # TODO: this should be performed after is_valid_callable check
215239 serializer = self
216240 if self .is_forkable (value ):
217241 serializer = self .fork (key = key )
218242
219- return serializer .serialize (value )
243+ return serializer .apply_callback (value )
220244
221245 def serialize_iter (self , value : Iterable ) -> list :
222246 res = []
@@ -238,7 +262,7 @@ def serialize_dict(self, value: dict) -> dict:
238262 if self .schema .is_included (k ): # TODO: Skip check if is NOT greedy
239263 logger .debug ("Serialize key:%s type:%s of dict" , k , get_type (v ))
240264
241- res [k ] = self .serialize_with_fork (value = v , key = k )
265+ res [k ] = self .serialize (value = v , key = k )
242266 else :
243267 logger .debug ("Skip key:%s of dict" , k )
244268 return res
@@ -255,9 +279,12 @@ def serialize_model(self, value) -> dict:
255279 if self .schema .is_included (key = k ): # TODO: Skip check if is NOT greedy
256280 v = getattr (value , k )
257281 logger .debug (
258- "Serialize key:%s type:%s model:%s" , k , get_type (v ), get_type (value )
282+ "Serialize key:%s type:%s of model:%s" ,
283+ k ,
284+ get_type (v ),
285+ get_type (value ),
259286 )
260- res [k ] = self .serialize_with_fork (value = v , key = k )
287+ res [k ] = self .serialize (value = v , key = k )
261288
262289 else :
263290 logger .debug ("Skip key:%s of model:%s" , k , get_type (value ))
0 commit comments