def test_bind_objects(self): @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("x") y = meta.find_var("y") w = meta.find_var("wild") wild_element = AnyElement(qname="foo") objects = [ ("foo", 0), (x.qname, 1), (y.qname, 2), (w.qname, None), (w.qname, wild_element), ] params = {} ParserUtils.bind_objects(params, meta, 1, objects) expected = { "x": 1, "w": AnyElement( children=[AnyElement(qname="w", text=""), AnyElement(qname="foo")] ), } self.assertEqual(expected, params)
def bind(self, qname: str, text: NoneStr, tail: NoneStr, objects: List) -> bool: params: Dict = {} wild_node = False text_node = False ParserUtils.bind_attrs(params, self.meta, self.attrs, self.ns_map) wild_var = self.meta.find_var(mode=FindMode.WILDCARD) if wild_var and wild_var.mixed: ParserUtils.bind_mixed_objects(params, wild_var, self.position, objects) else: ParserUtils.bind_objects(params, self.meta, self.position, objects) text_node = ParserUtils.bind_content(params, self.meta, text, self.ns_map) if not text_node and wild_var: ParserUtils.bind_wild_content(params, wild_var, text, tail, self.attrs, self.ns_map) obj = self.meta.clazz(**params) if self.derived: obj = DerivedElement(qname=qname, value=obj, substituted=self.substituted) objects.append((qname, obj)) if not wild_var and self.mixed and not wild_node: tail = ParserUtils.normalize_content(tail) if tail: objects.append((None, tail)) return True
def test_bind_objects_with_unassigned_object(self, mock_warning): a = make_dataclass("a", [("x", int)]) meta = XmlContext().build(a) params = {} objects = [("x", 1), ("y", 2)] ParserUtils.bind_objects(params, meta, 0, objects) self.assertEqual({"x": 1}, params) mock_warning.assert_called_once_with("Unassigned parsed object %s", "y")