#!/usr/bin/env python # -*- coding: utf-8 -*- from __future__ import unicode_literals import argparse import datetime import os import shutil import sys import coverage class Command(object): # pylint: disable=too-few-public-methods default_browser = 'firefox' @staticmethod def _setup_argparser(): kwargs = { 'description': 'Tool to create html coverage report.', } parser = argparse.ArgumentParser(**kwargs) return parser def _parse_args(self, argv=None): if argv is None: argv = sys.argv[1:] return self._argparser.parse_args(argv) @staticmethod def _create_report_directory(path=None): if path is None: timestamp = datetime.datetime.now().strftime('%Y%m%d-%H%M') dirname = 'coverage-report-{}'.format(timestamp) path = os.path.join('tmp', dirname) os.makedirs(path) return path def _remove_report_directory(self, path=None): if path is None: path = self._report_directory if path is not None: if os.path.isdir(path): sys.stdout.write('Removing report directory {}\n'.format(path)) shutil.rmtree(path) def _create_report(self, path): return self._coverage.html_report(directory=path, skip_covered=True) def _show_report(self, path): start_file = os.path.join(path, 'index.html') browser = os.environ.get('BROWSER', self.default_browser) cmd = '{browser} --new-window "{file}"'.format(browser=browser, file=start_file) return os.system(cmd) def __init__(self): self._argparser = self._setup_argparser() self._report_directory = self._create_report_directory() self._coverage = coverage.Coverage() self._coverage.load() def __call__(self, argv=None): self._parse_args(argv) report_dir = self._report_directory sys.stdout.write('Report directory: {}\n'.format(report_dir)) try: self._create_report(report_dir) except Exception as e: self._remove_report_directory(report_dir) raise e exitval = self._show_report(report_dir) return exitval def main(): cmd = Command() exitval = cmd() sys.exit(exitval) if __name__ == '__main__': main()