Source code for xsdata.models.codegen
from dataclasses import dataclass, field, replace
from typing import Any, List, Optional, Type
from xsdata.models.elements import ComplexType, Element
from xsdata.models.enums import TagType
[docs]@dataclass
class AttrType:
name: str
alias: Optional[str] = field(default=None)
forward_ref: bool = field(default=False)
[docs] def clone(self):
return replace(self)
[docs]@dataclass
class Attr:
name: str
local_name: str = field(init=False)
local_type: str
index: int
types: List[AttrType] = field(default_factory=list)
display_type: Optional[str] = field(default=None)
namespace: Optional[str] = field(default=None)
help: Optional[str] = field(default=None)
default: Optional[Any] = field(default=None)
# Restrictions
required: Optional[bool] = field(default=None)
min_occurs: Optional[int] = field(default=None)
max_occurs: Optional[int] = field(default=None)
min_exclusive: Optional[float] = field(default=None)
min_inclusive: Optional[float] = field(default=None)
min_length: Optional[float] = field(default=None)
max_exclusive: Optional[float] = field(default=None)
max_inclusive: Optional[float] = field(default=None)
max_length: Optional[float] = field(default=None)
total_digits: Optional[int] = field(default=None)
fraction_digits: Optional[int] = field(default=None)
length: Optional[int] = field(default=None)
white_space: Optional[str] = field(default=None)
pattern: Optional[str] = field(default=None)
nillable: Optional[bool] = field(default=None)
def __post_init__(self):
self.local_name = self.name
@property
def restrictions(self):
result = {
"required": self.required,
"min_occurs": self.min_occurs,
"max_occurs": self.max_occurs,
"min_exclusive": self.min_exclusive,
"max_exclusive": self.max_exclusive,
"min_inclusive": self.min_inclusive,
"max_inclusive": self.max_inclusive,
"min_length": self.min_length,
"max_length": self.max_length,
"length": self.length,
"fraction_digits": self.fraction_digits,
"pattern": self.pattern,
"total_digits": self.total_digits,
"white_space": self.white_space,
"nillable": self.nillable,
}
return {k: v for k, v in result.items() if v is not None}
@property
def is_list(self):
return self.max_occurs and self.max_occurs > 1
@property
def is_enumeration(self) -> bool:
return self.local_type == TagType.ENUMERATION.cname
[docs] def clone(self):
types = [type.clone() for type in self.types]
return replace(self, types=types)
[docs]@dataclass
class Extension:
name: str
index: int
type: str
@property
def is_restriction(self):
return self.type == TagType.RESTRICTION.cname
[docs] def clone(self):
return replace(self)
[docs]@dataclass
class Class:
name: str
type: Type
is_abstract: bool
namespace: Optional[str] = field(default=None)
local_name: str = field(init=False)
help: Optional[str] = field(default=None)
extensions: List[Extension] = field(default_factory=list)
attrs: List[Attr] = field(default_factory=list)
inner: List["Class"] = field(default_factory=list)
def __post_init__(self):
self.local_name = self.name
@property
def is_enumeration(self) -> bool:
return len(self.attrs) > 0 and self.attrs[0].is_enumeration
@property
def is_common(self):
return self.type not in [Element, ComplexType]
[docs] def clone(self):
inners = [inner.clone() for inner in self.inner]
extensions = [extension.clone() for extension in self.extensions]
attrs = [attr.clone() for attr in self.attrs]
return replace(self, inner=inners, extensions=extensions, attrs=attrs)
[docs]@dataclass
class Package:
name: str
source: str
alias: Optional[str] = field(default=None)