Skip to content
This repository was archived by the owner on Feb 19, 2020. It is now read-only.

Commit 6b4989b

Browse files
authored
Merge pull request #32 from codacy/fix-reports-merge
Fix reports merge
2 parents 635d54c + 684cae7 commit 6b4989b

File tree

8 files changed

+111
-74
lines changed

8 files changed

+111
-74
lines changed

src/codacy/reporter.py

Lines changed: 37 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import logging
77
import os
88
from xml.dom import minidom
9-
from math import floor
109

1110
import requests
1211
from requests.packages.urllib3 import util as urllib3_util
@@ -23,7 +22,6 @@
2322

2423

2524
class _Retry(urllib3_util.Retry):
26-
2725
def is_forced_retry(self, method, status_code):
2826
return status_code >= BAD_REQUEST
2927

@@ -76,26 +74,37 @@ def strip_prefix(line, prefix):
7674
return filename
7775

7876

79-
def merge_reports(report_list):
80-
"""Merges together several report structures from parse_report_file"""
81-
final_report = {
82-
'language': "python",
83-
'fileReports': []
84-
}
77+
def merge_and_round_reports(report_list):
78+
"""Merges together several report structures from parse_report_file (and rounds all values)"""
79+
80+
if len(report_list) == 1:
81+
final_report = report_list[0]
82+
else:
83+
final_report = {
84+
'language': "python",
85+
'fileReports': []
86+
}
8587

86-
for report in report_list:
87-
# First, merge together detailed report structures
88-
# This assumes no overlap
89-
# TODO: What should we do if there is a file listed multiple times?
90-
final_report['fileReports'] += report['fileReports']
88+
total_lines = 0
89+
for report in report_list:
90+
# First, merge together detailed report structures
91+
# This assumes no overlap
92+
# TODO: What should we do if there is a file listed multiple times?
93+
final_report['fileReports'] += report['fileReports']
94+
total_lines += report['codeLines']
9195

92-
# Gather all per-file coverage
93-
total_coverages = []
94-
for fileentry in final_report['fileReports']:
95-
total_coverages += [fileentry['total']]
96+
# Coverage weighted average (by number of lines of code) of all files
97+
average_sum = 0
98+
for file_entry in final_report['fileReports']:
99+
average_sum += file_entry['total'] * file_entry['codeLines']
96100

97-
# And average
98-
final_report['total'] = int(sum(total_coverages)/len(total_coverages))
101+
final_report['total'] = average_sum / total_lines
102+
final_report['codeLines'] = total_lines
103+
104+
# Round all total values
105+
for file_entry in final_report['fileReports']:
106+
file_entry['total'] = int(file_entry['total'])
107+
final_report['total'] = int(final_report['total'])
99108

100109
return final_report
101110

@@ -105,9 +114,9 @@ def parse_report_file(report_file, git_directory):
105114
:param report_file:
106115
"""
107116

108-
# Convert decimal string to floored int percent value
117+
# Convert decimal string to decimal percent value
109118
def percent(s):
110-
return int(floor(float(s) * 100))
119+
return float(s) * 100
111120

112121
# Parse the XML into the format expected by the API
113122
report_xml = minidom.parse(report_file)
@@ -120,20 +129,25 @@ def percent(s):
120129

121130
sources = [x.firstChild.nodeValue for x in report_xml.getElementsByTagName('source')]
122131
classes = report_xml.getElementsByTagName('class')
132+
total_lines = 0
123133
for cls in classes:
134+
lines = cls.getElementsByTagName('line')
135+
total_lines += len(lines)
124136
file_report = {
125137
'filename': generate_filename(sources, cls.attributes['filename'].value, git_directory),
126138
'total': percent(cls.attributes['line-rate'].value),
139+
'codeLines': len(lines),
127140
'coverage': {},
128141
}
129-
lines = cls.getElementsByTagName('line')
130142
for line in lines:
131143
hits = int(line.attributes['hits'].value)
132144
if hits >= 1:
133145
# The API assumes 0 if a line is missing
134146
file_report['coverage'][line.attributes['number'].value] = hits
135147
report['fileReports'] += [file_report]
136148

149+
report['codeLines'] = total_lines
150+
137151
return report
138152

139153

@@ -197,7 +211,7 @@ def run():
197211
logging.info("Parsing report file %s...", rfile)
198212
reports.append(parse_report_file(rfile, args.directory))
199213

200-
report = merge_reports(reports)
214+
report = merge_and_round_reports(reports)
201215

202216
logging.info("Uploading report...")
203217
upload_report(report, CODACY_PROJECT_TOKEN, args.commit)

tests/coverage-merge/cobertura.3.xml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
1-
<coverage line-rate="0.87">
1+
<coverage line-rate="0.50">
22
<packages>
3-
<package line-rate="0.87" name="com.github.codacy">
3+
<package line-rate="0.50" name="com.github.codacy">
44
<classes>
5-
<class line-rate="0.87" name="TestSourceFile" filename="src/test/resources/TestSourceFile.scala">
5+
<class line-rate="0.75" name="TestSourceFile1" filename="src/test/resources/TestSourceFile1.scala">
66
<methods/>
77
<lines>
88
<line number="4" hits="1"/>
99
<line number="5" hits="1"/>
10-
<line number="6" hits="2"/>
10+
<line number="6" hits="0"/>
11+
<line number="7" hits="2"/>
1112
</lines>
1213
</class>
13-
<class line-rate="0.87" name="TestSourceFile" filename="src/test/resources/TestSourceFile.scala">
14+
<class line-rate="0.6667" name="TestSourceFile2" filename="src/test/resources/TestSourceFile2.scala">
1415
<methods/>
1516
<lines>
17+
<line number="5" hits="0"/>
1618
<line number="9" hits="1"/>
1719
<line number="10" hits="1"/>
1820
</lines>
1921
</class>
20-
<class line-rate="0.87" name="TestSourceFile2" filename="src/test/resources/TestSourceFile2.scala">
22+
<class line-rate="0.20" name="TestSourceFile3" filename="src/test/resources/TestSourceFile3.scala">
2123
<methods/>
2224
<lines>
23-
<line number="1" hits="1"/>
25+
<line number="1" hits="0"/>
2426
<line number="2" hits="1"/>
25-
<line number="3" hits="1"/>
27+
<line number="3" hits="0"/>
28+
<line number="4" hits="0"/>
29+
<line number="7" hits="0"/>
2630
</lines>
2731
</class>
2832
</classes>

tests/coverage-merge/coverage-merge.json

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,37 @@
11
{
2-
"total": 75,
2+
"total": 49,
3+
"codeLines": 74,
34
"fileReports": [
45
{
5-
"total": 87,
6+
"total": 75,
7+
"codeLines": 4,
68
"coverage": {
7-
"5": 1,
89
"4": 1,
9-
"6": 2
10+
"5": 1,
11+
"7": 2
1012
},
11-
"filename": "src/test/resources/TestSourceFile.scala"
13+
"filename": "src/test/resources/TestSourceFile1.scala"
1214
},
1315
{
14-
"total": 87,
16+
"total": 66,
17+
"codeLines": 3,
1518
"coverage": {
1619
"9": 1,
1720
"10": 1
1821
},
19-
"filename": "src/test/resources/TestSourceFile.scala"
22+
"filename": "src/test/resources/TestSourceFile2.scala"
2023
},
2124
{
22-
"total": 87,
25+
"total": 20,
26+
"codeLines": 5,
2327
"coverage": {
24-
"1": 1,
25-
"3": 1,
2628
"2": 1
2729
},
28-
"filename": "src/test/resources/TestSourceFile2.scala"
30+
"filename": "src/test/resources/TestSourceFile3.scala"
2931
},
3032
{
3133
"total": 66,
34+
"codeLines": 3,
3235
"coverage": {
3336
"1": 1,
3437
"4": 1
@@ -37,6 +40,7 @@
3740
},
3841
{
3942
"total": 49,
43+
"codeLines": 59,
4044
"coverage": {
4145
"50": 1,
4246
"60": 1,

tests/coverage3/cobertura.xml

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,32 @@
1-
<coverage line-rate="0.87">
1+
<coverage line-rate="0.50">
22
<packages>
3-
<package line-rate="0.87" name="com.github.codacy">
3+
<package line-rate="0.50" name="com.github.codacy">
44
<classes>
5-
<class line-rate="0.87" name="TestSourceFile" filename="src/test/resources/TestSourceFile.scala">
5+
<class line-rate="0.75" name="TestSourceFile1" filename="src/test/resources/TestSourceFile1.scala">
66
<methods/>
77
<lines>
88
<line number="4" hits="1"/>
99
<line number="5" hits="1"/>
10-
<line number="6" hits="2"/>
10+
<line number="6" hits="0"/>
11+
<line number="7" hits="2"/>
1112
</lines>
1213
</class>
13-
<class line-rate="0.87" name="TestSourceFile" filename="src/test/resources/TestSourceFile.scala">
14+
<class line-rate="0.6667" name="TestSourceFile2" filename="src/test/resources/TestSourceFile2.scala">
1415
<methods/>
1516
<lines>
17+
<line number="5" hits="0"/>
1618
<line number="9" hits="1"/>
1719
<line number="10" hits="1"/>
1820
</lines>
1921
</class>
20-
<class line-rate="0.87" name="TestSourceFile2" filename="src/test/resources/TestSourceFile2.scala">
22+
<class line-rate="0.20" name="TestSourceFile3" filename="src/test/resources/TestSourceFile3.scala">
2123
<methods/>
2224
<lines>
23-
<line number="1" hits="1"/>
25+
<line number="1" hits="0"/>
2426
<line number="2" hits="1"/>
25-
<line number="3" hits="1"/>
27+
<line number="3" hits="0"/>
28+
<line number="4" hits="0"/>
29+
<line number="7" hits="0"/>
2630
</lines>
2731
</class>
2832
</classes>

tests/coverage3/coverage.json

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,33 @@
11
{
2-
"total": 87,
2+
"total": 50,
3+
"codeLines": 12,
34
"fileReports": [
45
{
5-
"total": 87,
6+
"total": 75,
7+
"codeLines": 4,
68
"coverage": {
7-
"5": 1,
89
"4": 1,
9-
"6": 2
10+
"5": 1,
11+
"7": 2
1012
},
11-
"filename": "src/test/resources/TestSourceFile.scala"
13+
"filename": "src/test/resources/TestSourceFile1.scala"
1214
},
1315
{
14-
"total": 87,
16+
"total": 66,
17+
"codeLines": 3,
1518
"coverage": {
1619
"9": 1,
1720
"10": 1
1821
},
19-
"filename": "src/test/resources/TestSourceFile.scala"
22+
"filename": "src/test/resources/TestSourceFile2.scala"
2023
},
2124
{
22-
"total": 87,
25+
"total": 20,
26+
"codeLines": 5,
2327
"coverage": {
24-
"1": 1,
25-
"3": 1,
2628
"2": 1
2729
},
28-
"filename": "src/test/resources/TestSourceFile2.scala"
30+
"filename": "src/test/resources/TestSourceFile3.scala"
2931
}
3032
],
3133
"language": "python"

tests/coverage4/coverage.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
{
22
"total": 50,
3+
"codeLines": 62,
34
"fileReports": [
45
{
56
"total": 66,
7+
"codeLines": 3,
68
"coverage": {
79
"1": 1,
810
"4": 1
@@ -11,6 +13,7 @@
1113
},
1214
{
1315
"total": 49,
16+
"codeLines": 59,
1417
"coverage": {
1518
"50": 1,
1619
"60": 1,

tests/filepath/coverage.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
{
22
"total": 50,
3+
"codeLines": 62,
34
"fileReports": [
45
{
56
"total": 66,
7+
"codeLines": 3,
68
"coverage": {
79
"1": 1,
810
"4": 1
@@ -11,6 +13,7 @@
1113
},
1214
{
1315
"total": 49,
16+
"codeLines": 59,
1417
"coverage": {
1518
"50": 1,
1619
"60": 1,

0 commit comments

Comments
 (0)