Skip to content

Commit

Permalink
Add combine --keep
Browse files Browse the repository at this point in the history
Related to nedbat#1108
  • Loading branch information
elarivie committed Jan 30, 2021
1 parent 0143891 commit eb48bc8
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 9 deletions.
8 changes: 7 additions & 1 deletion coverage/cmdline.py
Expand Up @@ -31,6 +31,10 @@ class Opts(object):
'-a', '--append', action='store_true',
help="Append coverage data to .coverage, otherwise it starts clean each time.",
)
keep = optparse.make_option(
'', '--keep', action='store_true',
help="Keep combined coverage files, otherwise they are deleted.",
)
branch = optparse.make_option(
'', '--branch', action='store_true',
help="Measure branch coverage in addition to statement coverage.",
Expand Down Expand Up @@ -215,6 +219,7 @@ def __init__(self, *args, **kwargs):
help=None,
ignore_errors=None,
include=None,
keep=None,
module=None,
omit=None,
contexts=None,
Expand Down Expand Up @@ -333,6 +338,7 @@ def get_prog_name(self):
"combine",
[
Opts.append,
Opts.keep,
] + GLOBAL_ARGS,
usage="[options] <path1> <path2> ... <pathN>",
description=(
Expand Down Expand Up @@ -585,7 +591,7 @@ def command_line(self, argv):
if options.append:
self.coverage.load()
data_dirs = args or None
self.coverage.combine(data_dirs, strict=True)
self.coverage.combine(data_dirs, strict=True, keep=options.keep)
self.coverage.save()
return OK

Expand Down
6 changes: 4 additions & 2 deletions coverage/control.py
Expand Up @@ -659,7 +659,7 @@ def save(self):
data = self.get_data()
data.write()

def combine(self, data_paths=None, strict=False):
def combine(self, data_paths=None, strict=False, keep=False):
"""Combine together a number of similarly-named coverage data files.
All coverage data files whose name starts with `data_file` (from the
Expand All @@ -674,6 +674,8 @@ def combine(self, data_paths=None, strict=False):
If `strict` is true, then it is an error to attempt to combine when
there are no data files to combine.
If `keep` is true, then combined data file won't be deleted.
.. versionadded:: 4.0
The `data_paths` parameter.
Expand All @@ -694,7 +696,7 @@ def combine(self, data_paths=None, strict=False):
for pattern in paths[1:]:
aliases.add(pattern, result)

combine_parallel_data(self._data, aliases=aliases, data_paths=data_paths, strict=strict)
combine_parallel_data(self._data, aliases=aliases, data_paths=data_paths, strict=strict, keep=keep)

def get_data(self):
"""Get the collected data.
Expand Down
11 changes: 6 additions & 5 deletions coverage/data.py
Expand Up @@ -52,7 +52,7 @@ def add_data_to_hash(data, filename, hasher):
hasher.update(data.file_tracer(filename))


def combine_parallel_data(data, aliases=None, data_paths=None, strict=False):
def combine_parallel_data(data, aliases=None, data_paths=None, strict=False, keep=False):
"""Combine a number of data files together.
Treat `data.filename` as a file prefix, and combine the data from all
Expand All @@ -68,7 +68,7 @@ def combine_parallel_data(data, aliases=None, data_paths=None, strict=False):
If `data_paths` is not provided, then the directory portion of
`data.filename` is used as the directory to search for data files.
Every data file found and combined is then deleted from disk. If a file
Unless `keep` is True every data file found and combined is then deleted from disk. If a file
cannot be read, a warning will be issued, and the file will not be
deleted.
Expand Down Expand Up @@ -116,9 +116,10 @@ def combine_parallel_data(data, aliases=None, data_paths=None, strict=False):
else:
data.update(new_data, aliases=aliases)
files_combined += 1
if data._debug.should('dataio'):
data._debug.write("Deleting combined data file %r" % (f,))
file_be_gone(f)
if not keep:
if data._debug.should('dataio'):
data._debug.write("Deleting combined data file %r" % (f,))
file_be_gone(f)

if strict and not files_combined:
raise CoverageException("No usable data files")
5 changes: 4 additions & 1 deletion doc/python-coverage.1.txt
Expand Up @@ -108,7 +108,7 @@ COMMAND REFERENCE

Combine data from multiple coverage files collected with ``run -p``.
The combined results are written to a single file representing the
union of the data.
union of the data. Unless --keep is provided the combined coverage files are deleted.

If `PATH` is specified, they are files or directories containing data to
be combined.
Expand All @@ -119,6 +119,9 @@ COMMAND REFERENCE
Append coverage data to .coverage, otherwise it starts clean each
time.

\--keep
Keep combined coverage file.

**debug** `TOPIC` ...

Display information about the internals of coverage.py, for diagnosing
Expand Down
22 changes: 22 additions & 0 deletions tests/test_process.py
Expand Up @@ -244,6 +244,28 @@ def test_combine_parallel_data_no_append(self):
data.read()
self.assertEqual(line_counts(data)['b_or_c.py'], 7)

def test_combine_parallel_data_keep(self):
self.make_b_or_c_py()
out = self.run_command("coverage run -p b_or_c.py b")
self.assertEqual(out, 'done\n')
self.assert_doesnt_exist(".coverage")
self.assert_file_count(".coverage.*", 1)

out = self.run_command("coverage run -p b_or_c.py c")
self.assertEqual(out, 'done\n')
self.assert_doesnt_exist(".coverage")

# After two -p runs, there should be two .coverage.machine.123 files.
self.assert_file_count(".coverage.*", 2)

# Combine the parallel coverage data files into .coverage with the keep flag.
self.run_command("coverage combine --keep")
self.assert_exists(".coverage")

# After combining, there should be the .coverage file and the original combined file should still be there.
self.assert_file_count(".coverage.*", 3)


def test_append_data(self):
self.make_b_or_c_py()

Expand Down

0 comments on commit eb48bc8

Please sign in to comment.