Spaces:
Sleeping
Sleeping
| #!/usr/bin/env python | |
| """ | |
| Script to generate test coverage reports. | |
| Usage: | |
| $ bin/coverage_report.py | |
| This will create a directory covhtml with the coverage reports. To | |
| restrict the analysis to a directory, you just need to pass its name as | |
| argument. For example: | |
| $ bin/coverage_report.py sympy/logic | |
| runs only the tests in sympy/logic/ and reports only on the modules in | |
| sympy/logic/. To also run slow tests use --slow option. You can also get a | |
| report on the parts of the whole sympy code covered by the tests in | |
| sympy/logic/ by following up the previous command with | |
| $ bin/coverage_report.py -c | |
| """ | |
| from __future__ import print_function | |
| import os | |
| import re | |
| import sys | |
| from argparse import ArgumentParser | |
| minver = '3.4' | |
| try: | |
| import coverage | |
| if coverage.__version__ < minver: | |
| raise ImportError | |
| except ImportError: | |
| print( | |
| "You need to install module coverage (version %s or newer required).\n" | |
| "See https://coverage.readthedocs.io/en/latest/ or \n" | |
| "https://launchpad.net/ubuntu/+source/python-coverage/" % minver) | |
| sys.exit(-1) | |
| omit_dir_patterns = ['benchmark', 'examples', | |
| 'pyglet', 'test_external'] | |
| omit_dir_re = re.compile(r'|'.join(omit_dir_patterns)) | |
| source_re = re.compile(r'.*\.py$') | |
| def generate_covered_files(top_dir): | |
| for dirpath, dirnames, filenames in os.walk(top_dir): | |
| omit_dirs = [dirn for dirn in dirnames if omit_dir_re.match(dirn)] | |
| for x in omit_dirs: | |
| dirnames.remove(x) | |
| for filename in filenames: | |
| if source_re.match(filename): | |
| yield os.path.join(dirpath, filename) | |
| def make_report( | |
| test_args, source_dir='sympy/', report_dir='covhtml', use_cache=False, | |
| slow=False | |
| ): | |
| # code adapted from /bin/test | |
| from get_sympy import path_hack | |
| sympy_top = path_hack() | |
| os.chdir(sympy_top) | |
| cov = coverage.coverage() | |
| cov.exclude("raise NotImplementedError") | |
| cov.exclude("def canonize") # this should be "@decorated" | |
| if use_cache: | |
| cov.load() | |
| else: | |
| cov.erase() | |
| cov.start() | |
| import sympy | |
| sympy.test(*test_args, subprocess=False, slow=slow) | |
| #sympy.doctest() # coverage doesn't play well with doctests | |
| cov.stop() | |
| try: | |
| cov.save() | |
| except PermissionError: | |
| import warnings | |
| warnings.warn( | |
| "PermissionError has been raised while saving the " \ | |
| "coverage result.", | |
| RuntimeWarning | |
| ) | |
| covered_files = list(generate_covered_files(source_dir)) | |
| cov.html_report(morfs=covered_files, directory=report_dir) | |
| parser = ArgumentParser() | |
| parser.add_argument( | |
| '-c', '--use-cache', action='store_true', default=False, | |
| help='Use cached data.') | |
| parser.add_argument( | |
| '-d', '--report-dir', default='covhtml', | |
| help='Directory to put the generated report in.') | |
| parser.add_argument( | |
| "--slow", action="store_true", dest="slow", default=False, | |
| help="Run slow functions also.") | |
| options, args = parser.parse_known_args() | |
| if __name__ == '__main__': | |
| report_dir = options.report_dir | |
| use_cache = options.use_cache | |
| slow = options.slow | |
| make_report( | |
| args, report_dir=report_dir, use_cache=use_cache, slow=slow) | |
| print("The generated coverage report is in covhtml directory.") | |
| print( | |
| "Open %s in your web browser to view the report" % | |
| os.sep.join([report_dir, 'index.html']) | |
| ) | |