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

Commit deb2e05

Browse files
authoredAug 25, 2016
Merge pull request #24 from spresse1/master
Add multi-file coverage parsing
2 parents 80407e3 + 3fc5838 commit deb2e05

File tree

5 files changed

+255
-12
lines changed

5 files changed

+255
-12
lines changed
 

‎src/codacy/reporter.py

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,30 @@ def strip_prefix(line, prefix):
7676
return filename
7777

7878

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+
}
85+
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']
91+
92+
# Gather all per-file coverage
93+
total_coverages = []
94+
for fileentry in final_report['fileReports']:
95+
total_coverages += [fileentry['total']]
96+
97+
# And average
98+
final_report['total'] = sum(total_coverages)/len(total_coverages)
99+
100+
return final_report
101+
102+
79103
def parse_report_file(report_file, git_directory):
80104
"""Parse XML file and POST it to the Codacy API
81105
:param report_file:
@@ -140,7 +164,9 @@ def upload_report(report, token, commit):
140164

141165
def run():
142166
parser = argparse.ArgumentParser(description='Codacy coverage reporter for Python.')
143-
parser.add_argument("-r", "--report", type=str, help="coverage report file", default=DEFAULT_REPORT_FILE)
167+
parser.add_argument("-r", "--report", help="coverage report file",
168+
default=[DEFAULT_REPORT_FILE], type=str,
169+
action='append')
144170
parser.add_argument("-c", "--commit", type=str, help="git commit hash")
145171
parser.add_argument("-d", "--directory", type=str, help="git top level directory")
146172
parser.add_argument("-v", "--verbose", help="show debug information", action="store_true")
@@ -157,12 +183,18 @@ def run():
157183
if not args.commit:
158184
args.commit = get_git_revision_hash()
159185

160-
if not os.path.isfile(args.report):
161-
logging.error("Coverage report " + args.report + " not found.")
162-
exit(1)
186+
# Explictly check ALL files before parsing any
187+
for rfile in args.report:
188+
if not os.path.isfile(rfile):
189+
logging.error("Coverage report " + args.report + " not found.")
190+
exit(1)
191+
192+
reports = []
193+
for rfile in args.report:
194+
logging.info("Parsing report file %s...", rfile)
195+
reports.append(parse_report_file(rfile, args.directory))
163196

164-
logging.info("Parsing report file...")
165-
report = parse_report_file(args.report, args.directory)
197+
report = merge_reports(reports)
166198

167199
logging.info("Uploading report...")
168200
upload_report(report, CODACY_PROJECT_TOKEN, args.commit)

‎tests/coverage-merge/cobertura.3.xml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<coverage line-rate="0.87">
2+
<packages>
3+
<package line-rate="0.87" name="com.github.codacy">
4+
<classes>
5+
<class line-rate="0.87" name="TestSourceFile" filename="src/test/resources/TestSourceFile.scala">
6+
<methods/>
7+
<lines>
8+
<line number="4" hits="1"/>
9+
<line number="5" hits="1"/>
10+
<line number="6" hits="2"/>
11+
</lines>
12+
</class>
13+
<class line-rate="0.87" name="TestSourceFile" filename="src/test/resources/TestSourceFile.scala">
14+
<methods/>
15+
<lines>
16+
<line number="9" hits="1"/>
17+
<line number="10" hits="1"/>
18+
</lines>
19+
</class>
20+
<class line-rate="0.87" name="TestSourceFile2" filename="src/test/resources/TestSourceFile2.scala">
21+
<methods/>
22+
<lines>
23+
<line number="1" hits="1"/>
24+
<line number="2" hits="1"/>
25+
<line number="3" hits="1"/>
26+
</lines>
27+
</class>
28+
</classes>
29+
</package>
30+
</packages>
31+
</coverage>

‎tests/coverage-merge/cobertura.4.xml

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
<?xml version="1.0" ?>
2+
<coverage branch-rate="0" line-rate="0.5" timestamp="1446545132707" version="4.0.1">
3+
<!-- Generated by coverage.py: https://coverage.readthedocs.org -->
4+
<!-- Based on https://raw.githubusercontent.com/cobertura/web/f0366e5e2cf18f111cbd61fc34ef720a6584ba02/htdocs/xml/coverage-03.dtd -->
5+
<sources>
6+
<source>/Users/rafaelcortes/Documents/qamine/python-codacycov</source>
7+
</sources>
8+
<packages>
9+
<package branch-rate="0" complexity="0" line-rate="0.5" name="src.codacy">
10+
<classes>
11+
<class branch-rate="0" complexity="0" filename="src/codacy/__init__.py" line-rate="0.6667" name="__init__.py">
12+
<methods/>
13+
<lines>
14+
<line hits="1" number="1"/>
15+
<line hits="1" number="4"/>
16+
<line hits="0" number="5"/>
17+
</lines>
18+
</class>
19+
<class branch-rate="0" complexity="0" filename="src/codacy/reporter.py" line-rate="0.4915" name="reporter.py">
20+
<methods/>
21+
<lines>
22+
<line hits="1" number="3"/>
23+
<line hits="1" number="4"/>
24+
<line hits="1" number="5"/>
25+
<line hits="1" number="6"/>
26+
<line hits="1" number="7"/>
27+
<line hits="1" number="9"/>
28+
<line hits="1" number="11"/>
29+
<line hits="1" number="14"/>
30+
<line hits="1" number="15"/>
31+
<line hits="1" number="16"/>
32+
<line hits="1" number="17"/>
33+
<line hits="1" number="20"/>
34+
<line hits="0" number="21"/>
35+
<line hits="0" number="23"/>
36+
<line hits="1" number="26"/>
37+
<line hits="1" number="30"/>
38+
<line hits="1" number="31"/>
39+
<line hits="1" number="34"/>
40+
<line hits="1" number="36"/>
41+
<line hits="1" number="42"/>
42+
<line hits="1" number="43"/>
43+
<line hits="1" number="44"/>
44+
<line hits="1" number="49"/>
45+
<line hits="1" number="50"/>
46+
<line hits="1" number="51"/>
47+
<line hits="1" number="52"/>
48+
<line hits="1" number="54"/>
49+
<line hits="1" number="55"/>
50+
<line hits="1" number="57"/>
51+
<line hits="1" number="60"/>
52+
<line hits="0" number="62"/>
53+
<line hits="0" number="63"/>
54+
<line hits="0" number="64"/>
55+
<line hits="0" number="69"/>
56+
<line hits="0" number="71"/>
57+
<line hits="0" number="73"/>
58+
<line hits="0" number="74"/>
59+
<line hits="0" number="76"/>
60+
<line hits="0" number="77"/>
61+
<line hits="1" number="80"/>
62+
<line hits="0" number="81"/>
63+
<line hits="0" number="82"/>
64+
<line hits="0" number="83"/>
65+
<line hits="0" number="84"/>
66+
<line hits="0" number="86"/>
67+
<line hits="0" number="88"/>
68+
<line hits="0" number="89"/>
69+
<line hits="0" number="91"/>
70+
<line hits="0" number="92"/>
71+
<line hits="0" number="93"/>
72+
<line hits="0" number="95"/>
73+
<line hits="0" number="96"/>
74+
<line hits="0" number="98"/>
75+
<line hits="0" number="99"/>
76+
<line hits="0" number="100"/>
77+
<line hits="0" number="102"/>
78+
<line hits="0" number="103"/>
79+
<line hits="0" number="105"/>
80+
<line hits="0" number="106"/>
81+
</lines>
82+
</class>
83+
</classes>
84+
</package>
85+
</packages>
86+
</coverage>
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
{
2+
"total": 75,
3+
"fileReports": [
4+
{
5+
"total": 87,
6+
"coverage": {
7+
"5": 1,
8+
"4": 1,
9+
"6": 2
10+
},
11+
"filename": "src/test/resources/TestSourceFile.scala"
12+
},
13+
{
14+
"total": 87,
15+
"coverage": {
16+
"9": 1,
17+
"10": 1
18+
},
19+
"filename": "src/test/resources/TestSourceFile.scala"
20+
},
21+
{
22+
"total": 87,
23+
"coverage": {
24+
"1": 1,
25+
"3": 1,
26+
"2": 1
27+
},
28+
"filename": "src/test/resources/TestSourceFile2.scala"
29+
},
30+
{
31+
"total": 66,
32+
"coverage": {
33+
"1": 1,
34+
"4": 1
35+
},
36+
"filename": "src/codacy/__init__.py"
37+
},
38+
{
39+
"total": 49,
40+
"coverage": {
41+
"50": 1,
42+
"60": 1,
43+
"80": 1,
44+
"52": 1,
45+
"26": 1,
46+
"20": 1,
47+
"49": 1,
48+
"44": 1,
49+
"42": 1,
50+
"43": 1,
51+
"3": 1,
52+
"5": 1,
53+
"4": 1,
54+
"7": 1,
55+
"6": 1,
56+
"9": 1,
57+
"11": 1,
58+
"15": 1,
59+
"14": 1,
60+
"17": 1,
61+
"16": 1,
62+
"55": 1,
63+
"54": 1,
64+
"31": 1,
65+
"30": 1,
66+
"51": 1,
67+
"36": 1,
68+
"34": 1,
69+
"57": 1
70+
},
71+
"filename": "src/codacy/reporter.py"
72+
}
73+
],
74+
"language": "python"
75+
}

‎tests/tests.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@ def _file_location(*args):
1515

1616
class ReporterTests(unittest.TestCase):
1717

18-
def compare_parse_result(self, generated_filename, expected_filename):
18+
def compare_parse_result(self, generated, expected_filename):
1919
def file_get_contents(filename):
2020
with open(filename) as f:
2121
return f.read()
2222

23-
generated = codacy.reporter.parse_report_file(generated_filename, '')
24-
2523
json_content = file_get_contents(expected_filename)
2624
expected = json.loads(json_content)
2725

@@ -30,21 +28,42 @@ def file_get_contents(filename):
3028
def test_parser_coverage3(self):
3129
self.maxDiff = None
3230

33-
self.compare_parse_result(_file_location('coverage3', 'cobertura.xml'),
31+
generated = codacy.reporter.parse_report_file(
32+
_file_location('coverage3', 'cobertura.xml'), '')
33+
self.compare_parse_result(generated,
3434
_file_location('coverage3', 'coverage.json'))
3535

3636
def test_parser_coverage4(self):
3737
self.maxDiff = None
3838

39-
self.compare_parse_result(_file_location('coverage4', 'cobertura.xml'),
39+
generated = codacy.reporter.parse_report_file(
40+
_file_location('coverage4', 'cobertura.xml'), '')
41+
self.compare_parse_result(generated,
4042
_file_location('coverage4', 'coverage.json'))
4143

4244
def test_parser_git_filepath(self):
4345
self.maxDiff = None
4446

45-
self.compare_parse_result(_file_location('filepath', 'cobertura.xml.tpl'),
47+
generated = codacy.reporter.parse_report_file(
48+
_file_location('filepath', 'cobertura.xml.tpl'), '')
49+
50+
self.compare_parse_result(generated,
4651
_file_location('filepath', 'coverage.json'))
4752

53+
def test_merge(self):
54+
self.maxDiff = None
55+
56+
generated3 = codacy.reporter.parse_report_file(
57+
_file_location('coverage-merge', 'cobertura.3.xml'), '')
58+
generated4 = codacy.reporter.parse_report_file(
59+
_file_location('coverage-merge', 'cobertura.4.xml'), '')
60+
61+
result = codacy.reporter.merge_reports([generated3, generated4])
62+
63+
self.compare_parse_result(result, _file_location('coverage-merge', 'coverage-merge.json'))
64+
65+
66+
4867

4968
if __name__ == '__main__':
5069
unittest.main()

0 commit comments

Comments
 (0)
This repository has been archived.