| Index: third_party/typ/tools/cov.py
|
| diff --git a/third_party/typ/tools/cov.py b/third_party/typ/tools/cov.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..f3a11c03fb1530f8584b304545982d1e541b0a26
|
| --- /dev/null
|
| +++ b/third_party/typ/tools/cov.py
|
| @@ -0,0 +1,137 @@
|
| +#!/usr/bin/python
|
| +# 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 sys
|
| +import textwrap
|
| +
|
| +is_python3 = bool(sys.version_info.major == 3)
|
| +
|
| +
|
| +ALL_PRAGMAS = ['no cover', 'no win32', 'python2', 'python3', 'untested',
|
| + 'win32']
|
| +DEFAULT_PRAGMAS = ALL_PRAGMAS[:]
|
| +
|
| +if is_python3:
|
| + DEFAULT_PRAGMAS.remove('python3')
|
| +else:
|
| + DEFAULT_PRAGMAS.remove('python2')
|
| +
|
| +if sys.platform == 'win32':
|
| + DEFAULT_PRAGMAS.remove('win32')
|
| +else:
|
| + DEFAULT_PRAGMAS.remove('no win32')
|
| +
|
| +
|
| +def add_arguments(parser):
|
| + parser.add_argument('--no-pragmas', action='store_true', default=False,
|
| + help='Show all uncovered lines (no pragmas).')
|
| + parser.add_argument('--path', action='append', default=[],
|
| + help='Prepend given directories to sys.path.')
|
| + parser.add_argument('--pragma', action='append', default=[],
|
| + help=('The coverage pragmas to honor '
|
| + '(defaults to %s).' % DEFAULT_PRAGMAS))
|
| + parser.add_argument('--show', action='append', default=[],
|
| + help='Show code protected by the specified pragmas '
|
| + '(uses all pragmas *except* for the ones '
|
| + 'specified).')
|
| + parser.add_argument('--show-missing', action='store_true',
|
| + default=False, help='Show missing lines.')
|
| + parser.add_argument('--source', action='append', default=[],
|
| + help='Limit coverage data to the given directories.')
|
| +
|
| + parser.formatter_class = argparse.RawTextHelpFormatter
|
| + parser.epilog = textwrap.dedent("""
|
| + Valid pragma values are:
|
| + 'no cover': The default coverage pragma, this now means we
|
| + truly cannot cover it.
|
| + 'no win32': Code that only executes when not on Windows.
|
| + 'python2': Code that only executes under Python2.
|
| + 'python3': Code that only executees under Python3.
|
| + 'untested': Code that does not yet have tests.
|
| + 'win32': Code that only executes on Windows.
|
| +
|
| + In typ, we aim for 'no cover' to only apply to code that executes only
|
| + when coverage is not available (and hence can never be counted). Most
|
| + code, if annotated at all, should be 'untested', and we should strive
|
| + for 'untested' to not be used, either.
|
| + """)
|
| +
|
| +
|
| +def argv_from_args(args):
|
| + argv = []
|
| + if args.no_pragmas:
|
| + argv.append('--no-pragmas')
|
| + for arg in args.path:
|
| + argv.extend(['--path', arg])
|
| + for arg in args.show:
|
| + argv.extend(['--show', arg])
|
| + if args.show_missing:
|
| + argv.append('--show-missing')
|
| + for arg in args.source:
|
| + argv.extend(['--source', arg])
|
| + for arg in args.pragma:
|
| + argv.extend(['--pragma', arg])
|
| + return argv
|
| +
|
| +
|
| +def main(argv=None):
|
| + parser = argparse.ArgumentParser()
|
| + add_arguments(parser)
|
| + args, remaining_args = parser.parse_known_args(argv)
|
| +
|
| + for path in args.path:
|
| + if path not in sys.path:
|
| + sys.path.append(path)
|
| +
|
| + try:
|
| + import coverage
|
| + from coverage.execfile import run_python_module, run_python_file
|
| + except ImportError:
|
| + print("Error: coverage is not available.")
|
| + sys.exit(1)
|
| +
|
| + cov = coverage.coverage(source=args.source)
|
| + cov.erase()
|
| + cov.clear_exclude()
|
| +
|
| + if args.no_pragmas:
|
| + args.pragma = []
|
| +
|
| + args.pragma = args.pragma or DEFAULT_PRAGMAS
|
| +
|
| + for pragma in args.show:
|
| + if pragma in args.pragma:
|
| + args.pragma.remove(pragma)
|
| +
|
| + for pragma in args.pragma:
|
| + cov.exclude('pragma: %s' % pragma)
|
| +
|
| + ret = 0
|
| + cov.start()
|
| + try:
|
| + if remaining_args[0] == '-m':
|
| + run_python_module(remaining_args[1], remaining_args)
|
| + else:
|
| + run_python_file(remaining_args[0], remaining_args)
|
| + except SystemExit as e:
|
| + ret = e.code
|
| + cov.stop()
|
| + cov.report(show_missing=args.show_missing)
|
| + return ret
|
| +
|
| +
|
| +if __name__ == '__main__':
|
| + sys.exit(main())
|
|
|