| Index: swarm_client/utils/tools.py
|
| ===================================================================
|
| --- swarm_client/utils/tools.py (revision 235167)
|
| +++ swarm_client/utils/tools.py (working copy)
|
| @@ -1,135 +0,0 @@
|
| -# Copyright 2013 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.
|
| -
|
| -"""Various utility functions and classes not specific to any single area."""
|
| -
|
| -import logging
|
| -import logging.handlers
|
| -import optparse
|
| -import os
|
| -import sys
|
| -import time
|
| -import traceback
|
| -
|
| -
|
| -class OptionParserWithLogging(optparse.OptionParser):
|
| - """Adds --verbose option."""
|
| -
|
| - # Set to True to enable --log-file options.
|
| - enable_log_file = True
|
| -
|
| - def __init__(self, verbose=0, log_file=None, **kwargs):
|
| - kwargs.setdefault('description', sys.modules['__main__'].__doc__)
|
| - optparse.OptionParser.__init__(self, **kwargs)
|
| - self.add_option(
|
| - '-v', '--verbose',
|
| - action='count',
|
| - default=verbose,
|
| - help='Use multiple times to increase verbosity')
|
| - if self.enable_log_file:
|
| - self.add_option(
|
| - '-l', '--log-file',
|
| - default=log_file,
|
| - help='The name of the file to store rotating log details')
|
| - self.add_option(
|
| - '--no-log', action='store_const', const='', dest='log_file',
|
| - help='Disable log file')
|
| -
|
| - def parse_args(self, *args, **kwargs):
|
| - options, args = optparse.OptionParser.parse_args(self, *args, **kwargs)
|
| - levels = [logging.ERROR, logging.INFO, logging.DEBUG]
|
| - level = levels[min(len(levels) - 1, options.verbose)]
|
| -
|
| - logging_console = logging.StreamHandler()
|
| - logging_console.setFormatter(logging.Formatter(
|
| - '%(levelname)5s %(module)15s(%(lineno)3d): %(message)s'))
|
| - logging_console.setLevel(level)
|
| - logging.getLogger().setLevel(level)
|
| - logging.getLogger().addHandler(logging_console)
|
| -
|
| - if self.enable_log_file and options.log_file:
|
| - # This is necessary otherwise attached handler will miss the messages.
|
| - logging.getLogger().setLevel(logging.DEBUG)
|
| -
|
| - logging_rotating_file = logging.handlers.RotatingFileHandler(
|
| - options.log_file,
|
| - maxBytes=10 * 1024 * 1024,
|
| - backupCount=5,
|
| - encoding='utf-8')
|
| - # log files are always at DEBUG level.
|
| - logging_rotating_file.setLevel(logging.DEBUG)
|
| - logging_rotating_file.setFormatter(logging.Formatter(
|
| - '%(asctime)s %(levelname)-8s %(module)15s(%(lineno)3d): %(message)s'))
|
| - logging.getLogger().addHandler(logging_rotating_file)
|
| -
|
| - return options, args
|
| -
|
| -
|
| -class Profiler(object):
|
| - """Context manager that records time spend inside its body."""
|
| - def __init__(self, name):
|
| - self.name = name
|
| - self.start_time = None
|
| -
|
| - def __enter__(self):
|
| - self.start_time = time.time()
|
| - return self
|
| -
|
| - def __exit__(self, _exc_type, _exec_value, _traceback):
|
| - time_taken = time.time() - self.start_time
|
| - logging.info('Profiling: Section %s took %3.3f seconds',
|
| - self.name, time_taken)
|
| -
|
| -
|
| -class Unbuffered(object):
|
| - """Disable buffering on a file object."""
|
| - def __init__(self, stream):
|
| - self.stream = stream
|
| -
|
| - def write(self, data):
|
| - self.stream.write(data)
|
| - if '\n' in data:
|
| - self.stream.flush()
|
| -
|
| - def __getattr__(self, attr):
|
| - return getattr(self.stream, attr)
|
| -
|
| -
|
| -def disable_buffering():
|
| - """Makes this process and child processes stdout unbuffered."""
|
| - if not os.environ.get('PYTHONUNBUFFERED'):
|
| - # Since sys.stdout is a C++ object, it's impossible to do
|
| - # sys.stdout.write = lambda...
|
| - sys.stdout = Unbuffered(sys.stdout)
|
| - os.environ['PYTHONUNBUFFERED'] = 'x'
|
| -
|
| -
|
| -def fix_python_path(cmd):
|
| - """Returns the fixed command line to call the right python executable."""
|
| - out = cmd[:]
|
| - if out[0] == 'python':
|
| - out[0] = sys.executable
|
| - elif out[0].endswith('.py'):
|
| - out.insert(0, sys.executable)
|
| - return out
|
| -
|
| -
|
| -def report_error(error):
|
| - """Prints a error to stderr, wrapping it into header and footer.
|
| -
|
| - That way errors can be reliably extracted from logs. It's indented to be used
|
| - only for non recoverable unexpected errors. Is should NOT be used for input
|
| - validation, command line argument errors, etc.
|
| -
|
| - Arguments:
|
| - error: error message string (possibly multiple lines) or an instance of
|
| - Exception subclass. In the later case a traceback will also be
|
| - reported. It's assumed that |report_error| is called in an except
|
| - block where |error| was caught.
|
| - """
|
| - print >> sys.stderr, '[------ Swarming Error ------]'
|
| - print >> sys.stderr, str(error)
|
| - if isinstance(error, Exception):
|
| - print >> sys.stderr, traceback.format_exc(),
|
| - print >> sys.stderr, '[----------------------------]'
|
|
|