From a62b51826bc1733a20a77ac4322c5228a2998bbf Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Mon, 26 Aug 2024 21:53:44 +0500 Subject: [PATCH 1/2] collection of tagged union bug fixed. --- .../serializers/factories/heterogeneous.py | 1 + .../serializers/factories/homogeneous.py | 2 + .../serializers/factories/named_tuple.py | 1 + tests/test_unions.py | 40 +++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/pydantic_xml/serializers/factories/heterogeneous.py b/pydantic_xml/serializers/factories/heterogeneous.py index 367ae81..91dc4ab 100644 --- a/pydantic_xml/serializers/factories/heterogeneous.py +++ b/pydantic_xml/serializers/factories/heterogeneous.py @@ -93,6 +93,7 @@ def from_core_schema(schema: pcs.TupleSchema, ctx: Serializer.Context) -> Serial SchemaTypeFamily.MAPPING, SchemaTypeFamily.TYPED_MAPPING, SchemaTypeFamily.UNION, + SchemaTypeFamily.TAGGED_UNION, SchemaTypeFamily.IS_INSTANCE, SchemaTypeFamily.CALL, ): diff --git a/pydantic_xml/serializers/factories/homogeneous.py b/pydantic_xml/serializers/factories/homogeneous.py index c96575d..5259c7f 100644 --- a/pydantic_xml/serializers/factories/homogeneous.py +++ b/pydantic_xml/serializers/factories/homogeneous.py @@ -111,6 +111,7 @@ def from_core_schema(schema: HomogeneousCollectionTypeSchema, ctx: Serializer.Co SchemaTypeFamily.MAPPING, SchemaTypeFamily.TYPED_MAPPING, SchemaTypeFamily.UNION, + SchemaTypeFamily.TAGGED_UNION, SchemaTypeFamily.IS_INSTANCE, SchemaTypeFamily.CALL, SchemaTypeFamily.TUPLE, @@ -122,6 +123,7 @@ def from_core_schema(schema: HomogeneousCollectionTypeSchema, ctx: Serializer.Co if items_type_family not in ( SchemaTypeFamily.MODEL, SchemaTypeFamily.UNION, + SchemaTypeFamily.TAGGED_UNION, SchemaTypeFamily.TUPLE, SchemaTypeFamily.CALL, ) and ctx.entity_location is None: diff --git a/pydantic_xml/serializers/factories/named_tuple.py b/pydantic_xml/serializers/factories/named_tuple.py index 4504481..27cbca0 100644 --- a/pydantic_xml/serializers/factories/named_tuple.py +++ b/pydantic_xml/serializers/factories/named_tuple.py @@ -63,6 +63,7 @@ def from_core_schema(schema: pcs.CallSchema, ctx: Serializer.Context) -> Seriali SchemaTypeFamily.MAPPING, SchemaTypeFamily.TYPED_MAPPING, SchemaTypeFamily.UNION, + SchemaTypeFamily.TAGGED_UNION, SchemaTypeFamily.IS_INSTANCE, SchemaTypeFamily.CALL, ): diff --git a/tests/test_unions.py b/tests/test_unions.py index c88dd98..b55f6d1 100644 --- a/tests/test_unions.py +++ b/tests/test_unions.py @@ -390,6 +390,46 @@ class TestModel(RootXmlModel, tag='model'): assert_xml_equal(actual_xml, xml) +@pytest.mark.skipif(sys.version_info < (3, 9), reason="requires python 3.9 and above") +def test_tagged_union_collection(): + from typing import Annotated + + class SubModel1(BaseXmlModel): + type: Literal['type1'] = attr() + data: int + + class SubModel2(BaseXmlModel): + type: Literal['type2'] = attr() + data: str + + class TestModel(BaseXmlModel, tag='model'): + collection: List[Annotated[Union[SubModel1, SubModel2], Field(discriminator='type')]] = element('submodel') + + xml = ''' + + 1 + a + b + 2 + + ''' + + actual_obj = TestModel.from_xml(xml) + expected_obj = TestModel( + collection=[ + SubModel1(type='type1', data='1'), + SubModel2(type='type2', data='a'), + SubModel2(type='type2', data='b'), + SubModel1(type='type1', data='2'), + ], + ) + + assert actual_obj == expected_obj + + actual_xml = actual_obj.to_xml() + assert_xml_equal(actual_xml, xml) + + def test_union_snapshot(): class SubModel1(BaseXmlModel, tag='submodel'): attr1: int = attr() From b918ae724646e8cdd7ceddf92269b10e1863bf02 Mon Sep 17 00:00:00 2001 From: Dmitry Pershin Date: Mon, 26 Aug 2024 22:19:36 +0500 Subject: [PATCH 2/2] bump version 2.12.1. --- CHANGELOG.rst | 6 ++++++ pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 5785334..dabd93e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,12 @@ Changelog ========= +2.12.1 (2024-08-26) +------------------- + +- collection of tagged union deserialization bug fixed. See https://github.com/dapper91/pydantic-xml/issues/206 + + 2.12.0 (2024-08-24) ------------------- diff --git a/pyproject.toml b/pyproject.toml index f38c823..b317c3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "pydantic-xml" -version = "2.12.0" +version = "2.12.1" description = "pydantic xml extension" authors = ["Dmitry Pershin "] license = "Unlicense"