Example #1
0
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"
Example #2
0
    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