You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.8 KiB
53 lines
1.8 KiB
import traceback
|
|
|
|
from autotest_lib.tko import status_lib, utils as tko_utils
|
|
|
|
|
|
class parser(object):
|
|
"""
|
|
Abstract parser base class. Provides a generic implementation of the
|
|
standard parser interfaction functions. The derived classes must
|
|
implement a state_iterator method for this class to be useful.
|
|
"""
|
|
def start(self, job):
|
|
""" Initialize the parser for processing the results of
|
|
'job'."""
|
|
# initialize all the basic parser parameters
|
|
self.job = job
|
|
self.finished = False
|
|
self.line_buffer = status_lib.line_buffer()
|
|
# create and prime the parser state machine
|
|
self.state = self.state_iterator(self.line_buffer)
|
|
next(self.state)
|
|
|
|
def end(self, lines=[]):
|
|
""" Feed 'lines' into the parser state machine, signal to the
|
|
state machine that no more lines are forthcoming, and then
|
|
return a list of all the new test results produced."""
|
|
self.line_buffer.put_multiple(lines)
|
|
# run the state machine to clear out the buffer
|
|
self.finished = True
|
|
try:
|
|
return next(self.state)
|
|
except StopIteration:
|
|
msg = ("WARNING: parser was end()ed multiple times\n"
|
|
"Current traceback:\n" +
|
|
traceback.format_exc() +
|
|
"\nCurrent stack:\n" +
|
|
"".join(traceback.format_stack()))
|
|
tko_utils.dprint(msg)
|
|
return []
|
|
|
|
|
|
@staticmethod
|
|
def make_job(dir):
|
|
""" Create a new instance of the job model used by the
|
|
parser, given a results directory."""
|
|
raise NotImplementedError
|
|
|
|
|
|
def state_iterator(self, buffer):
|
|
""" A generator method that implements the actual parser
|
|
state machine. """
|
|
raise NotImplementedError
|