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

Commit 7a1be37

Browse files
committed
Add support fo coverage 4 and relative git file paths
1 parent 302aa9e commit 7a1be37

File tree

10 files changed

+367
-40
lines changed

10 files changed

+367
-40
lines changed

Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ install: build
99
test: pep8 pyflakes
1010
python setup.py test
1111

12+
coverage:
13+
rm coverage.xml
14+
coverage run --source src/codacy/ setup.py test
15+
coverage xml
16+
python-codacy-coverage -r coverage.xml
17+
1218
# requires "pip install pep8"
1319
pep8:
1420
@git ls-files | grep \\.py$ | xargs pep8

src/codacy/reporter.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import logging
66
import os
77
from xml.dom import minidom
8-
98
import requests
109

1110
logging.basicConfig(level=logging.INFO,
@@ -23,8 +22,42 @@ def get_git_revision_hash():
2322
return subprocess.check_output(['git', 'rev-parse', 'HEAD']).strip()
2423

2524

25+
def get_git_directory():
26+
import subprocess
27+
28+
return subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).strip()
29+
30+
31+
def file_exists(rootdir, filename):
32+
for root, subFolders, files in os.walk(rootdir):
33+
if filename in files:
34+
return True
35+
else:
36+
for subFolder in subFolders:
37+
return file_exists(subFolder, filename)
38+
return False
39+
40+
41+
def generate_filename(sources, filename):
42+
def strip_prefix(line, prefix):
43+
if line.startswith(prefix):
44+
return line[len(prefix):]
45+
else:
46+
return line
47+
48+
git_directory = get_git_directory()
49+
50+
for source in sources:
51+
if file_exists(source, filename):
52+
return strip_prefix(source, git_directory).strip("/") + "/" + filename.strip("/")
53+
54+
return filename
55+
56+
2657
def parse_report_file(report_file):
27-
"""Parse XML file and POST it to the Codacy API"""
58+
"""Parse XML file and POST it to the Codacy API
59+
:param report_file:
60+
"""
2861

2962
# Convert decimal string to floored int percent value
3063
def percent(s):
@@ -39,10 +72,11 @@ def percent(s):
3972
'fileReports': [],
4073
}
4174

75+
sources = map(lambda x: x.firstChild.nodeValue, report_xml.getElementsByTagName('source'))
4276
classes = report_xml.getElementsByTagName('class')
4377
for cls in classes:
4478
file_report = {
45-
'filename': cls.attributes['filename'].value,
79+
'filename': generate_filename(sources, cls.attributes['filename'].value),
4680
'total': percent(cls.attributes['line-rate'].value),
4781
'coverage': {},
4882
}

tests.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,33 @@
44

55

66
class ReporterTests(unittest.TestCase):
7-
8-
def test_parser(self):
7+
def compare_parse_result(self, generated_filename, expected_filename):
98
def file_get_contents(filename):
109
with open(filename) as f:
1110
return f.read()
1211

13-
jsonContent = file_get_contents('tests/coverage.json')
14-
expected = json.loads(jsonContent)
12+
generated = codacy.reporter.parse_report_file(generated_filename)
13+
14+
json_content = file_get_contents(expected_filename)
15+
expected = json.loads(json_content)
1516

16-
generated = codacy.reporter.parse_report_file('tests/cobertura.xml')
1717
self.assertEqual(generated, expected)
1818

19+
def test_parser_coverage3(self):
20+
self.maxDiff = None
21+
22+
self.compare_parse_result('tests/coverage3/cobertura.xml', 'tests/coverage3/coverage.json')
23+
24+
def test_parser_coverage4(self):
25+
self.maxDiff = None
26+
27+
self.compare_parse_result('tests/coverage4/cobertura.xml', 'tests/coverage4/coverage.json')
28+
29+
def test_parser_git_filepath(self):
30+
self.maxDiff = None
31+
32+
self.compare_parse_result('tests/filepath/cobertura.xml', 'tests/filepath/coverage.json')
33+
34+
1935
if __name__ == '__main__':
2036
unittest.main()

tests/coverage.json

Lines changed: 0 additions & 32 deletions
This file was deleted.

tests/coverage3/coverage.json

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
{
2+
"total": 87,
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+
"language": "python"
32+
}

tests/coverage4/cobertura.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>

tests/coverage4/coverage.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
{
2+
"total": 50.0,
3+
"fileReports": [
4+
{
5+
"total": 66.67,
6+
"coverage": {
7+
"1": 1,
8+
"4": 1
9+
},
10+
"filename": "src/codacy/__init__.py"
11+
},
12+
{
13+
"total": 49.15,
14+
"coverage": {
15+
"50": 1,
16+
"60": 1,
17+
"80": 1,
18+
"52": 1,
19+
"26": 1,
20+
"20": 1,
21+
"49": 1,
22+
"44": 1,
23+
"42": 1,
24+
"43": 1,
25+
"3": 1,
26+
"5": 1,
27+
"4": 1,
28+
"7": 1,
29+
"6": 1,
30+
"9": 1,
31+
"11": 1,
32+
"15": 1,
33+
"14": 1,
34+
"17": 1,
35+
"16": 1,
36+
"55": 1,
37+
"54": 1,
38+
"31": 1,
39+
"30": 1,
40+
"51": 1,
41+
"36": 1,
42+
"34": 1,
43+
"57": 1
44+
},
45+
"filename": "src/codacy/reporter.py"
46+
}
47+
],
48+
"language": "python"
49+
}

0 commit comments

Comments
 (0)