Files
udpak_semistruktur/generators/schema_dataklasser.py
2026-04-07 03:56:43 +02:00

111 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from __future__ import annotations
from dataclasses import dataclass, field
# ============================================================
# Datastrukturer
# ============================================================
@dataclass
class XsdChoiceElement:
element_navn: str
rod_sti: str
overliggende: list[str]
alternativer: list[tuple[str, str, str]] # (alt_navn, skabelon_navn, fuld_sti)
@dataclass
class XsdFelt:
"""
Repræsenterer ét felt i en complexType enten et element eller en attribut.
navn: Feltets navn, fx 'FirstName' eller 'currCode'
er_attribut: True hvis det er en XML-attribut (@navn i YAML)
xsd_type: Den originale XSD-type, fx 'xsd:string', 'xsd:date'
påkrævet: True hvis feltet er obligatorisk
er_liste: True hvis feltet kan forekomme flere gange (maxOccurs > 1)
er_tekst: True hvis feltet er et simpleContent-element tekstindholdet
er selve værdien og attributterne er metadata (fx MonAmnt_Type)
er_choice: True hvis feltet er ét alternativ i en choice
"""
navn: str
er_attribut: bool = False
xsd_type: str = "xsd:string"
påkrævet: bool = False
er_liste: bool = False
er_tekst: bool = False
er_choice: bool = False
xml_navn: str = "" # ← originalt XML-navn, sættes hvis navn omdøbes
@property
def felt_ref(self) -> str:
# Brug xml_navn hvis det er sat (dvs. navn er omdøbt)
ref_navn = self.xml_navn if self.xml_navn else self.navn
return f"@{ref_navn}" if self.er_attribut else ref_navn
@property
def yaml_navn(self) -> str:
return self.navn
@dataclass
class XsdSkabelonRef:
"""
Repræsenterer en reference til en anden navngiven complexType.
Bliver til '- skabelon: xxx' i YAML.
element_navn: Elementnavnet i XML, fx 'Name', 'Address'
skabelon_navn: Det afledte skabelonnavn, fx 'nameperson', 'address'
er_liste: True hvis maxOccurs > 1
påkrævet: True hvis minOccurs != 0
er_choice: True hvis elementet er ét alternativ i en choice
"""
element_navn: str
skabelon_navn: str
er_liste: bool = False
påkrævet: bool = False
er_choice: bool = False
@property
def prefix_felt(self) -> str:
return self.element_navn
@property
def prefix_navn(self) -> str:
navn = self.element_navn.lower()
return f"{navn.replace('.', '_').replace('-', '_')}_"
@dataclass
class XsdKompleksType:
"""
Repræsenterer en navngiven complexType bliver til en skabelon.
navn: Typens navn, fx 'PersonParty_Type'
felter: Liste af XsdFelt og/eller XsdSkabelonRef
er_ekstern: True hvis typen kommer fra en importeret XSD-fil
har_tekst: True hvis typen bruger simpleContent (fx MonAmnt_Type)
"""
navn: str
felter: list[XsdFelt | XsdSkabelonRef] = field(default_factory=list)
er_ekstern: bool = False
har_tekst: bool = False
@dataclass
class XsdListeElement:
"""
Repræsenterer et maxOccurs > 1 element bliver til en udtræk-fil.
element_navn: Elementets navn, fx 'CryptoUsers'
type_navn: Navngiven complexType, fx 'CryptoUsers_Type'
rod_sti: Fuld dot-separeret sti, fx 'CARF_OECD.CARFBody.CryptoUsers'
overliggende: Navne på overliggende liste-elementer
felter: Felter fra anonym inline type (kun hvis type_navn er tom)
er_simpel: True hvis antal felter < min_felter foldes ind som join
join_i_skabelon: Skabelonnavn der får join-kolonnen
"""
element_navn: str
type_navn: str = ""
rod_sti: str = ""
overliggende: list[str] = field(default_factory=list)
felter: list[XsdFelt | XsdSkabelonRef] = field(default_factory=list)
er_simpel: bool = False
join_i_skabelon: str = ""