diff --git a/xsdata/codegen/sanitizer.py b/xsdata/codegen/sanitizer.py index 7f918abb6..fb02a9b02 100644 --- a/xsdata/codegen/sanitizer.py +++ b/xsdata/codegen/sanitizer.py @@ -172,27 +172,39 @@ def rename_classes(self, classes: List[Class]): total_elements = sum(x.is_element for x in classes) for target in classes: if not target.is_element or total_elements > 1: - self.rename_class(target) - def rename_class(self, target: Class): + if target.tag == Tag.COMPLEX_TYPE: + suffix = "Base" + else: + suffix = "" + + self.rename_class(target, suffix) + + def rename_class(self, target: Class, suffix): """Find the next available class identifier, save the original name in the class metadata and update the class qualified name and all classes that depend on the target class.""" qname = target.qname namespace, name = split_qname(target.qname) - target.qname = self.next_qname(namespace, name) + target.qname = self.next_qname(namespace, name, suffix) target.meta_name = name self.container.reset(target, qname) for item in self.container.iterate(): self.rename_class_dependencies(item, qname, target.qname) - def next_qname(self, namespace: str, name: str) -> str: + def next_qname(self, namespace: str, name: str, suffix: str) -> str: """Append the next available index number for the given namespace and local name.""" - index = 0 + reserved = set(map(alnum, self.container.data.keys())) + if suffix: + qname = build_qname(namespace, f"{name}_{suffix}") + if alnum(qname) not in reserved: + return qname + + index = 0 while True: index += 1 qname = build_qname(namespace, f"{name}_{index}") @@ -217,7 +229,7 @@ def rename_attr_dependencies(self, attr: Attr, search: str, replace: str): """Search and replace the old qualified attribute type name with the new one in the attr types, choices and default value.""" for attr_type in attr.types: - if attr_type.qname == search: + if not attr_type.forward and attr_type.qname == search: attr_type.qname = replace if isinstance(attr.default, str) and attr.default.startswith("@enum@"): diff --git a/xsdata/codegen/validator.py b/xsdata/codegen/validator.py index 0b6fa68b7..0904485e2 100644 --- a/xsdata/codegen/validator.py +++ b/xsdata/codegen/validator.py @@ -127,7 +127,7 @@ def find_circular_group(cls, target: Class) -> Optional[Attr]: def mark_strict_types(cls, classes: List[Class]): """If there is a class derived from xs:element update all xs:complexTypes derived classes as strict types.""" - + return try: element = next(obj for obj in classes if obj.is_element) for obj in classes: