6
6
from decimal import Decimal
7
7
from enum import Enum , IntEnum
8
8
from inspect import isclass
9
- from typing import Any , Dict , List , Mapping , Optional , Sized , Type
9
+ from typing import Any , Dict , List , Mapping , Optional , Sized , Type , Collection
10
10
11
11
import pydantic as pd
12
12
@@ -563,13 +563,13 @@ def __init__(
563
563
self , model : Type ['pxml.BaseXmlModel' ], model_field : pd .fields .ModelField , ctx : Serializer .Context ,
564
564
):
565
565
assert len (model_field .sub_fields ) == 1
566
- if issubclass (model_field .type_ , pxml .BaseXmlModel ):
566
+ if isclass ( model_field . type_ ) and issubclass (model_field .type_ , pxml .BaseXmlModel ):
567
567
raise errors .ModelFieldError (
568
568
model .__name__ , model_field .name , "Inline list value should be of scalar type" ,
569
569
)
570
570
571
571
def serialize (
572
- self , element : etree .Element , value : Any , * , encoder : XmlEncoder , skip_empty : bool = False ,
572
+ self , element : etree .Element , value : Collection [ Any ] , * , encoder : XmlEncoder , skip_empty : bool = False ,
573
573
) -> Optional [etree .Element ]:
574
574
if value is None or skip_empty and len (value ) == 0 :
575
575
return element
@@ -579,6 +579,9 @@ def serialize(
579
579
return element
580
580
581
581
def deserialize (self , element : etree .Element ) -> Optional [List [Any ]]:
582
+ if element .text is None :
583
+ return []
584
+
582
585
return [value for value in element .text .split ()]
583
586
584
587
class AttributeSerializer (Serializer ):
@@ -600,7 +603,7 @@ def __init__(
600
603
601
604
602
605
def serialize (
603
- self , element : etree .Element , value : Any , * , encoder : XmlEncoder , skip_empty : bool = False ,
606
+ self , element : etree .Element , value : Collection [ Any ] , * , encoder : XmlEncoder , skip_empty : bool = False ,
604
607
) -> Optional [etree .Element ]:
605
608
if value is None or skip_empty and len (value ) == 0 :
606
609
return element
@@ -610,7 +613,7 @@ def serialize(
610
613
return element
611
614
612
615
def deserialize (self , element : etree .Element ) -> Optional [List [Any ]]:
613
- return [value for value in element .get (self .attr_name ).split ()]
616
+ return [value for value in element .get (self .attr_name , default = "" ).split ()]
614
617
615
618
class ElementSerializer (Serializer ):
616
619
def __init__ (
@@ -690,9 +693,6 @@ def build(
690
693
return cls .TextSerializer (model , model_field , ctx )
691
694
elif field_location is Location .ATTRIBUTE :
692
695
return cls .AttributeSerializer (model , model_field , ctx )
693
- # raise errors.ModelFieldError(
694
- # model.__name__, model_field.name, "attributes of collection type are not supported",
695
- # )
696
696
else :
697
697
raise AssertionError ("unreachable" )
698
698
0 commit comments