diff --git a/bin/coverage-html.py b/bin/coverage-html.py new file mode 100755 index 0000000..41baad4 --- /dev/null +++ b/bin/coverage-html.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import argparse +import coverage +import datetime +import os +import shutil +import sys +import time +from selenium import webdriver +from selenium.common.exceptions import WebDriverException + + +class Command(object): + 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() diff --git a/bin/coverage-html.sh b/bin/coverage-html.sh deleted file mode 100755 index 96ffb5f..0000000 --- a/bin/coverage-html.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -BROWSER="firefox" -BASE_DIR="tmp/" - -datetime=`date +'%Y%m%d-%H%M%S'` -report_dir="${BASE_DIR}coverage-report-${datetime}" - -mkdir -p "$report_dir" -coverage html --skip-covered -d "$report_dir" - -start_file="${report_dir}/index.html" -$BROWSER --new-window "$start_file" >/dev/null 2>&1 &