summaryrefslogtreecommitdiff
path: root/interfaces.py
diff options
context:
space:
mode:
Diffstat (limited to 'interfaces.py')
-rw-r--r--interfaces.py47
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.
+ """