| # 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 |