summaryrefslogtreecommitdiff
path: root/lib/yaml/error.py
blob: 2fae3eb6bf2035298001768a3118740e42fd7119 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

__all__ = ['Marker', 'YAMLError', 'MarkedYAMLError']

class Marker:

    def __init__(self, name, line, column, buffer, pointer):
        self.name = name
        self.line = line
        self.column = column
        self.buffer = buffer
        self.pointer = pointer

    def get_snippet(self, indent=4, max_length=75):
        if self.buffer is None:
            return None
        head = ''
        start = self.pointer
        while start > 0 and self.buffer[start-1] not in u'\0\r\n\x85\u2028\u2029':
            start -= 1
            if self.pointer-start > max_length/2-1:
                head = ' ... '
                start += 5
                break
        tail = ''
        end = self.pointer
        while end < len(self.buffer) and self.buffer[end] not in u'\0\r\n\x85\u2028\u2029':
            end += 1
            if end-self.pointer > max_length/2-1:
                tail = ' ... '
                end -= 5
                break
        snippet = self.buffer[start:end].encode('utf-8')
        return ' '*indent + head + snippet + tail + '\n'  \
                + ' '*(indent+self.pointer-start+len(head)) + '^'

    def __str__(self):
        snippet = self.get_snippet()
        where = "  in \"%s\", line %d, column %d"   \
                % (self.name, self.line+1, self.column+1)
        if snippet is not None:
            where += ":\n"+snippet
        return where

class YAMLError(Exception):
    pass

class MarkedYAMLError(YAMLError):

    def __init__(self, context=None, context_marker=None,
            problem=None, problem_marker=None):
        self.context = context
        self.context_marker = context_marker
        self.problem = problem
        self.problem_marker = problem_marker

    def __str__(self):
        lines = []
        #for (place, marker) in [(self.context, self.context_marker),
        #                        (self.problem, self.problem_marker)]:
        #    if place is not None:
        #        lines.append(place)
        #        if marker is not None:
        #            lines.append(str(marker))
        if self.context is not None:
            lines.append(self.context)
            if self.context_marker is not None  \
                and (self.problem is None or self.problem_marker is None
                        or self.context_marker.name != self.problem_marker.name
                        or self.context_marker.line != self.problem_marker.line
                        or self.context_marker.column != self.problem_marker.column):
                lines.append(str(self.context_marker))
        if self.problem is not None:
            lines.append(self.problem)
            if self.problem_marker is not None:
                lines.append(str(self.problem_marker))
        return '\n'.join(lines)