diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2022-01-22 16:50:50 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2022-01-22 17:37:50 -0500 |
commit | 2e8c1910cad1ba23726e62e03c4ae1608f3fb26e (patch) | |
tree | 39104fa106c947aefcd3d2c124dd584e800b1c1b /coverage/lcovreport.py | |
parent | 3f221e0339b74137bbf45289497955700dc49feb (diff) | |
download | python-coveragepy-git-2e8c1910cad1ba23726e62e03c4ae1608f3fb26e.tar.gz |
style: cleanups after lcov, though more than just lcov
Diffstat (limited to 'coverage/lcovreport.py')
-rw-r--r-- | coverage/lcovreport.py | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/coverage/lcovreport.py b/coverage/lcovreport.py index 770f7a25..4dc73c29 100644 --- a/coverage/lcovreport.py +++ b/coverage/lcovreport.py @@ -20,7 +20,7 @@ class LcovReporter: self.config = self.coverage.config def report(self, morfs, outfile=None): - """Renders the full lcov report + """Renders the full lcov report. 'morfs' is a list of modules or filenames @@ -34,41 +34,42 @@ class LcovReporter: self.get_lcov(fr, analysis, outfile) def get_lcov(self, fr, analysis, outfile=None): - """Produces the lcov data for a single file + """Produces the lcov data for a single file. - get_lcov currently supports both line and branch coverage, + This currently supports both line and branch coverage, however function coverage is not supported. - """ - outfile.write("TN:\n") outfile.write(f"SF:{fr.relative_filename()}\n") source_lines = fr.source().splitlines() + for covered in sorted(analysis.executed): - # Note: Coveragepy currently only supports checking *if* a line has - # been executed, not how many times, so we set this to 1 for nice - # output even if it's technically incorrect - - # The lines below calculate a 64 bit encoded md5 hash of the line - # corresponding to the DA lines in the lcov file, - # for either case of the line being covered or missed in Coveragepy - # The final two characters of the encoding ("==") are removed from - # the hash to allow genhtml to run on the resulting lcov file + # Note: Coverage.py currently only supports checking *if* a line + # has been executed, not how many times, so we set this to 1 for + # nice output even if it's technically incorrect. + + # The lines below calculate a 64-bit encoded md5 hash of the line + # corresponding to the DA lines in the lcov file, for either case + # of the line being covered or missed in coverage.py. The final two + # characters of the encoding ("==") are removed from the hash to + # allow genhtml to run on the resulting lcov file. if source_lines: - line = source_lines[covered - 1].encode("utf-8") + line = source_lines[covered-1].encode("utf-8") else: line = b"" - hashed = str(base64.b64encode(md5(line).digest())[:-2], encoding="utf-8") + hashed = base64.b64encode(md5(line).digest()).decode().rstrip("=") outfile.write(f"DA:{covered},1,{hashed}\n") + for missed in sorted(analysis.missing): assert source_lines line = source_lines[missed-1].encode("utf-8") - hashed = str(base64.b64encode(md5(line).digest())[:-2], encoding="utf-8") + hashed = base64.b64encode(md5(line).digest()).decode().rstrip("=") outfile.write(f"DA:{missed},0,{hashed}\n") + outfile.write(f"LF:{len(analysis.statements)}\n") outfile.write(f"LH:{len(analysis.executed)}\n") - # More information dense branch coverage data + # More information dense branch coverage data. missing_arcs = analysis.missing_branch_arcs() executed_arcs = analysis.executed_branch_arcs() for block_number, block_line_number in enumerate( @@ -78,14 +79,15 @@ class LcovReporter: sorted(missing_arcs[block_line_number]) ): # The exit branches have a negative line number, - # this will not produce valid lcov, and so setting + # this will not produce valid lcov. Setting # the line number of the exit branch to 0 will allow - # for valid lcov, while preserving the data + # for valid lcov, while preserving the data. line_number = max(line_number, 0) outfile.write(f"BRDA:{line_number},{block_number},{branch_number},-\n") + # The start value below allows for the block number to be # preserved between these two for loops (stopping the loop from - # resetting the value of the block number to 0) + # resetting the value of the block number to 0). for branch_number, line_number in enumerate( sorted(executed_arcs[block_line_number]), start=len(missing_arcs[block_line_number]), @@ -93,7 +95,7 @@ class LcovReporter: line_number = max(line_number, 0) outfile.write(f"BRDA:{line_number},{block_number},{branch_number},1\n") - # Summary of the branch coverage + # Summary of the branch coverage. if analysis.has_arcs(): branch_stats = analysis.branch_stats() brf = sum(t for t, k in branch_stats.values()) |