summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2015-07-30 21:54:39 -0400
committerNed Batchelder <ned@nedbatchelder.com>2015-07-30 21:54:39 -0400
commitd6527657397d0499ce622a82ac04ddceddcbeb93 (patch)
tree4de471c7a0737ea0208f4998598eb228c46b97c7
parent5eea5dbb59adc5f384d443fb702060e21646adbc (diff)
downloadpython-coveragepy-git-d6527657397d0499ce622a82ac04ddceddcbeb93.tar.gz
Erasing in parallel mode now deletes all the data files. #262
-rw-r--r--CHANGES.txt4
-rw-r--r--coverage/control.py2
-rw-r--r--coverage/data.py18
-rw-r--r--tests/test_data.py10
-rw-r--r--tests/test_process.py17
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", """\