@@ -40,13 +40,41 @@ class XmlEntityInfoP(typing.Protocol):
4040 wrapped : Optional ['XmlEntityInfoP' ]
4141
4242
43- class XmlEntityInfo (pd .fields .FieldInfo ):
43+ class XmlEntityInfo (pd .fields .FieldInfo , XmlEntityInfoP ):
4444 """
4545 Field xml meta-information.
4646 """
4747
4848 __slots__ = ('location' , 'path' , 'ns' , 'nsmap' , 'nillable' , 'wrapped' )
4949
50+ @staticmethod
51+ def merge_field_infos (* field_infos : pd .fields .FieldInfo , ** overrides : Any ) -> pd .fields .FieldInfo :
52+ location , path , ns , nsmap , nillable , wrapped = None , None , None , None , None , None
53+
54+ for field_info in field_infos :
55+ if isinstance (field_info , XmlEntityInfo ):
56+ location = field_info .location if field_info .location is not None else location
57+ path = field_info .path if field_info .path is not None else path
58+ ns = field_info .ns if field_info .ns is not None else ns
59+ nsmap = field_info .nsmap if field_info .nsmap is not None else nsmap
60+ nillable = field_info .nillable if field_info .nillable is not None else nillable
61+ wrapped = field_info .wrapped if field_info .wrapped is not None else wrapped
62+
63+ field_info = pd .fields .FieldInfo .merge_field_infos (* field_infos , ** overrides )
64+
65+ xml_entity_info = XmlEntityInfo (
66+ location ,
67+ path = path ,
68+ ns = ns ,
69+ nsmap = nsmap ,
70+ nillable = nillable ,
71+ wrapped = wrapped if isinstance (wrapped , XmlEntityInfo ) else None ,
72+ ** field_info ._attributes_set ,
73+ )
74+ xml_entity_info .metadata = field_info .metadata
75+
76+ return xml_entity_info
77+
5078 def __init__ (
5179 self ,
5280 location : Optional [EntityLocation ],
@@ -58,10 +86,13 @@ def __init__(
5886 wrapped : Optional [pd .fields .FieldInfo ] = None ,
5987 ** kwargs : Any ,
6088 ):
89+ wrapped_metadata : list [Any ] = []
6190 if wrapped is not None :
6291 # copy arguments from the wrapped entity to let pydantic know how to process the field
6392 for entity_field_name in utils .get_slots (wrapped ):
64- kwargs [entity_field_name ] = getattr (wrapped , entity_field_name )
93+ if entity_field_name in pd .fields ._FIELD_ARG_NAMES :
94+ kwargs [entity_field_name ] = getattr (wrapped , entity_field_name )
95+ wrapped_metadata = wrapped .metadata
6596
6697 if kwargs .get ('serialization_alias' ) is None :
6798 kwargs ['serialization_alias' ] = kwargs .get ('alias' )
@@ -70,6 +101,8 @@ def __init__(
70101 kwargs ['validation_alias' ] = kwargs .get ('alias' )
71102
72103 super ().__init__ (** kwargs )
104+ self .metadata .extend (wrapped_metadata )
105+
73106 self .location = location
74107 self .path = path
75108 self .ns = ns
@@ -168,7 +201,7 @@ def wrapped(
168201
169202
170203@dc .dataclass
171- class ComputedXmlEntityInfo (pd .fields .ComputedFieldInfo ):
204+ class ComputedXmlEntityInfo (pd .fields .ComputedFieldInfo , XmlEntityInfoP ):
172205 """
173206 Computed field xml meta-information.
174207 """
0 commit comments