コード例 #1
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
コード例 #2
0
    def test_bind_attrs_skip_empty_attrs(self, mock_find_var):
        metadata = self.ctx.build(ProductType)

        params = {}
        ParserUtils.bind_attrs(params, metadata, {}, {})
        self.assertEqual(0, len(params))
        self.assertEqual(0, mock_find_var.call_count)
コード例 #3
0
    def test_bind_attrs(self, mock_parse_value, mock_parse_any_attribute):
        mock_parse_value.return_value = "2020-03-02"
        mock_parse_any_attribute.return_value = "foobar"
        metadata = self.ctx.build(ProductType)
        eff_date = metadata.find_var("effDate")

        params = {}
        ns_map = {}
        attrs = {"effDate": "2020-03-01", "foo": "bar"}

        ParserUtils.bind_attrs(params, metadata, attrs, ns_map)
        expected = {
            "eff_date": "2020-03-02",
            "other_attributes": {
                "foo": "foobar"
            },
        }
        self.assertEqual(expected, params)
        mock_parse_any_attribute.assert_called_once_with("bar", ns_map)
        mock_parse_value.assert_called_once_with(
            "2020-03-01",
            eff_date.types,
            eff_date.default,
            ns_map,
            eff_date.tokens,
            eff_date.format,
        )
コード例 #4
0
    def test_bind_attrs_doesnt_overwrite_values(self):
        metadata = self.ctx.build(ProductType)
        params = dict(eff_date="foo")
        attrs = {"effDate": "2020-03-01"}
        ns_map = {}

        ParserUtils.bind_attrs(params, metadata, attrs, ns_map)

        expected = {"eff_date": "foo", "other_attributes": {"effDate": "2020-03-01"}}
        self.assertEqual(expected, params)
コード例 #5
0
    def test_bind_attrs_ignore_init_false_vars(self):
        metadata = self.ctx.build(ProductType)
        eff_date = metadata.find_var("effDate")
        metadata.vars.remove(eff_date)
        metadata.vars.append(replace(eff_date, init=False, xml_type=None))

        params = {}
        attrs = {"effDate": "2020-03-01"}
        ns_map = {}

        ParserUtils.bind_attrs(params, metadata, attrs, ns_map)
        self.assertEqual({"other_attributes": {}}, params)