| Index: infra_libs/app.py
 | 
| diff --git a/infra_libs/app.py b/infra_libs/app.py
 | 
| deleted file mode 100644
 | 
| index b04a98bf25e0e99c6b63e6735b8b365180748bc0..0000000000000000000000000000000000000000
 | 
| --- a/infra_libs/app.py
 | 
| +++ /dev/null
 | 
| @@ -1,136 +0,0 @@
 | 
| -# Copyright 2015 The Chromium Authors. All rights reserved.
 | 
| -# Use of this source code is governed by a BSD-style license that can be
 | 
| -# found in the LICENSE file.
 | 
| -
 | 
| -import argparse
 | 
| -import datetime
 | 
| -import logging
 | 
| -import os
 | 
| -import sys
 | 
| -
 | 
| -import psutil
 | 
| -
 | 
| -from infra_libs import logs
 | 
| -from infra_libs import ts_mon
 | 
| -
 | 
| -
 | 
| -class BaseApplication(object):
 | 
| -  """Encapsulates common boilerplate for setting up an application.
 | 
| -
 | 
| -  Subclasses must implement the main() method, and will usually also implement
 | 
| -  add_argparse_options().
 | 
| -
 | 
| -  By default this will initialise logging and timeseries monitoring (ts_mon)
 | 
| -  modules.
 | 
| -
 | 
| -  Minimal example::
 | 
| -
 | 
| -    import infra_libs
 | 
| -
 | 
| -    class MyApplication(infra_libs.BaseApplication):
 | 
| -      def main(self, opts):
 | 
| -        # Do stuff.
 | 
| -
 | 
| -    if __name__ == '__main__':
 | 
| -      MyApplication().run()
 | 
| -
 | 
| -  Class variables (override these in your class definition):
 | 
| -    PROG_NAME: The program name to display in the --help message.  Defaults to
 | 
| -               sys.argv[0].  Passed to argparse.ArgumentParser.
 | 
| -    DESCRIPTION: Text to display in the --help message.  Passed to
 | 
| -                 argparse.ArgumentParser.
 | 
| -    USES_STANDARD_LOGGING: Whether to configure the standard logging libraries.
 | 
| -                           Defaults to True.
 | 
| -    USES_TS_MON: Whether to configure timeseries monitoring.  Defaults to True.
 | 
| -
 | 
| -  Instance variables (use these in your application):
 | 
| -    opts: The argparse.Namespace containing parsed commandline arguments.
 | 
| -  """
 | 
| -
 | 
| -  PROG_NAME = None
 | 
| -  DESCRIPTION = None
 | 
| -  USES_STANDARD_LOGGING = True
 | 
| -  USES_TS_MON = True
 | 
| -
 | 
| -  def __init__(self):
 | 
| -    self.opts = None
 | 
| -    self.parser = None
 | 
| -
 | 
| -  def add_argparse_options(self, parser):
 | 
| -    """Register any arguments used by this application.
 | 
| -
 | 
| -    Override this method and call parser.add_argument().
 | 
| -
 | 
| -    Args:
 | 
| -      parser: An argparse.ArgumentParser object.
 | 
| -    """
 | 
| -
 | 
| -    if self.USES_STANDARD_LOGGING:
 | 
| -      logs.add_argparse_options(parser)
 | 
| -    if self.USES_TS_MON:
 | 
| -      ts_mon.add_argparse_options(parser)
 | 
| -
 | 
| -  def process_argparse_options(self, options):
 | 
| -    """Process any commandline arguments.
 | 
| -
 | 
| -    Args:
 | 
| -      options: An argparse.Namespace object.
 | 
| -    """
 | 
| -
 | 
| -    if self.USES_STANDARD_LOGGING:
 | 
| -      logs.process_argparse_options(options)
 | 
| -    if self.USES_TS_MON:
 | 
| -      ts_mon.process_argparse_options(options)
 | 
| -
 | 
| -  def main(self, opts):
 | 
| -    """Your application's main method.
 | 
| -
 | 
| -    Do the work of your application here.  When this method returns the
 | 
| -    application will exit.
 | 
| -
 | 
| -    Args:
 | 
| -      opts: An argparse.Namespace containing parsed commandline options.  This
 | 
| -        is passed as an argument for convenience but is also accessible as an
 | 
| -        instance variable (self.opts).
 | 
| -
 | 
| -    Return:
 | 
| -      An integer exit status, or None to use an exit status of 0.
 | 
| -    """
 | 
| -    raise NotImplementedError
 | 
| -
 | 
| -  def run(self, args=None):
 | 
| -    """Main application entry point."""
 | 
| -
 | 
| -    if args is None:  # pragma: no cover
 | 
| -      args = sys.argv
 | 
| -
 | 
| -    # Add and parse commandline args.
 | 
| -    self.parser = argparse.ArgumentParser(
 | 
| -        description=self.DESCRIPTION,
 | 
| -        prog=self.PROG_NAME or args[0],
 | 
| -        formatter_class=argparse.RawTextHelpFormatter)
 | 
| -
 | 
| -    self.add_argparse_options(self.parser)
 | 
| -    self.opts = self.parser.parse_args(args[1:])
 | 
| -    self.process_argparse_options(self.opts)
 | 
| -
 | 
| -    # Print a startup log message.
 | 
| -    logging.info('Process started at %s', datetime.datetime.utcfromtimestamp(
 | 
| -        psutil.Process().create_time()).isoformat())
 | 
| -    logging.info('Command line arguments:')
 | 
| -    for index, arg in enumerate(sys.argv):
 | 
| -      logging.info('argv[%d]: %s', index, arg)
 | 
| -    logging.info('Process id %d', os.getpid())
 | 
| -    logging.info('Current working directory %s', os.getcwd())
 | 
| -
 | 
| -    # Run the application's main function.
 | 
| -    try:
 | 
| -      status = self.main(self.opts)
 | 
| -    except Exception:
 | 
| -      logging.exception('Uncaught exception, exiting:')
 | 
| -      if self.USES_TS_MON:
 | 
| -        # Flushing ts_mon to try to report the exception.
 | 
| -        ts_mon.flush()
 | 
| -      status = 1
 | 
| -
 | 
| -    sys.exit(status)
 | 
| 
 |