diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2015-07-30 21:54:39 -0400 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2015-07-30 21:54:39 -0400 |
commit | d6527657397d0499ce622a82ac04ddceddcbeb93 (patch) | |
tree | 4de471c7a0737ea0208f4998598eb228c46b97c7 | |
parent | 5eea5dbb59adc5f384d443fb702060e21646adbc (diff) | |
download | python-coveragepy-git-d6527657397d0499ce622a82ac04ddceddcbeb93.tar.gz |
Erasing in parallel mode now deletes all the data files. #262
-rw-r--r-- | CHANGES.txt | 4 | ||||
-rw-r--r-- | coverage/control.py | 2 | ||||
-rw-r--r-- | coverage/data.py | 18 | ||||
-rw-r--r-- | tests/test_data.py | 10 | ||||
-rw-r--r-- | tests/test_process.py | 17 |
5 files changed, 47 insertions, 4 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index aefbb5cd..a926e5f9 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -24,6 +24,9 @@ Latest coverage.py. This should help prevent configuration mistakes from passing silently. Finishes `issue 386`_. +- In parallel mode, ``coverage erase`` will now delete all of the data files, + fixing `issue 262`_. + - The XML report now includes a ``missing-branches`` attribute. Thanks, Steve Peak. This is not a part of the Cobertura DTD, so the XML report no longer references the DTD. @@ -51,6 +54,7 @@ Latest but now works again, closing `issue 385`_. .. _issue 236: https://bitbucket.org/ned/coveragepy/issues/236/pickles-are-bad-and-you-should-feel-bad +.. _issue 262: https://bitbucket.org/ned/coveragepy/issues/262/when-parallel-true-erase-should-erase-all .. _issue 275: https://bitbucket.org/ned/coveragepy/issues/275/refer-consistently-to-project-as-coverage .. _issue 313: https://bitbucket.org/ned/coveragepy/issues/313/add-license-file-containing-2-3-or-4 .. _issue 380: https://bitbucket.org/ned/coveragepy/issues/380/code-executed-by-exec-excluded-from diff --git a/coverage/control.py b/coverage/control.py index 8e51c2c0..3ff7e2a1 100644 --- a/coverage/control.py +++ b/coverage/control.py @@ -653,7 +653,7 @@ class Coverage(object): self._init() self.collector.reset() self.data.erase() - self.data_files.erase() + self.data_files.erase(parallel=self.config.parallel) def clear_exclude(self, which='exclude'): """Clear the exclude list.""" diff --git a/coverage/data.py b/coverage/data.py index 4a5ae27a..0fa2c878 100644 --- a/coverage/data.py +++ b/coverage/data.py @@ -6,6 +6,7 @@ import glob import json import os +import os.path import random import socket @@ -553,9 +554,20 @@ class CoverageDataFiles(object): # Construct the filename that will be used for data storage. self.filename = os.path.abspath(basename or ".coverage") - def erase(self): - """Erase the data from the file storage.""" + def erase(self, parallel=False): + """Erase the data from the file storage. + + If `parallel` is true, then also deletes data files created from the + basename by parallel-mode. + + """ file_be_gone(self.filename) + if parallel: + data_dir, local = os.path.split(self.filename) + localdot = local + '.*' + pattern = os.path.join(os.path.abspath(data_dir), localdot) + for filename in glob.glob(pattern): + file_be_gone(filename) def read(self, data): """Read the coverage data.""" @@ -630,7 +642,7 @@ class CoverageDataFiles(object): new_data = CoverageData() new_data.read_file(f) data.update(new_data, aliases=aliases) - os.remove(f) + file_be_gone(f) def debug_main(args): diff --git a/tests/test_data.py b/tests/test_data.py index ec163950..b370aa21 100644 --- a/tests/test_data.py +++ b/tests/test_data.py @@ -574,6 +574,16 @@ class CoverageDataFilesTest(DataTestHelpers, CoverageTest): self.data_files.read(covdata2) self.assert_line_counts(covdata2, {}) + def test_erasing_parallel(self): + self.make_file("datafile.1") + self.make_file("datafile.2") + self.make_file(".coverage") + data_files = CoverageDataFiles("datafile") + data_files.erase(parallel=True) + self.assert_doesnt_exist("datafile.1") + self.assert_doesnt_exist("datafile.2") + self.assert_exists(".coverage") + def read_json_data_file(self, fname): """Read a JSON data file for testing the JSON directly.""" with open(fname, 'r') as fdata: diff --git a/tests/test_process.py b/tests/test_process.py index 78d02bc1..7c8b0c2d 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -259,6 +259,23 @@ class ProcessTest(CoverageTest): self.assertEqual(actual, expected) self.assertEqual(list(summary.values())[0], 6) + def test_erase_parallel(self): + self.make_file(".coveragerc", """\ + [run] + data_file = data.dat + parallel = True + """) + self.make_file("data.dat") + self.make_file("data.dat.fooey") + self.make_file("data.dat.gooey") + self.make_file(".coverage") + + self.run_command("coverage erase") + self.assert_doesnt_exist("data.dat") + self.assert_doesnt_exist("data.dat.fooey") + self.assert_doesnt_exist("data.dat.gooey") + self.assert_exists(".coverage") + def test_missing_source_file(self): # Check what happens if the source is missing when reporting happens. self.make_file("fleeting.py", """\ |