Skip to content

Commit 7d8711e

Browse files
authored
Make simplecov json formatter more flexible (#488)
* Make simplecov json formatter more flexible * add tests * bump circleci xcode version * read simplecov version from report to fallback to legacy formatter
1 parent 61c0e77 commit 7d8711e

File tree

4 files changed

+204
-2
lines changed

4 files changed

+204
-2
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ linux_image: &linux_image
99

1010
macos_image: &macos_image
1111
macos:
12-
xcode: "11.3.0"
12+
xcode: "11.4.0"
1313

1414
setup_macos_env: &setup_macos_env
1515

formatters/simplecov/json_formatter.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package simplecov
33
import (
44
"encoding/json"
55
"os"
6+
"fmt"
67

78
"github.com/Sirupsen/logrus"
89
"github.com/codeclimate/test-reporter/env"
@@ -31,6 +32,19 @@ type simplecovJsonFormatterReport struct {
3132
CoverageType map[string]fileCoverage `json:"coverage"`
3233
}
3334

35+
func reportIsOnLegacyFormat(simplecovVersion string) bool {
36+
var major, minor, patch int
37+
fmt.Sscanf(simplecovVersion, "%d.%d.%d", &major, &minor, &patch)
38+
39+
if major < 1 {
40+
if minor < 18 {
41+
return true
42+
}
43+
}
44+
45+
return false
46+
}
47+
3448
func transformLineCoverageToCoverage(ln []interface{}) formatters.Coverage {
3549
coverage := make([]formatters.NullInt, len(ln))
3650
ignoredLine := formatters.NullInt{-1, false}
@@ -61,14 +75,17 @@ func jsonFormat(r Formatter, rep formatters.Report) (formatters.Report, error) {
6175

6276
var m simplecovJsonFormatterReport
6377
decoder := json.NewDecoder(jf)
64-
decoder.DisallowUnknownFields()
6578

6679
err = decoder.Decode(&m)
6780

6881
if err != nil {
6982
return rep, errors.WithStack(err)
7083
}
7184

85+
if reportIsOnLegacyFormat(m.Meta.SimpleCovVersion) {
86+
return rep, errors.WithStack(errors.Errorf("Simplecov report is on legacy format, falling back to legacy formatter."))
87+
}
88+
7289
gitHead, _ := env.GetHead()
7390
for n, ls := range m.CoverageType {
7491
fe, err := formatters.NewSourceFile(n, gitHead)
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
{
2+
"meta": {
3+
"simplecov_version": "0.19.0"
4+
},
5+
"coverage": {
6+
"development/mygem/lib/mygem/errors.rb": {
7+
"lines": [
8+
1,
9+
null,
10+
1,
11+
1,
12+
0,
13+
null,
14+
null,
15+
null,
16+
1,
17+
null,
18+
null,
19+
null,
20+
1,
21+
null,
22+
null,
23+
null,
24+
1,
25+
null,
26+
null,
27+
null,
28+
null
29+
]
30+
},
31+
"development/mygem/lib/mygem/definition_manager.rb": {
32+
"lines": [
33+
1,
34+
1,
35+
1,
36+
null,
37+
1,
38+
null,
39+
1,
40+
1,
41+
null,
42+
null,
43+
1,
44+
8,
45+
null,
46+
null,
47+
1,
48+
19,
49+
null,
50+
null,
51+
1,
52+
null,
53+
1,
54+
8,
55+
null,
56+
null,
57+
1,
58+
11,
59+
null,
60+
null,
61+
null,
62+
null,
63+
null,
64+
null
65+
]
66+
},
67+
"development/mygem/lib/mygem/interface.rb": {
68+
"lines": [
69+
1,
70+
null,
71+
1,
72+
1,
73+
null,
74+
1,
75+
8,
76+
null,
77+
null,
78+
null,
79+
null
80+
]
81+
},
82+
"development/mygem/lib/mygem/implements.rb": {
83+
"lines": [
84+
1,
85+
null,
86+
1,
87+
9,
88+
null,
89+
null,
90+
null
91+
]
92+
},
93+
"development/mygem/lib/mygem/implementation_manager.rb": {
94+
"lines": [
95+
1,
96+
1,
97+
1,
98+
null,
99+
1,
100+
null,
101+
1,
102+
1,
103+
null,
104+
null,
105+
1,
106+
9,
107+
null,
108+
null,
109+
1,
110+
82,
111+
null,
112+
null,
113+
1,
114+
null,
115+
1,
116+
9,
117+
null,
118+
null,
119+
1,
120+
73,
121+
null,
122+
null,
123+
null,
124+
null,
125+
null,
126+
null
127+
]
128+
},
129+
"development/mygem/lib/mygem/wrap.rb": {
130+
"lines": [
131+
1,
132+
null,
133+
1,
134+
17,
135+
20,
136+
16,
137+
16,
138+
12,
139+
null,
140+
null
141+
]
142+
},
143+
"development/mygem/lib/mygem/type_check.rb": {
144+
"lines": [
145+
1,
146+
null,
147+
1,
148+
7,
149+
7,
150+
7,
151+
null,
152+
null,
153+
null
154+
]
155+
}
156+
},
157+
"groups": {}
158+
}

formatters/simplecov/simplecov_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,3 +248,30 @@ func Test_Format_Merged(t *testing.T) {
248248
assert.Equal(lc.Missed, 2)
249249
assert.Equal(lc.Total, 8)
250250
}
251+
252+
func Test_ParseWithGroups(t *testing.T) {
253+
ogb := env.GitBlob
254+
defer func() {
255+
env.GitBlob = ogb
256+
}()
257+
env.GitBlob = func(s string, c *object.Commit) (string, error) {
258+
return s, nil
259+
}
260+
261+
assert := require.New(t)
262+
263+
formatter := Formatter{
264+
Path: "./simplecov-with-groups.json",
265+
}
266+
rep, err := formatter.Format()
267+
assert.NoError(err)
268+
269+
assert.Len(rep.SourceFiles, 7)
270+
271+
cf := rep.SourceFiles["development/mygem/lib/mygem/wrap.rb"]
272+
assert.Len(cf.Coverage, 10)
273+
for i, x := range []interface{}{1, nil, 1, 17, 20, 16, 16, 12, nil, nil} {
274+
l := cf.Coverage[i]
275+
assert.Equal(x, l.Interface())
276+
}
277+
}

0 commit comments

Comments
 (0)