def process_attribute_default_enum(self, target: Class, attr: Attr): """ Convert string literal default value for enum fields. Loop through all attributes types and search for enum sources. If an enum source exist map the default string literal value to a qualified name. If the source class in inner promote it to root classes. """ source_found = False for attr_type in attr.types: source = self.find_enum(target, attr_type) if not source: continue source_found = True source_attr = next( (x for x in source.attrs if x.default == attr.default), None) if source_attr: if attr_type.forward: self.promote_inner_class(target, source) attr.default = f"@enum@{source.name}::{source_attr.name}" return if source_found: logger.warning( "No enumeration member matched %s.%s default value `%s`", target.name, attr.local_name, attr.default, ) attr.default = None
def process_attribute_restrictions(cls, attr: Attr): """Sanitize attribute required flag by comparing the min/max occurrences restrictions.""" restrictions = attr.restrictions min_occurs = restrictions.min_occurs or 0 max_occurs = restrictions.max_occurs or 0 if attr.is_attribute: restrictions.min_occurs = None restrictions.max_occurs = None elif attr.is_tokens: restrictions.required = None if max_occurs <= 1: restrictions.min_occurs = None restrictions.max_occurs = None elif attr.xml_type is None or min_occurs == max_occurs == 1: restrictions.required = True restrictions.min_occurs = None restrictions.max_occurs = None elif min_occurs == 0 and max_occurs < 2: restrictions.required = None restrictions.min_occurs = None restrictions.max_occurs = None attr.default = None attr.fixed = False else: # max_occurs > 1 restrictions.min_occurs = min_occurs restrictions.required = None attr.fixed = False if attr.default or attr.fixed or attr.restrictions.nillable: restrictions.required = None
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: attr_type.qname = replace if isinstance(attr.default, str) and attr.default.startswith("@enum@"): attr.default = attr.default.replace(search, replace) for choice in attr.choices: self.rename_attr_dependencies(choice, search, replace)
def rename_attr_dependencies(self, attr: Attr, reference: int, 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.reference == reference: attr_type.qname = replace if isinstance(attr.default, str) and attr.default.startswith("@enum@"): member = text.suffix(attr.default, "::") attr.default = f"@enum@{replace}::{member}" for choice in attr.choices: self.rename_attr_dependencies(choice, reference, replace)
def process_attribute_default(self, target: Class, attr: Attr): """ Sanitize attribute default value. Cases: 1. List fields can not have a fixed value. 2. Optional fields or xsi:type can not have a default or fixed value. 3. Convert string literal default value for enum fields. """ if attr.is_list: attr.fixed = False if attr.is_optional or attr.is_xsi_type: attr.fixed = False attr.default = None if attr.default and not attr.is_enumeration: self.process_attribute_default_enum(target, attr)