diff options
-rw-r--r-- | coverage/nose_coverage.py | 44 | ||||
-rw-r--r-- | coverage/pytest_coverage.py | 74 | ||||
-rw-r--r-- | coverage/testplugin.py (renamed from coverage/runner.py) | 54 | ||||
-rw-r--r-- | setup.py | 2 | ||||
-rw-r--r-- | test/test_testplugin.py | 36 |
5 files changed, 93 insertions, 117 deletions
diff --git a/coverage/nose_coverage.py b/coverage/nose_coverage.py index 6ba0a104..907e6803 100644 --- a/coverage/nose_coverage.py +++ b/coverage/nose_coverage.py @@ -1,10 +1,9 @@ import logging import unittest, os -from nose.plugins import Plugin, PluginTester - +from nose.plugins import Plugin import sys -import os -sys.path.insert(0, os.path.realpath(os.path.join(os.path.dirname(__file__), '../../'))) + +from coverage.testplugin import CoverageTestWrapper log = logging.getLogger(__name__) @@ -55,7 +54,6 @@ class Coverage(Plugin): """ log.debug("Coverage begin") # Load the runner and start it up - from coverage.runner import CoverageTestWrapper self.coverage = CoverageTestWrapper(self.options) self.coverage.start() @@ -68,39 +66,3 @@ class Coverage(Plugin): # finish up with coverage self.coverage.finish() - -# Monkey patch omit_filter to use regex patterns for file omits -def omit_filter(omit_prefixes, code_units): - import re - exclude_patterns = [re.compile(line.strip()) for line in omit_prefixes if line and not line.startswith('#')] - filtered = [] - for cu in code_units: - skip = False - for pattern in exclude_patterns: - if pattern.search(cu.filename): - skip = True - break - - if not skip: - filtered.append(cu) - return filtered - -try: - import coverage - coverage.codeunit.omit_filter = omit_filter -except: - pass - -class TestCoverage(PluginTester, unittest.TestCase): - activate = '--with-coverage_new' # enables the plugin - plugins = [Coverage()] - args = ['--cover-action=report'] - - def test_output(self): - assert "Processing Coverage..." in self.output, ( - "got: %s" % self.output) - def makeSuite(self): - class TC(unittest.TestCase): - def runTest(self): - raise ValueError("Coverage down") - return unittest.TestSuite([TC()]) diff --git a/coverage/pytest_coverage.py b/coverage/pytest_coverage.py deleted file mode 100644 index 094be44a..00000000 --- a/coverage/pytest_coverage.py +++ /dev/null @@ -1,74 +0,0 @@ -""" -Write and report coverage data with 'coverage.py'. -""" -import py -import coverage - -def pytest_addoption(parser): - """ - Get all the options from the coverage.runner and import them - """ - from coverage.runner import options - group = parser.getgroup('Coverage options') - for opt in options: - group._addoption_instance(opt) - -def pytest_configure(config): - # Load the runner and start it up - if config.getvalue("cover_actions"): - config.pluginmanager.register(DoCover(config), "do_coverage") - -class DoCover: - def __init__(self, config): - self.config = config - - def pytest_sessionstart(self): - from coverage.runner import CoverageTestWrapper - self.coverage = CoverageTestWrapper(self.config.option) - # XXX maybe better to start/suspend/resume coverage - # for each single test item - self.coverage.start() - - def pytest_terminal_summary(self, terminalreporter): - # Finished the tests start processing the coverage - config = terminalreporter.config - tw = terminalreporter._tw - tw.sep('-', 'coverage') - tw.line('Processing Coverage...') - self.coverage.finish() - - -# Monkey patch omit_filter to use regex patterns for file omits -def omit_filter(omit_prefixes, code_units): - import re - exclude_patterns = [re.compile(line.strip()) for line in omit_prefixes if line and not line.startswith('#')] - filtered = [] - for cu in code_units: - skip = False - for pattern in exclude_patterns: - if pattern.search(cu.filename): - skip = True - break - - if not skip: - filtered.append(cu) - return filtered - -coverage.codeunit.omit_filter = omit_filter - -pytest_plugins = ['pytester'] -def test_functional(testdir): - testdir.makepyfile(""" - def f(): - x = 42 - def test_whatever(): - pass - """) - result = testdir.runpytest("--cover-action=annotate") - assert result.ret == 0 - assert result.stdout.fnmatch_lines([ - '*Processing Coverage*' - ]) - coveragefile = testdir.tmpdir.join(".coverage") - assert coveragefile.check() - # XXX try loading it? diff --git a/coverage/runner.py b/coverage/testplugin.py index ef4c1f21..a979ad2b 100644 --- a/coverage/runner.py +++ b/coverage/testplugin.py @@ -1,4 +1,4 @@ -import optparse +import coverage, optparse class CoverageTestWrapper(object): """ @@ -136,3 +136,55 @@ xml Create an XML report of coverage results. ) ] +# py.test plugin hooks + +def pytest_addoption(parser): + """ + Get all the options from the coverage.runner and import them + """ + group = parser.getgroup('Coverage options') + for opt in options: + group._addoption_instance(opt) + +def pytest_configure(config): + # Load the runner and start it up + if config.getvalue("cover_actions"): + config.pluginmanager.register(DoCover(config), "do_coverage") + +class DoCover: + def __init__(self, config): + self.config = config + + def pytest_sessionstart(self): + self.coverage = CoverageTestWrapper(self.config.option) + # XXX maybe better to start/suspend/resume coverage + # for each single test item + self.coverage.start() + + def pytest_terminal_summary(self, terminalreporter): + # Finished the tests start processing the coverage + config = terminalreporter.config + tw = terminalreporter._tw + tw.sep('-', 'coverage') + tw.line('Processing Coverage...') + self.coverage.finish() + + +# XXX please make the following unnessary +# Monkey patch omit_filter to use regex patterns for file omits +def omit_filter(omit_prefixes, code_units): + import re + exclude_patterns = [re.compile(line.strip()) for line in omit_prefixes if line and not line.startswith('#')] + filtered = [] + for cu in code_units: + skip = False + for pattern in exclude_patterns: + if pattern.search(cu.filename): + skip = True + break + + if not skip: + filtered.append(cu) + return filtered + +coverage.codeunit.omit_filter = omit_filter @@ -43,7 +43,7 @@ if sys.hexversion < 0x03000000: 'coverage = coverage:main', ], 'pytest11': [ - 'coverage = coverage.pytest_coverage', + 'coverage = coverage.testplugin', ], }, diff --git a/test/test_testplugin.py b/test/test_testplugin.py new file mode 100644 index 00000000..d102a4f4 --- /dev/null +++ b/test/test_testplugin.py @@ -0,0 +1,36 @@ +import py +import unittest +from nose.plugins import PluginTester +from coverage.nose_coverage import Coverage + +class TestCoverage(PluginTester, unittest.TestCase): + activate = '--with-coverage_new' # enables the plugin + plugins = [Coverage()] + args = ['--cover-action=report'] + + @py.test.mark.skipif(True) # "requires nose test runner" + def test_output(self): + assert "Processing Coverage..." in self.output, ( + "got: %s" % self.output) + def makeSuite(self): + class TC(unittest.TestCase): + def runTest(self): + raise ValueError("Coverage down") + return unittest.TestSuite([TC()]) + +pytest_plugins = ['pytester'] +def test_functional(testdir): + testdir.makepyfile(""" + def f(): + x = 42 + def test_whatever(): + pass + """) + result = testdir.runpytest("--cover-action=annotate") + assert result.ret == 0 + assert result.stdout.fnmatch_lines([ + '*Processing Coverage*' + ]) + coveragefile = testdir.tmpdir.join(".coverage") + assert coveragefile.check() + # XXX try loading it? |