| Index: tools/telemetry/third_party/typ/typ/arg_parser.py
|
| diff --git a/tools/telemetry/third_party/typ/typ/arg_parser.py b/tools/telemetry/third_party/typ/typ/arg_parser.py
|
| deleted file mode 100644
|
| index cb51711a369a586d79ececca02e685c698cd31e9..0000000000000000000000000000000000000000
|
| --- a/tools/telemetry/third_party/typ/typ/arg_parser.py
|
| +++ /dev/null
|
| @@ -1,315 +0,0 @@
|
| -# Copyright 2014 Google Inc. All rights reserved.
|
| -#
|
| -# Licensed under the Apache License, Version 2.0 (the "License");
|
| -# you may not use this file except in compliance with the License.
|
| -# You may obtain a copy of the License at
|
| -#
|
| -# http://www.apache.org/licenses/LICENSE-2.0
|
| -#
|
| -# Unless required by applicable law or agreed to in writing, software
|
| -# distributed under the License is distributed on an "AS IS" BASIS,
|
| -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -# See the License for the specific language governing permissions and
|
| -# limitations under the License.
|
| -
|
| -import argparse
|
| -import optparse
|
| -
|
| -from typ.host import Host
|
| -
|
| -
|
| -class _Bailout(Exception):
|
| - pass
|
| -
|
| -
|
| -DEFAULT_COVERAGE_OMIT = ['*/typ/*', '*/site-packages/*']
|
| -DEFAULT_STATUS_FORMAT = '[%f/%t] '
|
| -DEFAULT_SUFFIXES = ['*_test.py', '*_unittest.py']
|
| -
|
| -
|
| -class ArgumentParser(argparse.ArgumentParser):
|
| -
|
| - @staticmethod
|
| - def add_option_group(parser, title, discovery=False,
|
| - running=False, reporting=False, skip=None):
|
| - # TODO: Get rid of this when telemetry upgrades to argparse.
|
| - ap = ArgumentParser(add_help=False, version=False, discovery=discovery,
|
| - running=running, reporting=reporting)
|
| - optlist = ap.optparse_options(skip=skip)
|
| - group = optparse.OptionGroup(parser, title)
|
| - group.add_options(optlist)
|
| - parser.add_option_group(group)
|
| -
|
| - def __init__(self, host=None, add_help=True, version=True, discovery=True,
|
| - reporting=True, running=True):
|
| - super(ArgumentParser, self).__init__(prog='typ', add_help=add_help)
|
| -
|
| - self._host = host or Host()
|
| - self.exit_status = None
|
| -
|
| - self.usage = '%(prog)s [options] [tests...]'
|
| -
|
| - if version:
|
| - self.add_argument('-V', '--version', action='store_true',
|
| - help='Print the typ version and exit.')
|
| -
|
| - if discovery:
|
| - self.add_argument('-f', '--file-list', metavar='FILENAME',
|
| - action='store',
|
| - help=('Takes the list of tests from the file '
|
| - '(use "-" for stdin).'))
|
| - self.add_argument('--all', action='store_true',
|
| - help=('Run all the tests, including the ones '
|
| - 'normally skipped.'))
|
| - self.add_argument('--isolate', metavar='glob', default=[],
|
| - action='append',
|
| - help=('Globs of tests to run in isolation '
|
| - '(serially).'))
|
| - self.add_argument('--skip', metavar='glob', default=[],
|
| - action='append',
|
| - help=('Globs of test names to skip ('
|
| - 'defaults to %(default)s).'))
|
| - self.add_argument('--suffixes', metavar='glob', default=[],
|
| - action='append',
|
| - help=('Globs of test filenames to look for ('
|
| - 'can specify multiple times; defaults '
|
| - 'to %s).' % DEFAULT_SUFFIXES))
|
| -
|
| - if reporting:
|
| - self.add_argument('--builder-name',
|
| - help=('Builder name to include in the '
|
| - 'uploaded data.'))
|
| - self.add_argument('-c', '--coverage', action='store_true',
|
| - help='Reports coverage information.')
|
| - self.add_argument('--coverage-source', action='append',
|
| - default=[],
|
| - help=('Directories to include when running and '
|
| - 'reporting coverage (defaults to '
|
| - '--top-level-dir plus --path)'))
|
| - self.add_argument('--coverage-omit', action='append',
|
| - default=[],
|
| - help=('Globs to omit when reporting coverage '
|
| - '(defaults to %s).' %
|
| - DEFAULT_COVERAGE_OMIT))
|
| - self.add_argument('--coverage-annotate', action='store_true',
|
| - help=('Produce an annotate source report.'))
|
| - self.add_argument('--coverage-show-missing', action='store_true',
|
| - help=('Show missing line ranges in coverage '
|
| - 'report.'))
|
| - self.add_argument('--master-name',
|
| - help=('Buildbot master name to include in the '
|
| - 'uploaded data.'))
|
| - self.add_argument('--metadata', action='append', default=[],
|
| - help=('Optional key=value metadata that will '
|
| - 'be included in the results.'))
|
| - self.add_argument('--test-results-server',
|
| - help=('If specified, uploads the full results '
|
| - 'to this server.'))
|
| - self.add_argument('--test-type',
|
| - help=('Name of test type to include in the '
|
| - 'uploaded data (e.g., '
|
| - '"telemetry_unittests").'))
|
| - self.add_argument('--write-full-results-to', metavar='FILENAME',
|
| - action='store',
|
| - help=('If specified, writes the full results to '
|
| - 'that path.'))
|
| - self.add_argument('--write-trace-to', metavar='FILENAME',
|
| - action='store',
|
| - help=('If specified, writes the trace to '
|
| - 'that path.'))
|
| - self.add_argument('tests', nargs='*', default=[],
|
| - help=argparse.SUPPRESS)
|
| -
|
| - if running:
|
| - self.add_argument('-d', '--debugger', action='store_true',
|
| - help='Runs the tests under the debugger.')
|
| - self.add_argument('-j', '--jobs', metavar='N', type=int,
|
| - default=self._host.cpu_count(),
|
| - help=('Runs N jobs in parallel '
|
| - '(defaults to %(default)s).'))
|
| - self.add_argument('-l', '--list-only', action='store_true',
|
| - help='Lists all the test names found and exits.')
|
| - self.add_argument('-n', '--dry-run', action='store_true',
|
| - help=argparse.SUPPRESS)
|
| - self.add_argument('-q', '--quiet', action='store_true',
|
| - default=False,
|
| - help=('Runs as quietly as possible '
|
| - '(only prints errors).'))
|
| - self.add_argument('-s', '--status-format',
|
| - default=self._host.getenv('NINJA_STATUS',
|
| - DEFAULT_STATUS_FORMAT),
|
| - help=argparse.SUPPRESS)
|
| - self.add_argument('-t', '--timing', action='store_true',
|
| - help='Prints timing info.')
|
| - self.add_argument('-v', '--verbose', action='count', default=0,
|
| - help=('Prints more stuff (can specify multiple '
|
| - 'times for more output).'))
|
| - self.add_argument('--passthrough', action='store_true',
|
| - default=False,
|
| - help='Prints all output while running.')
|
| - self.add_argument('--retry-limit', type=int, default=0,
|
| - help='Retries each failure up to N times.')
|
| - self.add_argument('--terminal-width', type=int,
|
| - default=self._host.terminal_width(),
|
| - help=argparse.SUPPRESS)
|
| - self.add_argument('--overwrite', action='store_true',
|
| - default=None,
|
| - help=argparse.SUPPRESS)
|
| - self.add_argument('--no-overwrite', action='store_false',
|
| - dest='overwrite', default=None,
|
| - help=argparse.SUPPRESS)
|
| -
|
| - if discovery or running:
|
| - self.add_argument('-P', '--path', action='append', default=[],
|
| - help=('Adds dir to sys.path (can specify '
|
| - 'multiple times).'))
|
| - self.add_argument('--top-level-dir', default=None,
|
| - help=('Sets the top directory of project '
|
| - '(used when running subdirs).'))
|
| -
|
| - def parse_args(self, args=None, namespace=None):
|
| - try:
|
| - rargs = super(ArgumentParser, self).parse_args(args=args,
|
| - namespace=namespace)
|
| - except _Bailout:
|
| - return None
|
| -
|
| - for val in rargs.metadata:
|
| - if '=' not in val:
|
| - self._print_message('Error: malformed --metadata "%s"' % val)
|
| - self.exit_status = 2
|
| -
|
| - if rargs.test_results_server:
|
| - if not rargs.builder_name:
|
| - self._print_message('Error: --builder-name must be specified '
|
| - 'along with --test-result-server')
|
| - self.exit_status = 2
|
| - if not rargs.master_name:
|
| - self._print_message('Error: --master-name must be specified '
|
| - 'along with --test-result-server')
|
| - self.exit_status = 2
|
| - if not rargs.test_type:
|
| - self._print_message('Error: --test-type must be specified '
|
| - 'along with --test-result-server')
|
| - self.exit_status = 2
|
| -
|
| - if not rargs.suffixes:
|
| - rargs.suffixes = DEFAULT_SUFFIXES
|
| -
|
| - if not rargs.coverage_omit:
|
| - rargs.coverage_omit = DEFAULT_COVERAGE_OMIT
|
| -
|
| - if rargs.debugger: # pragma: no cover
|
| - rargs.jobs = 1
|
| - rargs.passthrough = True
|
| -
|
| - if rargs.overwrite is None:
|
| - rargs.overwrite = self._host.stdout.isatty() and not rargs.verbose
|
| -
|
| - return rargs
|
| -
|
| - # Redefining built-in 'file' pylint: disable=W0622
|
| -
|
| - def _print_message(self, msg, file=None):
|
| - self._host.print_(msg=msg, stream=file, end='\n')
|
| -
|
| - def print_help(self, file=None):
|
| - self._print_message(msg=self.format_help(), file=file)
|
| -
|
| - def error(self, message, bailout=True): # pylint: disable=W0221
|
| - self.exit(2, '%s: error: %s\n' % (self.prog, message), bailout=bailout)
|
| -
|
| - def exit(self, status=0, message=None, # pylint: disable=W0221
|
| - bailout=True):
|
| - self.exit_status = status
|
| - if message:
|
| - self._print_message(message, file=self._host.stderr)
|
| - if bailout:
|
| - raise _Bailout()
|
| -
|
| - def optparse_options(self, skip=None):
|
| - skip = skip or []
|
| - options = []
|
| - for action in self._actions:
|
| - args = [flag for flag in action.option_strings if flag not in skip]
|
| - if not args or action.help == '==SUPPRESS==':
|
| - # must either be a positional argument like 'tests'
|
| - # or an option we want to skip altogether.
|
| - continue
|
| -
|
| - kwargs = {
|
| - 'default': action.default,
|
| - 'dest': action.dest,
|
| - 'help': action.help,
|
| - 'metavar': action.metavar,
|
| - 'type': action.type,
|
| - 'action': _action_str(action)
|
| - }
|
| - options.append(optparse.make_option(*args, **kwargs))
|
| - return options
|
| -
|
| - def argv_from_args(self, args):
|
| - default_parser = ArgumentParser(host=self._host)
|
| - default_args = default_parser.parse_args([])
|
| - argv = []
|
| - tests = []
|
| - d = vars(args)
|
| - for k in sorted(d.keys()):
|
| - v = d[k]
|
| - argname = _argname_from_key(k)
|
| - action = self._action_for_key(k)
|
| - action_str = _action_str(action)
|
| - if k == 'tests':
|
| - tests = v
|
| - continue
|
| - if getattr(default_args, k) == v:
|
| - # this arg has the default value, so skip it.
|
| - continue
|
| -
|
| - assert action_str in ['append', 'count', 'store', 'store_true']
|
| - if action_str == 'append':
|
| - for el in v:
|
| - argv.append(argname)
|
| - argv.append(el)
|
| - elif action_str == 'count':
|
| - for _ in range(v):
|
| - argv.append(argname)
|
| - elif action_str == 'store':
|
| - argv.append(argname)
|
| - argv.append(str(v))
|
| - else:
|
| - # action_str == 'store_true'
|
| - argv.append(argname)
|
| -
|
| - return argv + tests
|
| -
|
| - def _action_for_key(self, key):
|
| - for action in self._actions:
|
| - if action.dest == key:
|
| - return action
|
| -
|
| - assert False, ('Could not find an action for %s' # pragma: no cover
|
| - % key)
|
| -
|
| -
|
| -def _action_str(action):
|
| - # Access to a protected member pylint: disable=W0212
|
| - assert action.__class__ in (
|
| - argparse._AppendAction,
|
| - argparse._CountAction,
|
| - argparse._StoreAction,
|
| - argparse._StoreTrueAction
|
| - )
|
| -
|
| - if isinstance(action, argparse._AppendAction):
|
| - return 'append'
|
| - if isinstance(action, argparse._CountAction):
|
| - return 'count'
|
| - if isinstance(action, argparse._StoreAction):
|
| - return 'store'
|
| - if isinstance(action, argparse._StoreTrueAction):
|
| - return 'store_true'
|
| -
|
| -
|
| -def _argname_from_key(key):
|
| - return '--' + key.replace('_', '-')
|
|
|