summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2012-12-28 06:02:23 -0500
committerNed Batchelder <ned@nedbatchelder.com>2012-12-28 06:02:23 -0500
commit618422a0ee74acb617fe6b663482dbfa51eb746c (patch)
treee4766565ad901f39fa379ef4b81c9ca82bb01856
parent5408c86518c42c73e77e29a7818a01e29b321632 (diff)
downloadpython-coveragepy-618422a0ee74acb617fe6b663482dbfa51eb746c.tar.gz
Preventing double harvesting was keeping the nose plugin from working. Not sure what it was meant to solve in the first place. Fixes #224. Maybe allows double warnings now?
-rw-r--r--coverage/control.py49
-rw-r--r--test/test_api.py39
2 files changed, 59 insertions, 29 deletions
diff --git a/coverage/control.py b/coverage/control.py
index dafd014..913fec8 100644
--- a/coverage/control.py
+++ b/coverage/control.py
@@ -173,9 +173,6 @@ class coverage(object):
self.pylib_match = self.cover_match = None
self.include_match = self.omit_match = None
- # Only _harvest_data once per measurement cycle.
- self._harvested = False
-
# Set the reporting precision.
Numbers.set_precision(self.config.precision)
@@ -362,7 +359,6 @@ class coverage(object):
if self.omit:
self.omit_match = FnmatchMatcher(self.omit)
- self._harvested = False
self.collector.start()
self._started = True
@@ -470,8 +466,6 @@ class coverage(object):
for pattern in paths[1:]:
aliases.add(pattern, result)
self.data.combine_parallel_data(aliases=aliases)
- # Combining is a kind of harvesting.
- self._harvested = True
def _harvest_data(self):
"""Get the collected data and reset the collector.
@@ -479,29 +473,26 @@ class coverage(object):
Also warn about various problems collecting data.
"""
- if not self._harvested:
- self.data.add_line_data(self.collector.get_line_data())
- self.data.add_arc_data(self.collector.get_arc_data())
- self.collector.reset()
-
- # If there are still entries in the source_pkgs list, then we never
- # encountered those packages.
- if self._warn_unimported_source:
- for pkg in self.source_pkgs:
- self._warn("Module %s was never imported." % pkg)
-
- # Find out if we got any data.
- summary = self.data.summary()
- if not summary and self._warn_no_data:
- self._warn("No data was collected.")
-
- # Find files that were never executed at all.
- for src in self.source:
- for py_file in find_python_files(src):
- py_file = self.file_locator.canonical_filename(py_file)
- self.data.touch_file(py_file)
-
- self._harvested = True
+ self.data.add_line_data(self.collector.get_line_data())
+ self.data.add_arc_data(self.collector.get_arc_data())
+ self.collector.reset()
+
+ # If there are still entries in the source_pkgs list, then we never
+ # encountered those packages.
+ if self._warn_unimported_source:
+ for pkg in self.source_pkgs:
+ self._warn("Module %s was never imported." % pkg)
+
+ # Find out if we got any data.
+ summary = self.data.summary()
+ if not summary and self._warn_no_data:
+ self._warn("No data was collected.")
+
+ # Find files that were never executed at all.
+ for src in self.source:
+ for py_file in find_python_files(src):
+ py_file = self.file_locator.canonical_filename(py_file)
+ self.data.touch_file(py_file)
# Backward compatibility with version 1.
def analysis(self, morf):
diff --git a/test/test_api.py b/test/test_api.py
index 4c4f765..e83d8b7 100644
--- a/test/test_api.py
+++ b/test/test_api.py
@@ -487,3 +487,42 @@ class AnalysisTest(CoverageTest):
self.assertEqual(nums.n_branches, 2)
self.assertEqual(nums.n_partial_branches, 0)
self.assertEqual(nums.n_missing_branches, 2)
+
+
+class PluginTest(CoverageTest):
+ """Test that the API works properly the way the plugins call it.
+
+ We don't actually use the plugins, but these tests call the API the same
+ way they do.
+
+ """
+ def pretend_to_be_nose_with_cover(self, erase):
+ """This is what the nose --with-cover plugin does."""
+ cov = coverage.coverage()
+
+ self.make_file("no_biggie.py", """\
+ a = 1
+ b = 2
+ if b == 1:
+ c = 4
+ """)
+
+ if erase:
+ cov.combine()
+ cov.erase()
+ cov.load()
+ self.start_import_stop(cov, "no_biggie")
+ cov.combine()
+ cov.save()
+ cov.report(["no_biggie.py"])
+ self.assertEqual(self.stdout(), textwrap.dedent("""\
+ Name Stmts Miss Cover Missing
+ -----------------------------------------
+ no_biggie 4 1 75% 4
+ """))
+
+ def test_nose_plugin(self):
+ self.pretend_to_be_nose_with_cover(erase=False)
+
+ def test_nose_plugin_with_erase(self):
+ self.pretend_to_be_nose_with_cover(erase=True)