Source code for xsdata.models.codegen
from dataclasses import dataclass
from dataclasses import field
from dataclasses import replace
from typing import Any
from typing import List
from typing import Optional
from typing import Type
from xsdata.models.elements import ComplexType
from xsdata.models.elements import Element
from xsdata.models.enums import DataType
from xsdata.models.enums import TagType
[docs]@dataclass
class AttrType:
name: str
index: int = field(default_factory=int)
alias: Optional[str] = field(default=None)
native: bool = field(default=False)
forward_ref: bool = field(default=False)
@property
def native_name(self) -> Optional[str]:
data_type = DataType.get_enum(self.name) if self.native else None
return data_type.local_name if data_type else None
@property
def native_type(self):
data_type = DataType.get_enum(self.name) if self.native else None
return data_type.local if data_type else None
[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)
explicit_timezone: 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,
"explicit_timezone": self.explicit_timezone,
"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_map(self) -> bool:
return (
len(self.types) == 1
and self.types[0].native
and isinstance(self.types[0].native_type, tuple)
)
@property
def is_factory(self):
return self.is_list or self.is_map
@property
def is_enumeration(self) -> bool:
return self.local_type == TagType.ENUMERATION
[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
[docs] def clone(self):
return replace(self)
[docs]@dataclass
class Class:
name: str
type: Type
is_abstract: bool
is_mixed: bool
namespace: Optional[str] = field(default=None)
local_name: str = field(init=False)
help: Optional[str] = field(default=None)
extensions: List[AttrType] = 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)