summaryrefslogtreecommitdiff
path: root/coverage/data.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/data.py')
-rw-r--r--coverage/data.py30
1 files changed, 22 insertions, 8 deletions
diff --git a/coverage/data.py b/coverage/data.py
index 95b68881..ecfb86b9 100644
--- a/coverage/data.py
+++ b/coverage/data.py
@@ -144,9 +144,6 @@ class CoverageData(object):
# A list of dicts of information about the coverage.py runs.
self._runs = []
- if self._debug and self._debug.should('dataio'):
- self._debug.write("Creating CoverageData object")
-
def __repr__(self):
return "<{klass} lines={lines} arcs={arcs} tracers={tracers} runs={runs}>".format(
klass=self.__class__.__name__,
@@ -419,8 +416,12 @@ class CoverageData(object):
self._runs[0].update(kwargs)
self._validate()
- def touch_file(self, filename):
- """Ensure that `filename` appears in the data, empty if needed."""
+ def touch_file(self, filename, plugin_name=""):
+ """Ensure that `filename` appears in the data, empty if needed.
+
+ `plugin_name` is the name of the plugin resposible for this file. It is used
+ to associate the right filereporter, etc.
+ """
if self._debug and self._debug.should('dataop'):
self._debug.write("Touching %r" % (filename,))
if not self._has_arcs() and not self._has_lines():
@@ -431,6 +432,9 @@ class CoverageData(object):
else:
where = self._lines
where.setdefault(filename, [])
+ if plugin_name:
+ # Set the tracer for this file
+ self._file_tracers[filename] = plugin_name
self._validate()
@@ -608,15 +612,19 @@ class CoverageData(object):
class CoverageDataFiles(object):
"""Manage the use of coverage data files."""
- def __init__(self, basename=None, warn=None):
+ def __init__(self, basename=None, warn=None, debug=None):
"""Create a CoverageDataFiles to manage data files.
`warn` is the warning function to use.
`basename` is the name of the file to use for storing data.
+ `debug` is a `DebugControl` object for writing debug messages.
+
"""
self.warn = warn
+ self.debug = debug
+
# Construct the file name that will be used for data storage.
self.filename = os.path.abspath(basename or ".coverage")
@@ -627,12 +635,16 @@ class CoverageDataFiles(object):
basename by parallel-mode.
"""
+ if self.debug and self.debug.should('dataio'):
+ self.debug.write("Erasing data file %r" % (self.filename,))
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):
+ if self.debug and self.debug.should('dataio'):
+ self.debug.write("Erasing parallel data file %r" % (filename,))
file_be_gone(filename)
def read(self, data):
@@ -660,7 +672,7 @@ class CoverageDataFiles(object):
with open(_TEST_NAME_FILE) as f:
test_name = f.read()
extra = "." + test_name
- dice = random.Random().randint(0, 999999)
+ dice = random.Random(os.urandom(8)).randint(0, 999999)
suffix = "%s%s.%s.%06d" % (socket.gethostname(), extra, os.getpid(), dice)
if suffix:
@@ -711,7 +723,7 @@ class CoverageDataFiles(object):
raise CoverageException("No data to combine")
for f in files_to_combine:
- new_data = CoverageData()
+ new_data = CoverageData(debug=self.debug)
try:
new_data.read_file(f)
except CoverageException as exc:
@@ -721,6 +733,8 @@ class CoverageDataFiles(object):
self.warn(str(exc))
else:
data.update(new_data, aliases=aliases)
+ if self.debug and self.debug.should('dataio'):
+ self.debug.write("Deleting combined data file %r" % (f,))
file_be_gone(f)