# Copyright 2016 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Sequenced feedback request.""" from __future__ import print_function import input_handlers import request import textwrap class _RequestAction(object): """An interface of a single action in a sequenced feedback request.""" def execute(self): """Performs the action.""" raise NotImplementedError class _QuestionRequestAction(_RequestAction): """A question to be presented to a user.""" def __init__(self, blurb, input_handler, prompt=None): self.input_handler = input_handler blurb_supp, prompt_supp = input_handler.get_choices_supplements() # Initialize the question blurb string. self.blurb = self._format_text(blurb) if blurb_supp: self.blurb += '\n' + blurb_supp # Initialize the input prompt string. if prompt is None: prompt = '' if prompt_supp: if prompt: prompt += ' ' prompt += prompt_supp self.prompt = self._format_text(prompt) if self.prompt: self.prompt += ' ' def _format_text(self, text): """Formats a blob of text for writing to standard output.""" return textwrap.fill(text.strip()) def execute(self): if self.blurb: print(self.blurb, end=('\n' if self.prompt else ' ')) while True: try: return self.input_handler.process(raw_input(self.prompt)) except input_handlers.InputError: print('Invalid input, try again') class SequencedFeedbackRequest(request.FeedbackRequest): """A request consisting of a sequence of interactive actions.""" def __init__(self, *args): super(SequencedFeedbackRequest, self).__init__(*args) self._actions = [] def _append_action(self, action): self._actions.append(action) def append_question(self, blurb, input_handler, prompt=None): """Appends a question to the request sequence. @param blurb: The text to print prior to asking for input. @param input_handler: The input handler object. @param prompt: String to print when polling for input. """ attrs = {'test': self.test, 'dut': self.dut} blurb = blurb or '' self._append_action(_QuestionRequestAction( blurb % attrs, input_handler, prompt=(prompt and prompt % attrs))) def execute(self): """Executes the sequence of request actions. @return: The return value of the last action. @raise request.FeedbackRequestError: Failed during sequence execution. """ ret = None for action in self._actions: ret = action.execute() return ret