blob: eb576437180a6df1d31270a91db2fabde1d57ae3 [file] [log] [blame]
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)
self.state.next()
def process_lines(self, lines):
""" Feed 'lines' into the parser state machine, and return
a list of all the new test results produced."""
self.line_buffer.put_multiple(lines)
try:
return self.state.next()
except StopIteration:
msg = ("WARNING: parser was called to process status "
"lines after it was end()ed\n"
"Current traceback:\n" +
traceback.format_exc() +
"\nCurrent stack:\n" +
"".join(traceback.format_stack()))
tko_utils.dprint(msg)
return []
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 self.state.next()
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