Skip to content

Commit

Permalink
wrapped sub-elements serialization bug fixed.
Browse files Browse the repository at this point in the history
  • Loading branch information
dapper91 committed Jun 23, 2023
1 parent 5e983d5 commit 1fdff14
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 2 deletions.
2 changes: 2 additions & 0 deletions pydantic_xml/element/element.py
Expand Up @@ -257,6 +257,7 @@ def set_attributes(self, attributes: Dict[str, str]) -> None:

def append_element(self, element: 'XmlElement[NativeElement]') -> None:
self._state.elements.append(element)
self._state.next_element_idx += 1

def pop_text(self) -> Optional[str]:
result, self._state.text = self._state.text, None
Expand Down Expand Up @@ -295,6 +296,7 @@ def find_element_or_create(
if (sub_element := self._find_element(tag, search_mode)) is None:
sub_element = self.make_element(tag=tag, nsmap=nsmap)
self._state.elements.append(sub_element)
self._state.next_element_idx += 1

return sub_element

Expand Down
64 changes: 62 additions & 2 deletions tests/test_wrapped.py
Expand Up @@ -7,18 +7,54 @@

def test_wrapped_primitive_extraction():
class TestModel(BaseXmlModel, tag='model1'):
element0: str = element(tag='element')
data: int = wrapped('model2')
attr1: int = wrapped('model2', attr())
attr1: int = wrapped('model2', attr(name='attr1'))
element1: int = wrapped('model2', element())

xml = '''
<model1>
<element>text</element>
<model2 attr1="2">1<element1>3</element1></model2>
</model1>
'''

actual_obj = TestModel.from_xml(xml)
expected_obj = TestModel(data=1, attr1=2, element1=3)
expected_obj = TestModel(element0="text", data=1, attr1=2, element1=3)

assert actual_obj == expected_obj

actual_xml = actual_obj.to_xml()
assert_xml_equal(actual_xml, xml)


def test_wrapped_path_merge():
class TestModel(BaseXmlModel, tag='model1'):
element0: int = element(tag='element0')
element1: int = element(tag='element1')
attr0: int = wrapped('element1', attr(name='attr'))
element2: int = wrapped('element2/element3', element(tag='element4'))
element3: int = wrapped('element2/element3', element(tag='element5'))
attr1: int = wrapped('element2/element6', attr(name='attr'))
element4: int = element(tag='element7')

xml = '''
<model1>
<element0>0</element0>
<element1 attr="2">1</element1>
<element2>
<element3>
<element4>3</element4>
<element5>4</element5>
</element3>
<element6 attr="5"/>
</element2>
<element7>6</element7>
</model1>
'''

actual_obj = TestModel.from_xml(xml)
expected_obj = TestModel(element0=0, element1=1, attr0=2, element2=3, element3=4, attr1=5, element4=6)

assert actual_obj == expected_obj

Expand Down Expand Up @@ -214,3 +250,27 @@ class TestModel(BaseXmlModel, tag='model1'):

actual_xml = actual_obj.to_xml()
assert_xml_equal(actual_xml, xml)


def test_wrapped_root():
class TestSubModel(BaseXmlModel, tag='model3'):
attr1: int = attr()

class TestModel(BaseXmlModel, tag='model1'):
__root__: TestSubModel = wrapped('model2')

xml = '''
<model1>
<model2>
<model3 attr1="1"/>
</model2>
</model1>
'''

actual_obj = TestModel.from_xml(xml)
expected_obj = TestModel(__root__=TestSubModel(attr1=1))

assert actual_obj == expected_obj

actual_xml = actual_obj.to_xml()
assert_xml_equal(actual_xml, xml)

0 comments on commit 1fdff14

Please sign in to comment.