Skip to content

Commit

Permalink
from_xml, from_xml_tree methods typing fixed.
Browse files Browse the repository at this point in the history
  • Loading branch information
dapper91 committed Jun 23, 2023
1 parent 88c1c3c commit a6d40e6
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions pydantic_xml/model.py
@@ -1,5 +1,6 @@
import functools as ft
from typing import Any, Callable, ClassVar, Dict, Optional, Tuple, Type, Union
import typing
from typing import Any, Callable, ClassVar, Dict, Optional, Tuple, Type, TypeVar, Union

import pydantic as pd
import pydantic.fields
Expand Down Expand Up @@ -203,6 +204,9 @@ def _merge_configs(mcls, bases: Tuple[type], namespace: Dict[str, Any]) -> None:
setattr(self_config, 'xml_encoders', xml_encoders)


ModelT = TypeVar('ModelT', bound='BaseXmlModel')


class BaseXmlModel(pd.BaseModel, metaclass=XmlModelMeta):
"""
Base pydantic-xml model.
Expand Down Expand Up @@ -268,7 +272,7 @@ def update_forward_refs(cls, **kwargs: Any) -> None:
cls.__xml_serializer__.resolve_forward_refs()

@classmethod
def from_xml_tree(cls, root: etree.Element) -> Optional['BaseXmlModel']:
def from_xml_tree(cls: Type[ModelT], root: etree.Element) -> ModelT:
"""
Deserializes an xml element tree to an object of `cls` type.
Expand All @@ -279,15 +283,15 @@ def from_xml_tree(cls, root: etree.Element) -> Optional['BaseXmlModel']:
assert cls.__xml_serializer__ is not None, f"model {cls.__name__} is partially initialized"

if root.tag == cls.__xml_serializer__.element_name:
obj = cls.__xml_serializer__.deserialize(XmlElement.from_native(root))
obj = typing.cast(ModelT, cls.__xml_serializer__.deserialize(XmlElement.from_native(root)))
return obj
else:
raise errors.ParsingError(
f"root element not found (actual: {root.tag}, expected: {cls.__xml_serializer__.element_name})",
)

@classmethod
def from_xml(cls, source: Union[str, bytes]) -> Optional['BaseXmlModel']:
def from_xml(cls: Type[ModelT], source: Union[str, bytes]) -> ModelT:
"""
Deserializes an xml string to an object of `cls` type.
Expand Down Expand Up @@ -339,6 +343,9 @@ def to_xml(
return etree.tostring(self.to_xml_tree(encoder=encoder, skip_empty=skip_empty), **kwargs)


GenericModelT = TypeVar('GenericModelT', bound='BaseGenericXmlModel')


class BaseGenericXmlModel(BaseXmlModel, pd.generics.GenericModel):
"""
Base pydantic-xml generic model.
Expand All @@ -364,7 +371,7 @@ def __init_serializer__(cls) -> None:
super().__init_serializer__()

@classmethod
def from_xml_tree(cls, root: etree.Element) -> Optional['BaseXmlModel']:
def from_xml_tree(cls: Type[GenericModelT], root: etree.Element) -> GenericModelT:
"""
Deserializes an xml element tree to an object of `cls` type.
Expand Down

0 comments on commit a6d40e6

Please sign in to comment.