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_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)
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, )
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)
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)