class FileParsingError(SyntaxError): pass class Record: def __init__(self): self.name = None self.data = {} self.children = {} self.parents = {} def __getitem__(self, item): return self.data[item] def __setitem__(self, item, value): self.data[item] = value def __repr__(self): return f"[{self.data}, {len(self.children)}, {len(self.parents)}]" class RecordCollection(): def __init__(self, file): if type(file) is str: fd = open(file, "r") elif hasattr(file, "read"): fd = file self._fromFile(fd) self._parent() def _fromFile(self, fd): lines = [i.rstrip() for i in fd.readlines()] self.objects = {} current = Record() for i in lines: ind = i[0:2] == ' ' if ind: spl = i[2:].split(': ') try: current[spl[0]] = spl[1] except IndexError: raise FileParsingError(f"error parsing '{i}'") else: try: name = i.split(' ')[1][0:-1] except IndexError: current = Record() continue current.name = name self.objects[name] = current def _parent(self): for i in self.objects: current = self.objects[i] try: for j, k in zip( current['inherit'].split(' '), [int(i) for i in current['inherit_order'].split(' ')] ): current.parents[j] = self.objects[j] self.objects[j].children[k] = current except KeyError: pass def findEntrypoints(self): ret = [] for i in self.objects: if not self.objects[i].parents: ret.append(self.objects[i]) return ret