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
8 months ago
|
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
|