Пример #1
0
    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)
Пример #2
0
    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
Пример #3
0
    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")