def test_loaderror(): assert str(LoadError("derp")) == "derp" error_context = ErrorContext() error = LoadError("herk") error.error_context = error_context assert str(error) == error.message assert str(error) == "At unknown line: herk" error_context.line = 0 assert str(error) == "At line 1: herk" error_context.line = "error_cause" assert str(error) == "herk"
def deserialize(self, files): """ files is a dictionary of filename to filedata. deserialize must allow for any key to be missing. If a file is not present in that dictionary, it should be like an empty string in that dictionary. """ self.root = root = self.roottype(self, self.nodecreator, loading_in_progress=True) root.loading_in_progress = True log_data = files.get('log', u'') self.root.log = file_storage.load_log(log_data) stack = [] lastnode = root lastindent = -1 metadata_allowed_here = False error_context = ErrorContext() # mutable thingy try: life_data = files.get('life', u'') parser = file_storage.parse_string(life_data) parser.error_context = error_context for indent, is_metadata, nodeid, node_type, text in parser: if node_type == "": indent = lastindent if lastnode is not None and lastnode.node_type != "": indent += 1 if indent > lastindent: if indent > lastindent + 1: raise LoadError("indented too far") stack.append(lastnode) metadata_allowed_here = True elif indent < lastindent: stack = stack[:int(indent) + 1] lastindent = indent parent = stack[-1] if is_metadata: if not metadata_allowed_here: raise LoadError('metadata in the wrong place') parent.setoption(node_type, text) lastnode = None else: if node_type != "-": metadata_allowed_here = False node = self.nodecreator.create(node_type, text, parent, nodeid=nodeid) if node is not None: parent.addchild(node) lastnode = node except LoadError as e: e.error_context = error_context raise except Exception as e: new_e = LoadError("UNHANDLED ERROR:\n %s" % traceback.format_exc()) new_e.error_context = error_context raise new_e if self.make_skeleton: root.make_skeleton() root.load_finished() for depth, node in root.iter_flat_children(): node.load_finished() # enable instant load_finished() on node creation root.loading_in_progress = False