circleci-coverage_reporter 0.1.2 → 0.1.3
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 +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +9 -0
- data/README.md +30 -8
- data/lib/circleci/coverage_reporter/client.rb +22 -5
- data/lib/circleci/coverage_reporter/errors.rb +17 -0
- data/lib/circleci/coverage_reporter/github_client.rb +12 -2
- data/lib/circleci/coverage_reporter/report.rb +3 -1
- data/lib/circleci/coverage_reporter/runner.rb +12 -0
- data/lib/circleci/coverage_reporter/simplecov/build_result.rb +4 -2
- data/lib/circleci/coverage_reporter/version.rb +1 -1
- data/lib/circleci/coverage_reporter.rb +15 -13
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7043f473068bec23109876b4e38bf8aca96410f0
|
4
|
+
data.tar.gz: bfeb330edb4de8f150cb1fd4bd0183d33fee6720
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 32ade229dc33219e38c324737c98d8600b70c2bb4a792a486274cd16ccd1e7e0ce1b0ffc886a3251aa4b4a6ac440bed6dcdbad5b8e9d65dd3478e6413550a0f0
|
7
|
+
data.tar.gz: ca44ef9e3ca8faebec5b3510a48bb9142ebac517b66727373445d71e2f96c0d57fac9c4e112827827408e3ffd4d05ec0ba678734b6fbd1fda8546d2332ff04c3
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
## [Unreleased]
|
8
|
+
|
9
|
+
## [0.1.3] - 2017-03-12
|
10
|
+
### Fixed
|
11
|
+
- Raise `RequestError` if some API reqeust fails
|
12
|
+
- Show `NaN` if .last_run.json does not exist
|
13
|
+
|
7
14
|
## [0.1.2] - 2017-03-12
|
8
15
|
### Fixed
|
9
16
|
|
@@ -19,5 +26,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
19
26
|
|
20
27
|
- Initial release
|
21
28
|
|
29
|
+
[Unreleased]: https://github.com/increments/circleci-coverage_reporter/compare/v0.1.3...HEAD
|
30
|
+
[0.1.3]: https://github.com/increments/circleci-coverage_reporter/compare/v0.1.2...v0.1.3
|
22
31
|
[0.1.2]: https://github.com/increments/circleci-coverage_reporter/compare/v0.1.1...v0.1.2
|
23
32
|
[0.1.1]: https://github.com/increments/circleci-coverage_reporter/compare/v0.1.0...v0.1.1
|
data/README.md
CHANGED
@@ -4,6 +4,10 @@
|
|
4
4
|
|
5
5
|
**CircleCI::CoverageReporter** reports test coverage to your GitHub repository.
|
6
6
|
|
7
|
+
## Example
|
8
|
+
|
9
|
+

|
10
|
+
|
7
11
|
## Getting started
|
8
12
|
|
9
13
|
1. Add CircleCI::CoverageReporter to your `Gemfile` and `bundle install`:
|
@@ -18,14 +22,14 @@
|
|
18
22
|
require 'circleci/coverage_reporter/rake_task' if ENV['CIRCLECI']
|
19
23
|
```
|
20
24
|
|
21
|
-
3. Issue CircleCI and GitHub
|
25
|
+
3. Issue CircleCI and GitHub tokens and add them to build environment variables as follows:
|
22
26
|
|
23
27
|
Name | Value
|
24
28
|
-----------------------------------|----------------------------------------------------------------
|
25
29
|
`COVERAGE_REPORTER_CIRCLECI_TOKEN` | CircleCI API token with "view-builds" scope
|
26
30
|
`COVERAGE_REPORTER_VCS_TOKEN` | GitHub personal access token with "repo" or "public_repo" scope
|
27
31
|
|
28
|
-
4. Add the following
|
32
|
+
4. Add the following step to your `circle.yml`:
|
29
33
|
|
30
34
|
```yaml
|
31
35
|
test:
|
@@ -33,23 +37,41 @@
|
|
33
37
|
- bundle exec circleci:report_coverage
|
34
38
|
```
|
35
39
|
|
36
|
-
##
|
40
|
+
## Run manually
|
37
41
|
|
38
|
-
|
39
|
-
|
40
|
-
## Configuring CircleCI::CoverageReporter
|
42
|
+
You must configure `circleci_token` and `vcr_token` before `CircleCI::CoverageReporter.run`:
|
41
43
|
|
42
44
|
```ruby
|
43
45
|
CircleCI::CoverageReporter.configure do |config|
|
44
46
|
config.circleci_token = YOUR_CIRCLECI_API_TOKEN
|
45
47
|
config.vcr_token = YOUR_GITHUB_PERSONAL_ACCESS_TOKEN
|
46
48
|
end
|
49
|
+
|
50
|
+
CircleCI::CoverageReporter.run
|
47
51
|
```
|
48
52
|
|
49
|
-
|
53
|
+
## Reporters
|
54
|
+
### SimpleCov
|
55
|
+
|
56
|
+
`CircleCI::CoverageReporter::SimpleCov::Reporter` handles coverage files generated by
|
57
|
+
[SimpleCov](https://github.com/colszowka/simplecov). It is used by default.
|
58
|
+
|
59
|
+
It expects that coverage files are located in `$CIRCLE_ARTIFACTS/coverage` directory:
|
50
60
|
|
51
61
|
```ruby
|
52
|
-
|
62
|
+
# spec/spec_helper.rb
|
63
|
+
require 'simplecov'
|
64
|
+
# Save to CircleCI's artifacts directory if we're on CircleCI
|
65
|
+
SimpleCov.coverage_dir(File.join(ENV['CIRCLE_ARTIFACTS'], 'coverage')) if ENV['CIRCLECI']
|
66
|
+
SimpleCov.start
|
67
|
+
```
|
68
|
+
|
69
|
+
If you put files in directory, say `$CIRCLE_ARTIFACTS/foo/bar`, you have to set reporter as follows:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
CircleCI::CoverageReporter.configure do |config|
|
73
|
+
config.reporters = [CircleCI::CoverageReporter::SimpleCov::Reporter.new('foo/bar')]
|
74
|
+
end
|
53
75
|
```
|
54
76
|
|
55
77
|
## License
|
@@ -2,6 +2,7 @@ require 'faraday'
|
|
2
2
|
|
3
3
|
require_relative 'artifact'
|
4
4
|
require_relative 'build'
|
5
|
+
require_relative 'errors'
|
5
6
|
|
6
7
|
module CircleCI
|
7
8
|
module CoverageReporter
|
@@ -18,17 +19,23 @@ module CircleCI
|
|
18
19
|
|
19
20
|
# @param build_number [Integer, nil]
|
20
21
|
# @return [Build, nil]
|
22
|
+
# @raise [RequestError]
|
21
23
|
def single_build(build_number)
|
22
24
|
return unless build_number
|
23
|
-
|
25
|
+
resp = get(single_build_url(build_number))
|
26
|
+
body = JSON.parse(resp.body)
|
27
|
+
raise RequestError.new(body['message'], resp) unless resp.success?
|
28
|
+
create_build(body)
|
24
29
|
end
|
25
30
|
|
26
31
|
# @param build_number [Integer]
|
27
32
|
# @return [Array<Artifact>]
|
33
|
+
# @raise [RequestError]
|
28
34
|
def artifacts(build_number)
|
29
|
-
|
30
|
-
|
31
|
-
|
35
|
+
resp = get(artifacts_url(build_number))
|
36
|
+
body = JSON.parse(resp.body)
|
37
|
+
raise RequestError.new(body['message'], resp) unless resp.success?
|
38
|
+
body.map(&method(:create_artifact))
|
32
39
|
end
|
33
40
|
|
34
41
|
# @param revision [String]
|
@@ -64,8 +71,12 @@ module CircleCI
|
|
64
71
|
|
65
72
|
# @param branch [String, nil]
|
66
73
|
# @return [Array<Build>]
|
74
|
+
# @raise [RequestError]
|
67
75
|
def recent_builds(branch)
|
68
|
-
|
76
|
+
resp = get(recent_builds_url(branch), limit: 100)
|
77
|
+
body = JSON.parse(resp.body)
|
78
|
+
raise RequestError.new(body['message'], resp) unless resp.success?
|
79
|
+
body.map(&method(:create_build))
|
69
80
|
end
|
70
81
|
|
71
82
|
# @param branch [String, nil]
|
@@ -93,6 +104,12 @@ module CircleCI
|
|
93
104
|
].join('/')
|
94
105
|
end
|
95
106
|
|
107
|
+
# @param hash [Hash]
|
108
|
+
# @return [Artifact]
|
109
|
+
def create_artifact(hash)
|
110
|
+
Artifact.new(hash['path'], hash['pretty_path'], hash['node_index'], hash['url'])
|
111
|
+
end
|
112
|
+
|
96
113
|
# @param hash [Hash]
|
97
114
|
# @return [Build]
|
98
115
|
def create_build(hash)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module CircleCI
|
2
|
+
module CoverageReporter
|
3
|
+
class Error < StandardError; end
|
4
|
+
|
5
|
+
class RequestError < Error
|
6
|
+
attr_reader :resp
|
7
|
+
|
8
|
+
# @param message [String]
|
9
|
+
# @param resp [Faraday::Response]
|
10
|
+
def initialize(message, resp)
|
11
|
+
@message = message
|
12
|
+
@resp = resp
|
13
|
+
super(message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'abstract_vcs_client'
|
2
|
+
require_relative 'errors'
|
2
3
|
|
3
4
|
module CircleCI
|
4
5
|
module CoverageReporter
|
@@ -6,7 +7,18 @@ module CircleCI
|
|
6
7
|
# @note Implement {AbstractVCSClient#create_comment}
|
7
8
|
# @param reports [Array<Report>]
|
8
9
|
# @return [void]
|
10
|
+
# @raise [RequestError]
|
9
11
|
def create_comment(reports)
|
12
|
+
resp = request(reports)
|
13
|
+
body = JSON.parse(resp.body)
|
14
|
+
raise RequestError.new(body['message'], resp) unless resp.success?
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
# @param reports [Array<Report>]
|
20
|
+
# @return [Faraday::Response]
|
21
|
+
def request(reports)
|
10
22
|
Faraday.new(url: 'https://api.github.com').post do |req|
|
11
23
|
req.url ['/repos', configuration.project, 'commits', configuration.current_revision, 'comments'].join('/')
|
12
24
|
req.headers['Authorization'] = "token #{token}"
|
@@ -15,8 +27,6 @@ module CircleCI
|
|
15
27
|
end
|
16
28
|
end
|
17
29
|
|
18
|
-
private
|
19
|
-
|
20
30
|
# @return [Client]
|
21
31
|
def configuration
|
22
32
|
CoverageReporter.client.configuration
|
@@ -59,7 +59,9 @@ module CircleCI
|
|
59
59
|
# @return [String]
|
60
60
|
def diff(after_result, before_result)
|
61
61
|
value = (after_result.coverage - before_result.coverage).round(2)
|
62
|
-
if value.
|
62
|
+
if value.nan?
|
63
|
+
'NaN'
|
64
|
+
elsif value.positive?
|
63
65
|
"+#{value}"
|
64
66
|
elsif value.negative?
|
65
67
|
value.to_s
|
@@ -5,12 +5,24 @@ module CircleCI
|
|
5
5
|
class Runner
|
6
6
|
# @return [void]
|
7
7
|
def run
|
8
|
+
dump
|
8
9
|
reports = reporters.map { |reporter| reporter.report(base_build, previous_build) }
|
9
10
|
vcs_client.create_comment(reports)
|
10
11
|
end
|
11
12
|
|
12
13
|
private
|
13
14
|
|
15
|
+
# @return [void]
|
16
|
+
def dump
|
17
|
+
puts <<-EOF
|
18
|
+
Runner | Value
|
19
|
+
------------------|-----------------------------------------------------------------------------------
|
20
|
+
base_build | #{base_build.inspect}
|
21
|
+
base_build_number | #{base_build_number.inspect}
|
22
|
+
previous_build | #{previous_build.inspect}
|
23
|
+
EOF
|
24
|
+
end
|
25
|
+
|
14
26
|
# @return [AbstractVCSClient]
|
15
27
|
def vcs_client
|
16
28
|
case client.configuration.vcs_type
|
@@ -12,13 +12,15 @@ module CircleCI
|
|
12
12
|
# @note Implement {AbstractResult#coverage}
|
13
13
|
# @return [Float]
|
14
14
|
def coverage
|
15
|
-
|
15
|
+
last_run_json = find_artifact('.last_run.json') or return Float::NaN
|
16
|
+
JSON.parse(last_run_json.body)['result']['covered_percent']
|
16
17
|
end
|
17
18
|
|
18
19
|
# @note Implement {AbstractResult#url}
|
19
20
|
# @return [String]
|
20
21
|
def url
|
21
|
-
find_artifact('index.html')
|
22
|
+
index_html = find_artifact('index.html') or return '#'
|
23
|
+
index_html.url
|
22
24
|
end
|
23
25
|
|
24
26
|
private
|
@@ -23,24 +23,26 @@ module CircleCI
|
|
23
23
|
|
24
24
|
# @return [void]
|
25
25
|
def self.run
|
26
|
-
Runner.new.run
|
27
|
-
rescue
|
28
26
|
dump
|
29
|
-
|
27
|
+
Runner.new.run
|
30
28
|
end
|
31
29
|
|
32
30
|
# @return [void]
|
33
|
-
def self.dump
|
31
|
+
def self.dump # rubocop:disable AbcSize
|
34
32
|
puts <<-EOF
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
Configuration | Value
|
34
|
+
----------------------|----------------------------------------------------------------------------
|
35
|
+
artifacts_dir | #{configuration.artifacts_dir.inspect}
|
36
|
+
base_revision | #{configuration.base_revision.inspect}
|
37
|
+
circleci_token | #{configuration.circleci_token[-4..-1].rjust(40, '*').inspect}
|
38
|
+
current_build_number | #{configuration.current_build_number.inspect}
|
39
|
+
current_revision | #{configuration.current_revision.inspect}
|
40
|
+
previous_build_number | #{configuration.previous_build_number.inspect}
|
41
|
+
reporters | #{configuration.reporters.inspect}
|
42
|
+
repository_name | #{configuration.repository_name.inspect}
|
43
|
+
user_name | #{configuration.user_name.inspect}
|
44
|
+
vcs_token | #{configuration.vcs_token[-4..-1].rjust(40, '*').inspect}
|
45
|
+
vcs_type | #{configuration.vcs_type.inspect}
|
44
46
|
EOF
|
45
47
|
end
|
46
48
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: circleci-coverage_reporter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuku Takahashi
|
@@ -64,6 +64,7 @@ files:
|
|
64
64
|
- lib/circleci/coverage_reporter/build.rb
|
65
65
|
- lib/circleci/coverage_reporter/client.rb
|
66
66
|
- lib/circleci/coverage_reporter/configuration.rb
|
67
|
+
- lib/circleci/coverage_reporter/errors.rb
|
67
68
|
- lib/circleci/coverage_reporter/github_client.rb
|
68
69
|
- lib/circleci/coverage_reporter/rake_task.rb
|
69
70
|
- lib/circleci/coverage_reporter/report.rb
|