Skip to content

Commit c391978

Browse files
Merge pull request #871 from tpazderka/fix_unpacking
Fix Choice with unbound Any
2 parents 97d7188 + 18435e2 commit c391978

File tree

2 files changed

+49
-2
lines changed

2 files changed

+49
-2
lines changed

src/zeep/xsd/elements/indicators.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -426,7 +426,10 @@ def parse_kwargs(self, kwargs, name, available_kwargs):
426426
result.append(choice_value)
427427
break
428428
else:
429-
if element.name in value:
429+
if isinstance(element, Any):
430+
result.append(value)
431+
break
432+
elif element.name in value:
430433
choice_value = value.get(element.name)
431434
result.append({element.name: choice_value})
432435
break
@@ -539,7 +542,7 @@ def _find_element_to_render(self, value):
539542
if name is not None:
540543
try:
541544
choice_value = value[name]
542-
except KeyError:
545+
except (KeyError, TypeError):
543546
choice_value = value
544547
else:
545548
choice_value = value

tests/test_xsd_indicators_choice.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,50 @@ def test_choice_element_with_any():
308308
assert result.item_1 == 'foo'
309309

310310

311+
def test_choice_element_with_only_any():
312+
node = etree.fromstring("""
313+
<?xml version="1.0"?>
314+
<xsd:schema
315+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
316+
xmlns:tns="http://tests.python-zeep.org/"
317+
elementFormDefault="qualified"
318+
targetNamespace="http://tests.python-zeep.org/">
319+
<xsd:element name="container">
320+
<xsd:complexType>
321+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
322+
<xsd:any processContents="lax"/>
323+
</xsd:choice>
324+
<xsd:attribute name="name" type="xsd:QName" use="required" />
325+
<xsd:attribute name="something" type="xsd:boolean" use="required" />
326+
<xsd:anyAttribute namespace="##other" processContents="lax"/>
327+
</xsd:complexType>
328+
</xsd:element>
329+
<xsd:element name="item_1" type="xsd:string" />
330+
</xsd:schema>
331+
""".strip())
332+
schema = xsd.Schema(node)
333+
element = schema.get_element('ns0:container')
334+
item_1 = schema.get_element('ns0:item_1')
335+
any_object = xsd.AnyObject(item_1, item_1('foo'))
336+
value = element(_value_1=[any_object], name="foo", something="bar")
337+
338+
expected = """
339+
<document>
340+
<ns0:container xmlns:ns0="http://tests.python-zeep.org/" name="foo" something="true">
341+
<ns0:item_1>foo</ns0:item_1>
342+
</ns0:container>
343+
</document>
344+
"""
345+
node = etree.Element('document')
346+
element.render(node, value)
347+
assert_nodes_equal(expected, node)
348+
349+
result = element.parse(node[0], schema)
350+
assert result.name == 'foo'
351+
assert result.something is True
352+
assert result._value_1 == ['foo']
353+
354+
311355
def test_choice_element_with_any_max_occurs():
312356
schema = xsd.Schema(load_xml("""
313357
<schema targetNamespace="http://tests.python-zeep.org/"

0 commit comments

Comments
 (0)