@@ -429,6 +429,47 @@ def items(self) -> Schema:
429
429
return cast (Schema , self .get_prop ("items" ))
430
430
431
431
432
+ class NamedArraySchema (NamedSchema ):
433
+ """Avro named array schema class."""
434
+
435
+ def __init__ (
436
+ self ,
437
+ items : JsonDataType ,
438
+ names : Names ,
439
+ name : str ,
440
+ namespace : Optional [str ] = None ,
441
+ doc : Optional [Union [str , list [str ]]] = None ,
442
+ other_props : Optional [PropsType ] = None ,
443
+ ) -> None :
444
+ """Create a NamedArraySchema object."""
445
+ # Call parent ctor
446
+ NamedSchema .__init__ (self , "array" , name , namespace , names , other_props )
447
+ # Add class members
448
+
449
+ if names is None :
450
+ raise SchemaParseException ("Must provide Names." )
451
+ if isinstance (items , str ) and names .has_name (items , None ):
452
+ items_schema = cast (Schema , names .get_name (items , None ))
453
+ else :
454
+ try :
455
+ items_schema = make_avsc_object (items , names )
456
+ except Exception as err :
457
+ raise SchemaParseException (
458
+ f"Items schema ({ items } ) not a valid Avro schema: { err } . "
459
+ f"Known names: { list (names .names .keys ())} )."
460
+ ) from err
461
+
462
+ self .set_prop ("items" , items_schema )
463
+ if doc is not None :
464
+ self .set_prop ("doc" , doc )
465
+
466
+ # read-only properties
467
+ @property
468
+ def items (self ) -> Schema :
469
+ """Avro schema describing the array items' type."""
470
+ return cast (Schema , self .get_prop ("items" ))
471
+
472
+
432
473
class MapSchema (Schema ):
433
474
"""Avro map schema class."""
434
475
@@ -740,6 +781,11 @@ def make_avsc_object(json_data: JsonDataType, names: Optional[Names] = None) ->
740
781
if atype in VALID_TYPES :
741
782
if atype == "array" :
742
783
items = json_data .get ("items" )
784
+ if "name" in json_data and json_data ["name" ]:
785
+ name = json_data ["name" ]
786
+ namespace = json_data .get ("namespace" , names .default_namespace )
787
+ doc = json_data .get ("doc" )
788
+ return NamedArraySchema (items , names , name , namespace , doc , other_props )
743
789
return ArraySchema (items , names , other_props )
744
790
elif atype == "map" :
745
791
values = json_data .get ("values" )
@@ -748,8 +794,7 @@ def make_avsc_object(json_data: JsonDataType, names: Optional[Names] = None) ->
748
794
namespace = json_data .get ("namespace" , names .default_namespace )
749
795
doc = json_data .get ("doc" )
750
796
return NamedMapSchema (values , names , name , namespace , doc , other_props )
751
- else :
752
- return MapSchema (values , names , other_props )
797
+ return MapSchema (values , names , other_props )
753
798
elif atype == "union" :
754
799
schemas = json_data .get ("names" )
755
800
if not isinstance (schemas , list ):
@@ -761,8 +806,7 @@ def make_avsc_object(json_data: JsonDataType, names: Optional[Names] = None) ->
761
806
namespace = json_data .get ("namespace" , names .default_namespace )
762
807
doc = json_data .get ("doc" )
763
808
return NamedUnionSchema (schemas , names , name , namespace , doc )
764
- else :
765
- return UnionSchema (schemas , names )
809
+ return UnionSchema (schemas , names )
766
810
if atype is None :
767
811
raise SchemaParseException (f'No "type" property: { json_data } ' )
768
812
raise SchemaParseException (f"Undefined type: { atype } " )
0 commit comments