def parse_element(self, element: Element, objects: List[Any]) -> Tuple: params: Dict = dict() ParserUtils.bind_element_attrs(params, self.meta, element) ParserUtils.bind_element_text(params, self.meta, element) ParserUtils.bind_element_children(params, self.meta, self.position, objects) ParserUtils.bind_element_wild_text(params, self.meta, element) qname = QName(element.tag) obj = self.meta.clazz(**params) return qname, obj
def test_bind_elements( self, mock_bind_element_param, mock_find_eligible_wildcard, mock_bind_element_wildcard_param, ): @dataclass class A: x: int y: int = field(init=False) w: object = field(metadata=dict(type=XmlType.WILDCARD)) ctx = XmlContext() meta = ctx.build(A) x = meta.find_var(QName("x")) y = meta.find_var(QName("y")) w = meta.find_var(QName("wild")) wild_element = AnyElement(qname="foo") objects = [ ("foo", 0), (x.qname, 1), (y.qname, 2), (w.qname, None), (w.qname, wild_element), ] mock_bind_element_param.side_effect = [True, False, False] mock_find_eligible_wildcard.side_effect = [None, w] params = {} ParserUtils.bind_element_children(params, meta, 1, objects) mock_bind_element_param.assert_has_calls( [ mock.call(params, x, 1), mock.call(params, w, ""), mock.call(params, w, wild_element), ] ) mock_find_eligible_wildcard.assert_has_calls( [mock.call(meta, w.qname, params), mock.call(meta, QName("foo"), params)] ) mock_bind_element_wildcard_param.assert_called_once_with( params, w, w.qname, wild_element )
def parse_element(self, element: Element, objects: List[Any]) -> Tuple: """ Parse the given element attributes/text, find all child objects and mixed content and initialize a new dataclass instance. :return: A tuple of the object's qualified name and the new object. """ params: Dict = {} ParserUtils.bind_element_attrs(params, self.meta, element) ParserUtils.bind_element_text(params, self.meta, element) ParserUtils.bind_element_children(params, self.meta, self.position, objects) ParserUtils.bind_element_wild_text(params, self.meta, element) qname = QName(element.tag) obj = self.meta.clazz(**params) return qname, obj