View difference between Paste ID: zdNHdGBz and qj6Xtget
SHOW: | | - or go back to the newest paste.
1
import copy
2
3
def p_empty(_, position=0):
4
    return 0
5
6
def p_is(predictor):
7
    if isinstance(predictor, basestring):
8
        def p_is(line, position=0):
9
            if len(line) > position and line[position:].startswith(predictor):
10
                return len(predictor), predictor
11
            else:
12
                return 0, None
13
    else:
14
        def p_is(line, position=0):
15
            if len(line) > position:
16
                result = predictor(line[position:])
17
            else:
18
                result = 0
19
            if result:
20
                return result, line[position:position+result]
21
            else:
22
                return 0, None
23
    return p_is
24
25
def string_to_p_is(original):
26
    if isinstance(original, basestring):
27
        return p_is(original)
28
    else:
29
        return original
30
31
def p_while(original):
32
    original = string_to_p_is(original)
33
    def p_while(line, position=0):
34
        start = position
35
        result = []
36
        while len(line) > position:
37
            current = original(line, position=position)
38
            if current[0]:
39
                position += current[0]
40
                result.append(current[1])
41
            else:
42
                break
43
        if position > start:
44
            assert(len(result))
45
            return position - start, result
46
        else:
47
            assert(not len(result))
48
            return 0, None
49
    return p_while
50
51
def p_any(*plist):
52
    plist = map(string_to_p_is, plist)
53
    def p_any(line, position=0):
54
        if len(line) > position:
55
            for p in plist:
56
                current = p(line, position=position)
57
                if current[0]:
58
                    return current
59
            else:
60
                return 0, None
61
    return p_any
62
63
def p_for(*plist):
64
    plist = map(string_to_p_is, plist)
65
    def p_for(line, position=0):
66
        start = position
67
        result = []
68
        for p in plist:
69
            if len(line) > position:
70
                current = p(line, position=position)
71
                if current[0]:
72
                    position += current[0]
73
                    result.append(current[1])
74
                    continue
75
                else:
76
                    break
77
            else:
78
                break
79
        else:
80
            if position > start:
81
                return position - start, result
82
        return 0, None
83
    return p_for
84
85
def p_until(original):
86
    original = string_to_p_is(original)
87
    def p_until(line, position=0):
88
        start = position
89
        while len(line) > position:
90
            current = original(line, position=position)
91
            if current[0]:
92
                break
93
            else:
94
                position += 1
95
        if position > start:
96
            return position - start, line[start:position]
97
        else:
98
            return 0, None
99
    return p_until
100
101
def p_digit():
102
    def predictor(line):
103
        if line[0].isdigit():
104
            return 1
105
        else:
106
            return 0
107
    return p_is(predictor)
108
109
def p_number():
110
    return p_apply(p_while(p_digit()), lambda r: int(''.join(r)))
111
112
def p_in(*pset):
113
    pset = set(filter(lambda p: len(p), pset))
114
    for p in pset:
115
        for a in pset:
116
            if a != p and a.startswith(p):
117
                raise RuntimeError("p_in: %s is prefix for %s" % (p, a))
118
    return p_any(pset)
119
120
def p_not_in(pset):
121
    return p_until(p_in(pset))
122
123
def p_apply(original, true, false=None):
124
    def p_apply(line, position=0):
125
        result = original(line, position=position)
126
        if result[0]:
127
            result = (result[0], true(result[1]))
128
        else:
129
            result = (result[0], false)
130
        return result
131
    return p_apply
132
133
def p_between(prefix, suffix):
134
    return p_apply(p_for(prefix, p_until(suffix), suffix), lambda r: r[1])
135
136
def p_scidbtestharness():
137
# Example of lines for parse:
138
# [1][Wed Oct 31 12:08:30 2012]: t.checkin.repart_unbounded ______________________________________________________________ Executing
139
# [1][Wed Oct 31 12:08:30 2012]: t.checkin.repart_unbounded .............................................................. PASS
140
    status = dict(Executing='START',
141
                  PASS='PASS',
142
                  EXECUTOR_FAILED='FAIL',
143
                  FILES_DIFFER='DIFF')
144-
    def transform(v):
144+
145-
        return v[2], v[3]
145+
146
                         p_between(': t.', ' '),
147
                         p_apply(p_any(p_for(p_while('_'),
148
                                             ' ',
149
                                             'Executing'),
150
                                       p_for(p_while('.'),
151
                                             ' ',
152
                                             p_any('PASS', 'EXECUTOR_FAILED', 'FILES_DIFFER')
153
                                             )
154
                                       ),
155
                                 lambda v: status.get(v[-1])
156
                                 )
157
                         ),
158
                   lambda v: v[2], v[3]
159
                   )