195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file.
501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''Base class and interface for tools.
701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''
801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass Tool(object):
1101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  '''Base class for all tools.  Tools should use their docstring (i.e. the
1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  class-level docstring) for the help they want to have printed when they
1301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  are invoked.'''
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  # Interface (abstract methods)
1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def ShortDescription(self):
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Returns a short description of the functionality of the tool.'''
2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    raise NotImplementedError()
2201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def Run(self, global_options, my_arguments):
2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Runs the tool.
2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Args:
2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      global_options: object grit_runner.Options
2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      my_arguments: [arg1 arg2 ...]
2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    Return:
3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      0 for success, non-0 for error
3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    raise NotImplementedError()
3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #
3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  # Base class implementation
3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  #
3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def __init__(self):
4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.o = None
4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def SetOptions(self, opts):
4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.o = opts
4401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def Out(self, text):
4601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Always writes out 'text'.'''
4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.o.output_stream.write(text)
4801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def VerboseOut(self, text):
5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Writes out 'text' if the verbose option is on.'''
5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if self.o.verbose:
5201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.o.output_stream.write(text)
5301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def ExtraVerboseOut(self, text):
5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''Writes out 'text' if the extra-verbose option is on.
5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    '''
5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    if self.o.extra_verbose:
5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      self.o.output_stream.write(text)
59