@@ -311,22 +311,22 @@ def convert_pydantic_model_to_datatype(
311311 inner_type = get_args (type_annotation )
312312 if len (inner_type ) == 0 :
313313 # If the list is empty, we cannot infer the type of the elements
314- children [field_name ] = datatype_to_pydantic_field (
314+ children [field_name ] = pydantic_field_to_datatype (
315315 ListDataType ,
316316 field ,
317317 strict = strict ,
318318 )
319+ continue
319320 inner_type = inner_type [0 ]
320321 if is_pydantic_base_model (inner_type ):
321322 child = convert_pydantic_model_to_datatype (inner_type )
322323 else :
323324 inner_target_datatype = field_to_datatype (inner_type )
324- child = datatype_to_pydantic_field (
325+ child = construct_datatype (
325326 inner_target_datatype ,
326- inner_type ,
327327 strict = strict ,
328328 )
329- children [field_name ] = datatype_to_pydantic_field (
329+ children [field_name ] = pydantic_field_to_datatype (
330330 ListDataType ,
331331 field ,
332332 children = {"item" : child },
@@ -349,7 +349,7 @@ def convert_pydantic_model_to_datatype(
349349 strict = strict ,
350350 excluded_fields = [discriminator ],
351351 )
352- children [field_name ] = datatype_to_pydantic_field (
352+ children [field_name ] = pydantic_field_to_datatype (
353353 Choice ,
354354 field ,
355355 children = choice_children ,
@@ -361,31 +361,28 @@ def convert_pydantic_model_to_datatype(
361361 field , datatype = target_datatype , strict = strict
362362 )
363363 else :
364- children [field_name ] = datatype_to_pydantic_field (
364+ children [field_name ] = pydantic_field_to_datatype (
365365 target_datatype ,
366366 field ,
367367 strict = strict ,
368368 )
369369
370370 if isinstance (model_field , ModelField ):
371- return datatype_to_pydantic_field (
371+ return pydantic_field_to_datatype (
372372 datatype ,
373373 model_field ,
374374 children = children ,
375375 strict = strict ,
376376 )
377377 else :
378- format_attr = FormatAttr . from_validators ([], ObjectDataType . tag , strict )
379- return datatype (
378+ return construct_datatype (
379+ datatype ,
380380 children = children ,
381- format_attr = format_attr ,
382- optional = False ,
383381 name = name ,
384- description = None ,
385382 )
386383
387384
388- def datatype_to_pydantic_field (
385+ def pydantic_field_to_datatype (
389386 datatype : Type [T ],
390387 field : ModelField ,
391388 children : Optional [Dict [str , "DataType" ]] = None ,
@@ -396,14 +393,38 @@ def datatype_to_pydantic_field(
396393 children = {}
397394
398395 validators = field .field_info .extra .get ("validators" , [])
399- format_attr = FormatAttr .from_validators (validators , datatype .tag , strict )
400396
401397 is_optional = field .required is False
402398
403399 name = field .name
404400 description = field .field_info .description
405401
406- data_type = datatype (
407- children , format_attr , is_optional , name , description , ** kwargs
402+ return construct_datatype (
403+ datatype ,
404+ children ,
405+ validators ,
406+ is_optional ,
407+ name ,
408+ description ,
409+ strict = strict ,
410+ ** kwargs ,
408411 )
409- return data_type
412+
413+
414+ def construct_datatype (
415+ datatype : Type [T ],
416+ children : Optional [Dict [str , Any ]] = None ,
417+ validators : Optional [typing .List [Validator ]] = None ,
418+ optional : bool = False ,
419+ name : Optional [str ] = None ,
420+ description : Optional [str ] = None ,
421+ strict : bool = False ,
422+ ** kwargs ,
423+ ) -> T :
424+ if children is None :
425+ children = {}
426+ if validators is None :
427+ validators = []
428+
429+ format_attr = FormatAttr .from_validators (validators , datatype .tag , strict )
430+ return datatype (children , format_attr , optional , name , description , ** kwargs )
0 commit comments