From 774005d2fca19d83707d740752a656ea1631b88e Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Fri, 25 Oct 2019 11:33:46 +0200 Subject: [PATCH] UPD: improved requirements management and coverage-html.py --- .buildbot/test/01-requirements.sh | 6 +--- bin/coverage-html.py | 51 ++++++++++++++++++------------- requirements-test.txt | 5 +++ requirements.txt | 2 -- 4 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 requirements-test.txt diff --git a/.buildbot/test/01-requirements.sh b/.buildbot/test/01-requirements.sh index c1beb58..36000db 100644 --- a/.buildbot/test/01-requirements.sh +++ b/.buildbot/test/01-requirements.sh @@ -1,10 +1,6 @@ python_major_version=`python -c 'import sys; print sys.version_info.major'` if test "$python_major_version" = "2" ; then pip install 'django<2' -fi -pip install -r requirements.txt -if test "$python_major_version" = "2" ; then pip install 'pylint-django<2' -else - pip install pylint-django fi +pip install -r requirements-test.txt diff --git a/bin/coverage-html.py b/bin/coverage-html.py index a7feee4..e72fb19 100755 --- a/bin/coverage-html.py +++ b/bin/coverage-html.py @@ -6,7 +6,10 @@ import datetime import os import shutil import sys +import time import coverage +from selenium import webdriver +from selenium.common.exceptions import WebDriverException class Command(object): # pylint: disable=too-few-public-methods @@ -15,9 +18,11 @@ class Command(object): # pylint: disable=too-few-public-methods @staticmethod def _setup_argparser(): kwargs = { - 'description': 'Tool to create html coverage report.', + '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): @@ -35,41 +40,45 @@ class Command(object): # pylint: disable=too-few-public-methods 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) + @staticmethod + def _remove_report_directory(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): - 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) + @staticmethod + def _show_report(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._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 + 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) - except Exception as e: - self._remove_report_directory(report_dir) - raise e + self._show_report(report_dir) + finally: + if not cmd_args.keep_report: + self._remove_report_directory(report_dir) - exitval = self._show_report(report_dir) - return exitval + return os.EX_OK def main(): diff --git a/requirements-test.txt b/requirements-test.txt new file mode 100644 index 0000000..79e0c87 --- /dev/null +++ b/requirements-test.txt @@ -0,0 +1,5 @@ +-r requirements.txt +coverage +mock +pylint-django +selenium diff --git a/requirements.txt b/requirements.txt index 73dee02..8a964ed 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,2 @@ -coverage django django-extensions -mock