codeclimate-test-reporter 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/README.md +3 -3
- data/lib/code_climate/test_reporter/configuration.rb +1 -1
- data/lib/code_climate/test_reporter/formatter.rb +10 -1
- data/lib/code_climate/test_reporter/payload_validator.rb +59 -0
- data/lib/code_climate/test_reporter/version.rb +1 -1
- data/spec/lib/configuration_spec.rb +14 -0
- data/spec/lib/formatter_spec.rb +23 -5
- data/spec/lib/payload_validator_spec.rb +89 -0
- metadata +8 -21
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZGE4Y2ZjZDBmYzMyMzdhNzhkN2M1NGNhZWI5N2JkNWVmY2FjNzAxNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YTc5MjYzNTJmMGViZDdkNTQ5MzhkNjQ4MTE3ODYwMzM4OTk4NGIyMA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MTM2ZTY3YWU4MjlmZTdlM2U2NjgyNDVlYTQ1NWI5Y2EwMmRkYTU0MjM3YTM3
|
10
|
+
N2I4YzJjZWZmNmM3NGNlNTkwMDQzNTFjNmZhY2M2YWUwMzQ3YTA4MTc0ZTVi
|
11
|
+
NGI2NjI5NmM3Yzg5MzEyNjJlNWZiYzE0NGIxZGFkNTczMDk3Mjg=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDc4NzgxNWY5ZWQzMzA2NDBkYmYyMzY2MGJiNjVlYzhlZjZkNjdlMDYzZGY3
|
14
|
+
MzNlNDI0NWJiZWM0YTA0M2U1ZmIzYTg2NDQ1OTIzODEwYjdlMDJkZTVlMTRm
|
15
|
+
ZjM3YWFiNmVkZTY0ZWNjNTIyODIzNjZmNmEyNTA4YWI5Y2VlZTE=
|
data/README.md
CHANGED
@@ -14,9 +14,9 @@ first step is to create an account at: [https://codeclimate.com](https://codecli
|
|
14
14
|
|
15
15
|
1. Add this to your Gemfile:
|
16
16
|
|
17
|
-
gem
|
17
|
+
gem "codeclimate-test-reporter", group: :test
|
18
18
|
|
19
|
-
1. Start the test reporter **
|
19
|
+
1. Start the test reporter **on the very first line** of your `test_helper.rb` or
|
20
20
|
`spec_helper.rb` file:
|
21
21
|
|
22
22
|
require "codeclimate-test-reporter"
|
@@ -26,7 +26,7 @@ Then set the `CODECLIMATE_REPO_TOKEN` environment variable when you run your bui
|
|
26
26
|
on your CI server, and the results will show up in your Code Climate account.
|
27
27
|
|
28
28
|
The `CODECLIMATE_REPO_TOKEN` value is provided after you add your repo to your
|
29
|
-
Code Climate account
|
29
|
+
Code Climate account by clicking on "Setup Test Coverage" on the right hand side of your feed.
|
30
30
|
|
31
31
|
Please contact hello@codeclimate.com if you need any assistance setting this up.
|
32
32
|
|
@@ -5,6 +5,7 @@ require "digest/sha1"
|
|
5
5
|
require "simplecov"
|
6
6
|
|
7
7
|
require "code_climate/test_reporter/exception_message"
|
8
|
+
require "code_climate/test_reporter/payload_validator"
|
8
9
|
|
9
10
|
module CodeClimate
|
10
11
|
module TestReporter
|
@@ -13,6 +14,7 @@ module CodeClimate
|
|
13
14
|
print "Coverage = #{round(result.covered_percent, 2)}%. "
|
14
15
|
|
15
16
|
payload = to_payload(result)
|
17
|
+
PayloadValidator.validate(payload)
|
16
18
|
if tddium? || ENV["TO_FILE"]
|
17
19
|
file_path = File.join(Dir.tmpdir, "codeclimate-test-coverage-#{SecureRandom.uuid}.json")
|
18
20
|
print "Coverage results saved to #{file_path}... "
|
@@ -84,7 +86,8 @@ module CodeClimate
|
|
84
86
|
|
85
87
|
def short_filename(filename)
|
86
88
|
return filename unless ::SimpleCov.root
|
87
|
-
filename.gsub(::SimpleCov.root, '.').gsub(/^\.\//, '')
|
89
|
+
filename = filename.gsub(::SimpleCov.root, '.').gsub(/^\.\//, '')
|
90
|
+
apply_prefix filename
|
88
91
|
end
|
89
92
|
|
90
93
|
def tddium?
|
@@ -99,6 +102,12 @@ module CodeClimate
|
|
99
102
|
|
100
103
|
private
|
101
104
|
|
105
|
+
def apply_prefix filename
|
106
|
+
prefix = CodeClimate::TestReporter.configuration.path_prefix
|
107
|
+
return filename if prefix.nil?
|
108
|
+
"#{prefix}/#{filename}"
|
109
|
+
end
|
110
|
+
|
102
111
|
def ci_service_data
|
103
112
|
@ci_service_data ||= Ci.service_data
|
104
113
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module CodeClimate
|
2
|
+
module TestReporter
|
3
|
+
InvalidPayload = Class.new(StandardError)
|
4
|
+
|
5
|
+
class PayloadValidator
|
6
|
+
def initialize(payload)
|
7
|
+
@payload = payload
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.validate(payload)
|
11
|
+
new(payload).validate
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate
|
15
|
+
raise InvalidPayload, "A git commit sha was not found in the test report payload" unless commit_sha
|
16
|
+
raise InvalidPayload, "A git commit timestamp was not found in the test report payload" unless committed_at
|
17
|
+
raise InvalidPayload, "A run at timestamp was not found in the test report payload" unless run_at
|
18
|
+
raise InvalidPayload, "No source files were found in the test report payload" unless source_files?
|
19
|
+
raise InvalidPayload, "Invalid source files were found in the test report payload" unless valid_source_files?
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def commit_sha
|
26
|
+
commit_sha_from_git || commit_sha_from_ci_service
|
27
|
+
end
|
28
|
+
|
29
|
+
def committed_at
|
30
|
+
@payload[:git] && @payload[:git][:committed_at]
|
31
|
+
end
|
32
|
+
|
33
|
+
def run_at
|
34
|
+
@payload[:run_at]
|
35
|
+
end
|
36
|
+
|
37
|
+
def source_files?
|
38
|
+
@payload[:source_files] && @payload[:source_files].any?
|
39
|
+
end
|
40
|
+
|
41
|
+
def valid_source_files?
|
42
|
+
@payload[:source_files].all? { |s| valid_source_file?(s) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def valid_source_file?(file)
|
46
|
+
file.is_a?(Hash) && file[:coverage] && file[:name]
|
47
|
+
end
|
48
|
+
|
49
|
+
def commit_sha_from_git
|
50
|
+
@payload[:git] && @payload[:git][:head]
|
51
|
+
end
|
52
|
+
|
53
|
+
def commit_sha_from_ci_service
|
54
|
+
@payload[:ci_service] && @payload[:ci_service][:commit_sha]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -13,6 +13,7 @@ module CodeClimate::TestReporter
|
|
13
13
|
expect(CodeClimate::TestReporter.configuration.logger).to be_instance_of Logger
|
14
14
|
expect(CodeClimate::TestReporter.configuration.logger.level).to eq Logger::INFO
|
15
15
|
expect(CodeClimate::TestReporter.configuration.profile).to eq('test_frameworks')
|
16
|
+
expect(CodeClimate::TestReporter.configuration.path_prefix).to be_nil
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
@@ -47,6 +48,19 @@ module CodeClimate::TestReporter
|
|
47
48
|
|
48
49
|
expect(CodeClimate::TestReporter.configuration.profile).to eq('custom')
|
49
50
|
end
|
51
|
+
|
52
|
+
it 'stores path prefix' do
|
53
|
+
CodeClimate::TestReporter.configure do |config|
|
54
|
+
config.path_prefix = 'custom'
|
55
|
+
end
|
56
|
+
|
57
|
+
expect(CodeClimate::TestReporter.configuration.path_prefix).to eq('custom')
|
58
|
+
|
59
|
+
CodeClimate::TestReporter.configure do |config|
|
60
|
+
config.path_prefix = nil
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
50
64
|
end
|
51
65
|
end
|
52
66
|
end
|
data/spec/lib/formatter_spec.rb
CHANGED
@@ -8,10 +8,10 @@ module CodeClimate::TestReporter
|
|
8
8
|
let(:formatter) { Formatter.new }
|
9
9
|
let(:files) {
|
10
10
|
[
|
11
|
-
|
12
|
-
:lines => [
|
13
|
-
:covered_lines => [
|
14
|
-
:missed_lines => [
|
11
|
+
double(
|
12
|
+
:lines => [double, double, double],
|
13
|
+
:covered_lines => [double, double],
|
14
|
+
:missed_lines => [double],
|
15
15
|
:filename => project_file,
|
16
16
|
:coverage => [0,3,2,nil],
|
17
17
|
:covered_percent => 33.2,
|
@@ -21,7 +21,7 @@ module CodeClimate::TestReporter
|
|
21
21
|
}
|
22
22
|
|
23
23
|
let(:simplecov_result) {
|
24
|
-
|
24
|
+
double(
|
25
25
|
:covered_percent => 24.3,
|
26
26
|
:covered_strength => 33.2,
|
27
27
|
:files => files,
|
@@ -98,4 +98,22 @@ module CodeClimate::TestReporter
|
|
98
98
|
app.http_user_agent.should include("v#{CodeClimate::TestReporter::VERSION}")
|
99
99
|
end
|
100
100
|
end
|
101
|
+
|
102
|
+
describe '#short_filename' do
|
103
|
+
it 'should return the filename of the file relative to the SimpleCov root' do
|
104
|
+
CodeClimate::TestReporter::Formatter.new.short_filename('file1').should == 'file1'
|
105
|
+
CodeClimate::TestReporter::Formatter.new.short_filename("#{::SimpleCov.root}/file1").should == 'file1'
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should include the path prefix if set' do
|
109
|
+
CodeClimate::TestReporter.configure do |config|
|
110
|
+
config.path_prefix = 'custom'
|
111
|
+
end
|
112
|
+
CodeClimate::TestReporter::Formatter.new.short_filename('file1').should == 'custom/file1'
|
113
|
+
CodeClimate::TestReporter::Formatter.new.short_filename("#{::SimpleCov.root}/file1").should == 'custom/file1'
|
114
|
+
CodeClimate::TestReporter.configure do |config|
|
115
|
+
config.path_prefix = nil
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
101
119
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module CodeClimate::TestReporter
|
4
|
+
describe PayloadValidator do
|
5
|
+
let(:payload) {
|
6
|
+
{
|
7
|
+
git: {
|
8
|
+
committed_at: 1389603672,
|
9
|
+
head: "4b968f076d169c3d98089fba27988f0d52ba803d"
|
10
|
+
},
|
11
|
+
run_at: 1379704336,
|
12
|
+
source_files: [
|
13
|
+
{ coverage: "[0,3,4]", name: "user.rb" }
|
14
|
+
]
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
it "does not raise if there's a minimally valid test report payload" do
|
19
|
+
expect {
|
20
|
+
PayloadValidator.validate(payload)
|
21
|
+
}.to_not raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
it "raises when there's no commit sha" do
|
25
|
+
payload[:git][:head] = nil
|
26
|
+
expect {
|
27
|
+
PayloadValidator.validate(payload)
|
28
|
+
}.to raise_error(InvalidPayload, /A git commit sha was not found/)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "does not raise if there's a commit sha in ci_service data" do
|
32
|
+
payload[:git][:head] = nil
|
33
|
+
payload[:ci_service] = {}
|
34
|
+
payload[:ci_service][:commit_sha] = "4b968f076d169c3d98089fba27988f0d52ba803d"
|
35
|
+
expect {
|
36
|
+
PayloadValidator.validate(payload)
|
37
|
+
}.to_not raise_error
|
38
|
+
end
|
39
|
+
|
40
|
+
it "raises when there is no committed_at" do
|
41
|
+
payload[:git][:committed_at] = nil
|
42
|
+
expect {
|
43
|
+
PayloadValidator.validate(payload)
|
44
|
+
}.to raise_error(InvalidPayload, /A git commit timestamp was not found/)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "raises when there's no run_at" do
|
48
|
+
payload[:run_at] = nil
|
49
|
+
expect {
|
50
|
+
PayloadValidator.validate(payload)
|
51
|
+
}.to raise_error(InvalidPayload, /A run at timestamp was not found/)
|
52
|
+
end
|
53
|
+
|
54
|
+
it "raises when no source_files parameter is passed" do
|
55
|
+
payload[:source_files] = nil
|
56
|
+
expect {
|
57
|
+
PayloadValidator.validate(payload)
|
58
|
+
}.to raise_error(InvalidPayload, /No source files were found/)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "raises when there's no source files" do
|
62
|
+
payload[:source_files] = []
|
63
|
+
expect {
|
64
|
+
PayloadValidator.validate(payload)
|
65
|
+
}.to raise_error(InvalidPayload, /No source files were found/)
|
66
|
+
end
|
67
|
+
|
68
|
+
it "raises if source files aren't hashes" do
|
69
|
+
payload[:source_files] = [1,2,3]
|
70
|
+
expect {
|
71
|
+
PayloadValidator.validate(payload)
|
72
|
+
}.to raise_error(InvalidPayload, /Invalid source files/)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "raises if source files don't have names" do
|
76
|
+
payload[:source_files] = [{ coverage: "[1,1]" }]
|
77
|
+
expect {
|
78
|
+
PayloadValidator.validate(payload)
|
79
|
+
}.to raise_error(InvalidPayload, /Invalid source files/)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "raises if source files don't have coverage" do
|
83
|
+
payload[:source_files] = [{ name: "foo.rb" }]
|
84
|
+
expect {
|
85
|
+
PayloadValidator.validate(payload)
|
86
|
+
}.to raise_error(InvalidPayload, /Invalid source files/)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codeclimate-test-reporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Bryan Helmkamp
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: simplecov
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ! '>='
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -25,7 +23,6 @@ dependencies:
|
|
25
23
|
type: :runtime
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
27
|
- - ! '>='
|
31
28
|
- !ruby/object:Gem::Version
|
@@ -36,7 +33,6 @@ dependencies:
|
|
36
33
|
- !ruby/object:Gem::Dependency
|
37
34
|
name: bundler
|
38
35
|
requirement: !ruby/object:Gem::Requirement
|
39
|
-
none: false
|
40
36
|
requirements:
|
41
37
|
- - ~>
|
42
38
|
- !ruby/object:Gem::Version
|
@@ -44,7 +40,6 @@ dependencies:
|
|
44
40
|
type: :development
|
45
41
|
prerelease: false
|
46
42
|
version_requirements: !ruby/object:Gem::Requirement
|
47
|
-
none: false
|
48
43
|
requirements:
|
49
44
|
- - ~>
|
50
45
|
- !ruby/object:Gem::Version
|
@@ -52,7 +47,6 @@ dependencies:
|
|
52
47
|
- !ruby/object:Gem::Dependency
|
53
48
|
name: rake
|
54
49
|
requirement: !ruby/object:Gem::Requirement
|
55
|
-
none: false
|
56
50
|
requirements:
|
57
51
|
- - ! '>='
|
58
52
|
- !ruby/object:Gem::Version
|
@@ -60,7 +54,6 @@ dependencies:
|
|
60
54
|
type: :development
|
61
55
|
prerelease: false
|
62
56
|
version_requirements: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
57
|
requirements:
|
65
58
|
- - ! '>='
|
66
59
|
- !ruby/object:Gem::Version
|
@@ -68,7 +61,6 @@ dependencies:
|
|
68
61
|
- !ruby/object:Gem::Dependency
|
69
62
|
name: rspec
|
70
63
|
requirement: !ruby/object:Gem::Requirement
|
71
|
-
none: false
|
72
64
|
requirements:
|
73
65
|
- - ! '>='
|
74
66
|
- !ruby/object:Gem::Version
|
@@ -76,7 +68,6 @@ dependencies:
|
|
76
68
|
type: :development
|
77
69
|
prerelease: false
|
78
70
|
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
none: false
|
80
71
|
requirements:
|
81
72
|
- - ! '>='
|
82
73
|
- !ruby/object:Gem::Version
|
@@ -84,7 +75,6 @@ dependencies:
|
|
84
75
|
- !ruby/object:Gem::Dependency
|
85
76
|
name: artifice
|
86
77
|
requirement: !ruby/object:Gem::Requirement
|
87
|
-
none: false
|
88
78
|
requirements:
|
89
79
|
- - ! '>='
|
90
80
|
- !ruby/object:Gem::Version
|
@@ -92,7 +82,6 @@ dependencies:
|
|
92
82
|
type: :development
|
93
83
|
prerelease: false
|
94
84
|
version_requirements: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
85
|
requirements:
|
97
86
|
- - ! '>='
|
98
87
|
- !ruby/object:Gem::Version
|
@@ -100,7 +89,6 @@ dependencies:
|
|
100
89
|
- !ruby/object:Gem::Dependency
|
101
90
|
name: pry
|
102
91
|
requirement: !ruby/object:Gem::Requirement
|
103
|
-
none: false
|
104
92
|
requirements:
|
105
93
|
- - ! '>='
|
106
94
|
- !ruby/object:Gem::Version
|
@@ -108,7 +96,6 @@ dependencies:
|
|
108
96
|
type: :development
|
109
97
|
prerelease: false
|
110
98
|
version_requirements: !ruby/object:Gem::Requirement
|
111
|
-
none: false
|
112
99
|
requirements:
|
113
100
|
- - ! '>='
|
114
101
|
- !ruby/object:Gem::Version
|
@@ -116,7 +103,6 @@ dependencies:
|
|
116
103
|
- !ruby/object:Gem::Dependency
|
117
104
|
name: pry-debugger
|
118
105
|
requirement: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
106
|
requirements:
|
121
107
|
- - ! '>='
|
122
108
|
- !ruby/object:Gem::Version
|
@@ -124,7 +110,6 @@ dependencies:
|
|
124
110
|
type: :development
|
125
111
|
prerelease: false
|
126
112
|
version_requirements: !ruby/object:Gem::Requirement
|
127
|
-
none: false
|
128
113
|
requirements:
|
129
114
|
- - ! '>='
|
130
115
|
- !ruby/object:Gem::Version
|
@@ -154,43 +139,45 @@ files:
|
|
154
139
|
- lib/code_climate/test_reporter/exception_message.rb
|
155
140
|
- lib/code_climate/test_reporter/formatter.rb
|
156
141
|
- lib/code_climate/test_reporter/git.rb
|
142
|
+
- lib/code_climate/test_reporter/payload_validator.rb
|
157
143
|
- lib/code_climate/test_reporter/version.rb
|
158
144
|
- lib/codeclimate-test-reporter.rb
|
159
145
|
- spec/lib/ci_spec.rb
|
160
146
|
- spec/lib/configuration_spec.rb
|
161
147
|
- spec/lib/formatter_spec.rb
|
162
148
|
- spec/lib/git_spec.rb
|
149
|
+
- spec/lib/payload_validator_spec.rb
|
163
150
|
- spec/lib/test_reporter_spec.rb
|
164
151
|
- spec/spec_helper.rb
|
165
152
|
homepage: ''
|
166
153
|
licenses:
|
167
154
|
- MIT
|
155
|
+
metadata: {}
|
168
156
|
post_install_message:
|
169
157
|
rdoc_options: []
|
170
158
|
require_paths:
|
171
159
|
- lib
|
172
160
|
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
-
none: false
|
174
161
|
requirements:
|
175
162
|
- - ! '>='
|
176
163
|
- !ruby/object:Gem::Version
|
177
164
|
version: '0'
|
178
165
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
-
none: false
|
180
166
|
requirements:
|
181
167
|
- - ! '>='
|
182
168
|
- !ruby/object:Gem::Version
|
183
169
|
version: '0'
|
184
170
|
requirements: []
|
185
171
|
rubyforge_project:
|
186
|
-
rubygems_version:
|
172
|
+
rubygems_version: 2.2.1
|
187
173
|
signing_key:
|
188
|
-
specification_version:
|
174
|
+
specification_version: 4
|
189
175
|
summary: Uploads Ruby test coverage data to Code Climate.
|
190
176
|
test_files:
|
191
177
|
- spec/lib/ci_spec.rb
|
192
178
|
- spec/lib/configuration_spec.rb
|
193
179
|
- spec/lib/formatter_spec.rb
|
194
180
|
- spec/lib/git_spec.rb
|
181
|
+
- spec/lib/payload_validator_spec.rb
|
195
182
|
- spec/lib/test_reporter_spec.rb
|
196
183
|
- spec/spec_helper.rb
|