import logging
import warnings
from dataclasses import dataclass, field
from importlib.metadata import version
from typing import List, Optional
import cssutils
from smpl_doc import doc
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 = version("feynml")
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)