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 &