#!/usr/bin/env python # -*- coding: utf-8 -*- import argparse import datetime import os import shutil import sys import time import coverage from selenium import webdriver from selenium.common.exceptions import WebDriverException class Command: # pylint: disable=too-few-public-methods default_browser = 'firefox' @staticmethod def _setup_argparser(): kwargs = { 'description': 'Create a coverage report from a previous coverage run and show it within a browser window.', } parser = argparse.ArgumentParser(**kwargs) parser.add_argument('-k', '--keep', action='store_true', dest='keep_report', help='keep the report after closing the browser') 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%S') dirname = 'coverage-report-{}'.format(timestamp) path = os.path.join('tmp', dirname) os.makedirs(path) return path def _remove_report_directory(self, path): 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): browser = webdriver.Firefox() start_file = os.path.abspath(os.path.join(path, 'index.html')) browser.get('file://{}'.format(start_file)) while True: time.sleep(1) try: _ = browser.window_handles except WebDriverException: break return True def __init__(self): self._argparser = self._setup_argparser() self._coverage = coverage.Coverage() self._coverage.load() def __call__(self, argv=None): cmd_args = self._parse_args(argv) report_dir = self._create_report_directory() sys.stdout.write('Report directory: {}\n'.format(report_dir)) try: self._create_report(report_dir) self._show_report(report_dir) finally: if not cmd_args.keep_report: self._remove_report_directory(report_dir) return os.EX_OK def main(): cmd = Command() exitval = cmd() sys.exit(exitval) if __name__ == '__main__': main()