From 7f85bd8ed84b23fc4e683ab90fc7babe288f1a27 Mon Sep 17 00:00:00 2001 From: Ben Connors Date: Tue, 24 Sep 2019 22:20:51 -0400 Subject: Initial commit - Basic functionality - Can save/load to XML format (see examples folder) - Can create and edit fixtures and channels - Can create and edit Scenes and Audios - Live updates through callbacks --- interfaces.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 interfaces.py (limited to 'interfaces.py') 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. + """ -- cgit v1.2.3