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