1010 EnumDefinition ,
1111 PropertyDefinition ,
1212 SchemaAllOf ,
13+ SchemaAnyOf ,
1314 SchemaArray ,
1415 SchemaEnum ,
1516 SchemaItem ,
@@ -26,7 +27,9 @@ def build_types(schema: List[SchemaItem]) -> List[TypeDefinition]:
2627
2728
2829def _normalize_typename (typename : str ) -> str :
29- return typename [5 :- 1 ] if typename .startswith ("List[" ) else typename
30+ prefixes = {"List[" , "Optional[" }
31+ prefix = next (filter (lambda p : typename .startswith (p ), prefixes ), None )
32+ return typename [len (prefix ) : - 1 ] if prefix else typename
3033
3134
3235def _build_types_for_item (
@@ -89,6 +92,10 @@ def _item_for_nesting(item: SchemaItem) -> SchemaItem:
8992 first_item = item .all_of [0 ]
9093 first_item .name = item .name
9194 return _item_for_nesting (first_item )
95+ if isinstance (item , SchemaAnyOf ):
96+ first_item = item .any_of [0 ]
97+ first_item .name = item .name
98+ return _item_for_nesting (first_item )
9299 else :
93100 return item
94101
@@ -102,6 +109,8 @@ def _build_property(item: SchemaItem, parent_class_name: str) -> PropertyDefinit
102109 return _build_property (_item_for_nesting (item ), parent_class_name )
103110 if isinstance (item , SchemaArray ):
104111 return _property_from_array (item , parent_class_name )
112+ if isinstance (item , SchemaAnyOf ):
113+ return _property_from_any_of (item , parent_class_name )
105114
106115 return _property_from_value (item )
107116
@@ -142,6 +151,23 @@ def _property_from_array(object: SchemaArray, parent_name: str) -> PropertyDefin
142151 )
143152
144153
154+ def _property_from_any_of (object : SchemaAnyOf , parent_name : str ) -> PropertyDefinition :
155+ def is_null (item : SchemaItem ) -> bool :
156+ return isinstance (item , SchemaValue ) and item .value_types == ["null" ]
157+
158+ nested_property = _build_property (_item_for_nesting (object ), parent_name )
159+ is_optional = any (map (is_null , object .any_of ))
160+
161+ if is_optional :
162+ return _property (
163+ name = object .name ,
164+ type_name = f"Optional[{ nested_property .value_type } ]" ,
165+ known_type = nested_property .known_type ,
166+ )
167+ else :
168+ return _property (name = object .name , type_name = "Any" , known_type = True )
169+
170+
145171def _property (name : str , type_name : str , known_type : bool ) -> PropertyDefinition :
146172 return PropertyDefinition (
147173 name = stringcase .snakecase (name ),
0 commit comments