From 87c9bbe2a7660fac8dc6ff59df6f7b57bef99752 Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 17 May 2024 11:46:53 +0500 Subject: [PATCH] Fix bcf due xsdata update #4680 After https://github.com/tefra/xsdata/commit/93a8ca0548d1f7badb628ad9fd0327672abe140b `parser.register_namespace("xs", "http://www.w3.org/2001/XMLSchema")` started failing with `TypeError: PushParser.register_namespace() missing 1 required positional argument: 'uri'` since xsdata added a new argument `ns_map` (previously it was always using `parse.ns_map` under the hood, now it allows to provide some external dictionary). We just restore the original behaviour with internal `ns_map` by providing it explicitly. Specified xsdata version after that change in pyproject.toml. Also `serialize()` is now using `parser.ns_map` as a fallback value (otherwise why we do `parser.register_namespace` if we never used the `parser.ns_map`?) --- src/bcf/pyproject.toml | 2 +- src/bcf/src/bcf/xml_parser.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bcf/pyproject.toml b/src/bcf/pyproject.toml index 4d7f1b401b..e126abe165 100644 --- a/src/bcf/pyproject.toml +++ b/src/bcf/pyproject.toml @@ -13,7 +13,7 @@ readme = "README.md" requires-python = ">=3.8" keywords = ["IFC", "BCF", "BIM"] dependencies = [ - "xsdata", + "xsdata>=24.4", "numpy", "ifcopenshell", ] diff --git a/src/bcf/src/bcf/xml_parser.py b/src/bcf/src/bcf/xml_parser.py index 9f3878f769..ed13f747ce 100644 --- a/src/bcf/src/bcf/xml_parser.py +++ b/src/bcf/src/bcf/xml_parser.py @@ -10,7 +10,7 @@ from xsdata.formats.dataclass.serializers.config import SerializerConfig def build_xml_parser(context: Optional[XmlContext] = None) -> XmlParser: """Return a parser for an XML file.""" parser = XmlParser(context=context or XmlContext()) - parser.register_namespace("xs", "http://www.w3.org/2001/XMLSchema") + parser.register_namespace(ns_map=parser.ns_map, prefix="xs", uri="http://www.w3.org/2001/XMLSchema") return parser @@ -68,7 +68,7 @@ class XmlParserSerializer: """ return self.parser.from_bytes(xml, clazz) - def serialize(self, obj: T, ns_map: Optional[dict[str, str]] = None) -> str: + def serialize(self, obj: T, ns_map: Optional[dict[Optional[str], str]] = None) -> str: """ Serialize an object to XML. @@ -79,5 +79,5 @@ class XmlParserSerializer: Returns: The XML as string. """ - ns_map = ns_map or {"xs": "http://www.w3.org/2001/XMLSchema"} + ns_map = ns_map or self.parser.ns_map or {"xs": "http://www.w3.org/2001/XMLSchema"} return self.serializer.render(obj, ns_map)