1*9c5db199SXin Liimport collections, re 2*9c5db199SXin Liimport common 3*9c5db199SXin Lifrom autotest_lib.client.common_lib import log 4*9c5db199SXin Li 5*9c5db199SXin Li 6*9c5db199SXin Listatuses = log.job_statuses 7*9c5db199SXin Li 8*9c5db199SXin Li 9*9c5db199SXin Lidef is_worse_than(lhs, rhs): 10*9c5db199SXin Li """ Compare two statuses and return a boolean indicating if the LHS status 11*9c5db199SXin Li is worse than the RHS status.""" 12*9c5db199SXin Li return (statuses.index(lhs) < statuses.index(rhs)) 13*9c5db199SXin Li 14*9c5db199SXin Li 15*9c5db199SXin Lidef is_worse_than_or_equal_to(lhs, rhs): 16*9c5db199SXin Li """ Compare two statuses and return a boolean indicating if the LHS status 17*9c5db199SXin Li is worse than or equal to the RHS status.""" 18*9c5db199SXin Li if lhs == rhs: 19*9c5db199SXin Li return True 20*9c5db199SXin Li return is_worse_than(lhs, rhs) 21*9c5db199SXin Li 22*9c5db199SXin Li 23*9c5db199SXin LiDEFAULT_BLOCKLIST = ('\r\x00',) 24*9c5db199SXin Lidef clean_raw_line(raw_line, blocklist=DEFAULT_BLOCKLIST): 25*9c5db199SXin Li """Strip blocklisted characters from raw_line.""" 26*9c5db199SXin Li return re.sub('|'.join(blocklist), '', raw_line) 27*9c5db199SXin Li 28*9c5db199SXin Li 29*9c5db199SXin Liclass status_stack(object): 30*9c5db199SXin Li def __init__(self): 31*9c5db199SXin Li self.status_stack = [statuses[-1]] 32*9c5db199SXin Li 33*9c5db199SXin Li 34*9c5db199SXin Li def current_status(self): 35*9c5db199SXin Li return self.status_stack[-1] 36*9c5db199SXin Li 37*9c5db199SXin Li 38*9c5db199SXin Li def update(self, new_status): 39*9c5db199SXin Li if new_status not in statuses: 40*9c5db199SXin Li return 41*9c5db199SXin Li if is_worse_than(new_status, self.current_status()): 42*9c5db199SXin Li self.status_stack[-1] = new_status 43*9c5db199SXin Li 44*9c5db199SXin Li 45*9c5db199SXin Li def start(self): 46*9c5db199SXin Li self.status_stack.append(statuses[-1]) 47*9c5db199SXin Li 48*9c5db199SXin Li 49*9c5db199SXin Li def end(self): 50*9c5db199SXin Li result = self.status_stack.pop() 51*9c5db199SXin Li if len(self.status_stack) == 0: 52*9c5db199SXin Li self.status_stack.append(statuses[-1]) 53*9c5db199SXin Li return result 54*9c5db199SXin Li 55*9c5db199SXin Li 56*9c5db199SXin Li def size(self): 57*9c5db199SXin Li return len(self.status_stack) - 1 58*9c5db199SXin Li 59*9c5db199SXin Li 60*9c5db199SXin Liclass line_buffer(object): 61*9c5db199SXin Li def __init__(self): 62*9c5db199SXin Li self.buffer = collections.deque() 63*9c5db199SXin Li 64*9c5db199SXin Li 65*9c5db199SXin Li def get(self): 66*9c5db199SXin Li return self.buffer.pop() 67*9c5db199SXin Li 68*9c5db199SXin Li 69*9c5db199SXin Li def put(self, line): 70*9c5db199SXin Li self.buffer.appendleft(line) 71*9c5db199SXin Li 72*9c5db199SXin Li 73*9c5db199SXin Li def put_multiple(self, lines): 74*9c5db199SXin Li self.buffer.extendleft(lines) 75*9c5db199SXin Li 76*9c5db199SXin Li 77*9c5db199SXin Li def put_back(self, line): 78*9c5db199SXin Li self.buffer.append(line) 79*9c5db199SXin Li 80*9c5db199SXin Li 81*9c5db199SXin Li def size(self): 82*9c5db199SXin Li return len(self.buffer) 83