diff options
Diffstat (limited to 'interfaces.py')
-rw-r--r-- | interfaces.py | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/interfaces.py b/interfaces.py new file mode 100644 index 0000000..e0a904a --- /dev/null +++ b/interfaces.py @@ -0,0 +1,47 @@ +"""Module containing various interfaces.""" + +from abc import ABCMeta, abstractmethod, abstractclassmethod +import xml.etree.ElementTree as et + +class XMLSerializable(metaclass=ABCMeta): + """Interface for XML-serializable Workspace components.""" + @staticmethod + def int_or_none(v): + if v is None: + return None + + try: + v = int(v) + except (ValueError, TypeError): + return None + + return v + + @staticmethod + def indent(elem, indent=4, level=0): + """Pretty-indent the XML tree.""" + i = "\n" + level*(indent*' ') + if len(elem) > 0: + if not elem.text or not elem.text.strip(): + elem.text = i + (' '*indent) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + for elem in elem: + XMLSerializable.indent(elem, indent=indent, level=level+1) + if not elem.tail or not elem.tail.strip(): + elem.tail = i + else: + if level and (not elem.tail or not elem.tail.strip()): + elem.tail = i + + @abstractmethod + def serialize(self) -> et.Element: + """Serialize the object into an XML element.""" + + @abstractclassmethod + def deserialize(cls, w: "Workspace", e: et.Element): + """Deserialize the object from an XML element. + + This function may assume that all dependencies have already been loaded into the + passed workspace. + """ |