import logging
import warnings
from dataclasses import dataclass, field
from importlib.metadata import version
from typing import List, Optional
import cssutils
from xsdata.formats.dataclass.parsers import XmlParser
from xsdata.formats.dataclass.serializers import XmlSerializer
from xsdata.formats.dataclass.serializers.config import SerializerConfig
from feynml.feynmandiagram import FeynmanDiagram
# We don't want to see the cssutils warnings, since we have custom properties
cssutils.log.setLevel(logging.CRITICAL)
feynml_version = "0.0"
alias_meta = Meta
[docs]@dataclass
class Head:
class Meta:
name = "head"
metas: List[alias_meta] = field(
default_factory=list,
metadata={"name": "meta", "namespace": ""},
)
description: Optional[str] = field(default="", metadata={"type": "Element"})
style: Optional[str] = field(default="", metadata={"type": "Element"})
[docs]@dataclass
class FeynML:
class Meta:
name = "feynml"
version: Optional[str] = field(
default=feynml_version, metadata={"name": "version", "type": "Attribute"}
)
# post init to check version
def __post_init__(self):
if self.version < feynml_version:
warnings.warn("FeynML version is older than this parser.")
elif self.version > feynml_version:
warnings.warn("FeynML version is newer than this parser.")
self.head.metas.append(Meta("feynml", version("feynml")))
head: Optional[Head] = field(
default=Head(), metadata={"name": "head", "namespace": "", "type": "Element"}
)
diagrams: List[FeynmanDiagram] = field(
default_factory=list,
metadata={"name": "diagram", "type": "Element", "namespace": ""},
)
def get_diagram(self, idd):
for d in self.diagrams:
if d.id == idd:
return d
return None
[docs] def to_xml(self) -> str:
"""Return self as XML."""
config = SerializerConfig(pretty_print=True)
serializer = XmlSerializer(config=config)
return serializer.render(self)
[docs] @classmethod
def from_xml(cls, xml: str):
"""Load self from XML."""
parser = XmlParser()
return parser.from_string(xml, cls)