diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2012-12-28 06:02:23 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2012-12-28 06:02:23 -0500 |
commit | 618422a0ee74acb617fe6b663482dbfa51eb746c (patch) | |
tree | e4766565ad901f39fa379ef4b81c9ca82bb01856 | |
parent | 5408c86518c42c73e77e29a7818a01e29b321632 (diff) | |
download | python-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.py | 49 | ||||
-rw-r--r-- | test/test_api.py | 39 |
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) |