circleci-coverage_reporter 0.5.0 → 0.6.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/CHANGELOG.md +9 -1
  4. data/Gemfile +1 -0
  5. data/README.md +10 -19
  6. data/Rakefile +1 -1
  7. data/bin/rspec +18 -0
  8. data/bin/rubocop +18 -0
  9. data/bin/yard +18 -0
  10. data/lib/circleci/coverage_reporter/artifact.rb +8 -4
  11. data/lib/circleci/coverage_reporter/build.rb +9 -0
  12. data/lib/circleci/coverage_reporter/client.rb +13 -2
  13. data/lib/circleci/coverage_reporter/configuration.rb +7 -31
  14. data/lib/circleci/coverage_reporter/report.rb +43 -29
  15. data/lib/circleci/coverage_reporter/reporters/base.rb +119 -0
  16. data/lib/circleci/coverage_reporter/reporters/flow.rb +32 -0
  17. data/lib/circleci/coverage_reporter/reporters/link.rb +51 -0
  18. data/lib/circleci/coverage_reporter/reporters/rubycritic.rb +33 -0
  19. data/lib/circleci/coverage_reporter/reporters/simplecov.rb +32 -0
  20. data/lib/circleci/coverage_reporter/result.rb +12 -0
  21. data/lib/circleci/coverage_reporter/runner.rb +3 -9
  22. data/lib/circleci/coverage_reporter/vcs/base.rb +23 -0
  23. data/lib/circleci/coverage_reporter/vcs/github.rb +39 -0
  24. data/lib/circleci/coverage_reporter/version.rb +1 -1
  25. data/lib/circleci/coverage_reporter.rb +4 -4
  26. metadata +13 -20
  27. data/lib/circleci/coverage_reporter/abstract_build_result.rb +0 -24
  28. data/lib/circleci/coverage_reporter/abstract_current_result.rb +0 -45
  29. data/lib/circleci/coverage_reporter/abstract_reporter.rb +0 -56
  30. data/lib/circleci/coverage_reporter/abstract_result.rb +0 -21
  31. data/lib/circleci/coverage_reporter/abstract_vcs_client.rb +0 -21
  32. data/lib/circleci/coverage_reporter/flow/build_result.rb +0 -23
  33. data/lib/circleci/coverage_reporter/flow/current_result.rb +0 -23
  34. data/lib/circleci/coverage_reporter/flow/reporter.rb +0 -37
  35. data/lib/circleci/coverage_reporter/github_client.rb +0 -35
  36. data/lib/circleci/coverage_reporter/link/current_result.rb +0 -28
  37. data/lib/circleci/coverage_reporter/link/reporter.rb +0 -35
  38. data/lib/circleci/coverage_reporter/reports_renderer.rb +0 -24
  39. data/lib/circleci/coverage_reporter/rubycritic/build_result.rb +0 -23
  40. data/lib/circleci/coverage_reporter/rubycritic/current_result.rb +0 -29
  41. data/lib/circleci/coverage_reporter/rubycritic/reporter.rb +0 -37
  42. data/lib/circleci/coverage_reporter/simplecov/build_result.rb +0 -23
  43. data/lib/circleci/coverage_reporter/simplecov/current_result.rb +0 -23
  44. data/lib/circleci/coverage_reporter/simplecov/reporter.rb +0 -37
@@ -0,0 +1,119 @@
1
+ require_relative '../report'
2
+
3
+ module CircleCI
4
+ module CoverageReporter
5
+ module Reporters
6
+ # @abstract Subclass and override {.default_dir}, {.default_html_file_name},
7
+ # {.default_json_file_name} and {#parse_json} to implement a custom Reporter class.
8
+ class Base
9
+ def self.default_dir
10
+ raise NotImplementedError
11
+ end
12
+
13
+ def self.default_html_file_name
14
+ raise NotImplementedError
15
+ end
16
+
17
+ def self.default_json_file_name
18
+ raise NotImplementedError
19
+ end
20
+
21
+ def initialize(options = {})
22
+ @options = options
23
+ end
24
+
25
+ # @return [Boolean]
26
+ def active?
27
+ File.directory?(File.join(configuration.artifacts_dir, dir))
28
+ end
29
+
30
+ # @param base_build [Build, nil]
31
+ # @param previous_build [Build, nil]
32
+ # @return [Report]
33
+ def report(base_build, previous_build)
34
+ Report.new(
35
+ self,
36
+ create_current_result,
37
+ base: base_build ? create_build_result(base_build) : nil,
38
+ previous: previous_build ? create_build_result(previous_build) : nil
39
+ )
40
+ end
41
+
42
+ # Name of reporter.
43
+ #
44
+ # @return [String]
45
+ def name
46
+ self.class.name.split('::').last
47
+ end
48
+
49
+ private
50
+
51
+ # @return [String]
52
+ def dir
53
+ @options[:dir] || self.class.default_dir
54
+ end
55
+
56
+ def html_file_name
57
+ @options[:html_file_name] || self.class.default_html_file_name
58
+ end
59
+
60
+ def json_file_name
61
+ @options[:json_file_name] || self.class.default_json_file_name
62
+ end
63
+
64
+ # @param build [Build, nil]
65
+ # @return [Result, nil]
66
+ def create_build_result(build)
67
+ Result.new(build_coverage(build), build_url(build))
68
+ end
69
+
70
+ # @return [AbstractResult]
71
+ def create_current_result
72
+ Result.new(current_coverage, current_url)
73
+ end
74
+
75
+ # @return [Float]
76
+ def current_coverage
77
+ parse_json(File.read(File.join(configuration.artifacts_dir, dir, json_file_name)))
78
+ end
79
+
80
+ # @return [String]
81
+ def current_url
82
+ [
83
+ 'https://circle-artifacts.com/gh',
84
+ configuration.project,
85
+ configuration.current_build_number,
86
+ 'artifacts',
87
+ "0#{configuration.artifacts_dir}",
88
+ dir,
89
+ html_file_name
90
+ ].join('/')
91
+ end
92
+
93
+ # @param build [Build]
94
+ # @return [Float]
95
+ def build_coverage(build)
96
+ artifact = build.find_artifact(json_file_name) or return Float::NAN
97
+ parse_json(artifact.body)
98
+ end
99
+
100
+ # @param build [Build]
101
+ # @return [String]
102
+ def build_url(build)
103
+ artifact = build.find_artifact(html_file_name) or return '#'
104
+ artifact.url
105
+ end
106
+
107
+ def configuration
108
+ CoverageReporter.configuration
109
+ end
110
+
111
+ # @param json [String]
112
+ # @return [Float]
113
+ def parse_json(json) # rubocop:disable Lint/UnusedMethodArgument
114
+ raise NotImplementedError
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,32 @@
1
+ require 'json'
2
+
3
+ require_relative '../result'
4
+ require_relative './base'
5
+
6
+ module CircleCI
7
+ module CoverageReporter
8
+ module Reporters
9
+ class Flow < Base
10
+ def self.default_dir
11
+ 'flow-coverage'
12
+ end
13
+
14
+ def self.default_html_file_name
15
+ 'index.html'
16
+ end
17
+
18
+ def self.default_json_file_name
19
+ 'flow-coverage.json'
20
+ end
21
+
22
+ private
23
+
24
+ # @param json [String]
25
+ # @return [Float]
26
+ def parse_json(json)
27
+ JSON.parse(json)['percent'].to_f
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../result'
2
+
3
+ module CircleCI
4
+ module CoverageReporter
5
+ module Reporters
6
+ class Link
7
+ LinkReport = Struct.new(:name, :url) do
8
+ def to_s
9
+ "[#{name}](#{url})"
10
+ end
11
+ end
12
+
13
+ def initialize(options = {})
14
+ @options = options
15
+ end
16
+
17
+ # @note Implementation for {Base#active?}
18
+ def active?
19
+ File.file?(File.join(configuration.artifacts_dir, @options[:path]))
20
+ end
21
+
22
+ # @note Override {Base#name}
23
+ def name
24
+ @options[:name]
25
+ end
26
+
27
+ def report(_base_build, _previous_build)
28
+ LinkReport.new(@options[:name], url)
29
+ end
30
+
31
+ private
32
+
33
+ # @return [String]
34
+ def url
35
+ [
36
+ 'https://circle-artifacts.com/gh',
37
+ configuration.project,
38
+ configuration.current_build_number,
39
+ 'artifacts',
40
+ "0#{configuration.artifacts_dir}",
41
+ @options[:path]
42
+ ].join('/')
43
+ end
44
+
45
+ def configuration
46
+ CoverageReporter.configuration
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,33 @@
1
+ require 'json'
2
+
3
+ require_relative '../result'
4
+ require_relative './base'
5
+
6
+ module CircleCI
7
+ module CoverageReporter
8
+ module Reporters
9
+ class RubyCritic < Base
10
+ DEFAULT_DIR = 'rubycritic'.freeze
11
+ def self.default_dir
12
+ 'rubycritic'
13
+ end
14
+
15
+ def self.default_html_file_name
16
+ 'overview.html'
17
+ end
18
+
19
+ def self.default_json_file_name
20
+ 'report.json'
21
+ end
22
+
23
+ private
24
+
25
+ # @param json [String]
26
+ # @return [Float]
27
+ def parse_json(json)
28
+ JSON.parse(json)['score'].to_f
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,32 @@
1
+ require 'json'
2
+
3
+ require_relative '../result'
4
+ require_relative './base'
5
+
6
+ module CircleCI
7
+ module CoverageReporter
8
+ module Reporters
9
+ class SimpleCov < Base
10
+ def self.default_dir
11
+ 'coverage'
12
+ end
13
+
14
+ def self.default_html_file_name
15
+ 'index.html'
16
+ end
17
+
18
+ def self.default_json_file_name
19
+ '.last_run.json'
20
+ end
21
+
22
+ private
23
+
24
+ # @param json [String]
25
+ # @return [Float]
26
+ def parse_json(json)
27
+ JSON.parse(json)['result']['covered_percent'].to_f
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,12 @@
1
+ module CircleCI
2
+ module CoverageReporter
3
+ # @attr coverage [Float]
4
+ # @attr url [String] URL for coverage index.html
5
+ Result = Struct.new(:coverage, :url) do
6
+ # @return [String]
7
+ def pretty_coverage
8
+ "#{coverage.round(2)}%"
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,5 +1,4 @@
1
- require_relative 'github_client'
2
- require_relative 'reports_renderer'
1
+ require_relative 'vcs/github'
3
2
 
4
3
  module CircleCI
5
4
  module CoverageReporter
@@ -7,7 +6,7 @@ module CircleCI
7
6
  # @return [void]
8
7
  def run
9
8
  reports = reporters.map { |reporter| reporter.report(base_build, previous_build) }
10
- vcs_client.create_comment(reports_renderer.render(reports))
9
+ vcs_client.create_comment(reports.map(&:to_s).join("\n"))
11
10
  end
12
11
 
13
12
  # @return [void]
@@ -23,16 +22,11 @@ module CircleCI
23
22
 
24
23
  private
25
24
 
26
- # @return [ReportsRenderer]
27
- def reports_renderer
28
- ReportsRenderer.new
29
- end
30
-
31
25
  # @return [AbstractVCSClient]
32
26
  def vcs_client
33
27
  case configuration.vcs_type
34
28
  when 'github'
35
- GitHubClient.new(configuration.vcs_token)
29
+ VCS::GitHub.new(configuration.vcs_token)
36
30
  else
37
31
  raise NotImplementedError
38
32
  end
@@ -0,0 +1,23 @@
1
+ module CircleCI
2
+ module CoverageReporter
3
+ module VCS
4
+ # @abstract Subclass and override {#create_comment} to implement a custom VCS client class.
5
+ class Base
6
+ # @param token [String]
7
+ def initialize(token)
8
+ @token = token
9
+ end
10
+
11
+ # @param body [String]
12
+ # @return [void]
13
+ def create_comment(body) # rubocop:disable Lint/UnusedMethodArgument
14
+ raise NotImplementedError
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :token
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ require 'faraday'
2
+
3
+ require_relative '../errors'
4
+ require_relative 'base'
5
+
6
+ module CircleCI
7
+ module CoverageReporter
8
+ module VCS
9
+ class GitHub < Base
10
+ # @note Implement {Base#create_comment}
11
+ # @param body [String]
12
+ # @return [void]
13
+ # @raise [RequestError]
14
+ def create_comment(body)
15
+ resp = request(body)
16
+ raise RequestError.new(JSON.parse(resp.body)['message'], resp) unless resp.success?
17
+ end
18
+
19
+ private
20
+
21
+ # @param body [String]
22
+ # @return [Faraday::Response]
23
+ def request(body)
24
+ Faraday.new(url: 'https://api.github.com').post do |req|
25
+ req.url ['/repos', configuration.project, 'commits', configuration.current_revision, 'comments'].join('/')
26
+ req.headers['Authorization'] = "token #{token}"
27
+ req.headers['Content-Type'] = 'application/json'
28
+ req.body = JSON.generate(body: body)
29
+ end
30
+ end
31
+
32
+ # @return [Configuration]
33
+ def configuration
34
+ CoverageReporter.configuration
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,7 +2,7 @@ module CircleCI
2
2
  module CoverageReporter
3
3
  module Version
4
4
  MAJOR = 0
5
- MINOR = 5
5
+ MINOR = 6
6
6
  PATCH = 0
7
7
 
8
8
  def self.to_s
@@ -3,10 +3,10 @@ require_relative 'coverage_reporter/configuration'
3
3
  require_relative 'coverage_reporter/errors'
4
4
  require_relative 'coverage_reporter/runner'
5
5
 
6
- require_relative 'coverage_reporter/flow/reporter'
7
- require_relative 'coverage_reporter/link/reporter'
8
- require_relative 'coverage_reporter/rubycritic/reporter'
9
- require_relative 'coverage_reporter/simplecov/reporter'
6
+ require_relative 'coverage_reporter/reporters/flow'
7
+ require_relative 'coverage_reporter/reporters/link'
8
+ require_relative 'coverage_reporter/reporters/rubycritic'
9
+ require_relative 'coverage_reporter/reporters/simplecov'
10
10
 
11
11
  module CircleCI
12
12
  module CoverageReporter
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: circleci-coverage_reporter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuku Takahashi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-18 00:00:00.000000000 Z
11
+ date: 2017-05-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -55,37 +55,30 @@ files:
55
55
  - LICENSE.txt
56
56
  - README.md
57
57
  - Rakefile
58
+ - bin/rspec
59
+ - bin/rubocop
58
60
  - bin/setup
61
+ - bin/yard
59
62
  - circle.yml
60
63
  - circleci-coverage_reporter.gemspec
61
64
  - lib/circleci/coverage_reporter.rb
62
- - lib/circleci/coverage_reporter/abstract_build_result.rb
63
- - lib/circleci/coverage_reporter/abstract_current_result.rb
64
- - lib/circleci/coverage_reporter/abstract_reporter.rb
65
- - lib/circleci/coverage_reporter/abstract_result.rb
66
- - lib/circleci/coverage_reporter/abstract_vcs_client.rb
67
65
  - lib/circleci/coverage_reporter/artifact.rb
68
66
  - lib/circleci/coverage_reporter/build.rb
69
67
  - lib/circleci/coverage_reporter/client.rb
70
68
  - lib/circleci/coverage_reporter/configuration.rb
71
69
  - lib/circleci/coverage_reporter/errors.rb
72
- - lib/circleci/coverage_reporter/flow/build_result.rb
73
- - lib/circleci/coverage_reporter/flow/current_result.rb
74
- - lib/circleci/coverage_reporter/flow/reporter.rb
75
- - lib/circleci/coverage_reporter/github_client.rb
76
- - lib/circleci/coverage_reporter/link/current_result.rb
77
- - lib/circleci/coverage_reporter/link/reporter.rb
78
70
  - lib/circleci/coverage_reporter/rake_task.rb
79
71
  - lib/circleci/coverage_reporter/report.rb
80
- - lib/circleci/coverage_reporter/reports_renderer.rb
81
- - lib/circleci/coverage_reporter/rubycritic/build_result.rb
82
- - lib/circleci/coverage_reporter/rubycritic/current_result.rb
83
- - lib/circleci/coverage_reporter/rubycritic/reporter.rb
72
+ - lib/circleci/coverage_reporter/reporters/base.rb
73
+ - lib/circleci/coverage_reporter/reporters/flow.rb
74
+ - lib/circleci/coverage_reporter/reporters/link.rb
75
+ - lib/circleci/coverage_reporter/reporters/rubycritic.rb
76
+ - lib/circleci/coverage_reporter/reporters/simplecov.rb
77
+ - lib/circleci/coverage_reporter/result.rb
84
78
  - lib/circleci/coverage_reporter/runner.rb
85
79
  - lib/circleci/coverage_reporter/sandbox.rb
86
- - lib/circleci/coverage_reporter/simplecov/build_result.rb
87
- - lib/circleci/coverage_reporter/simplecov/current_result.rb
88
- - lib/circleci/coverage_reporter/simplecov/reporter.rb
80
+ - lib/circleci/coverage_reporter/vcs/base.rb
81
+ - lib/circleci/coverage_reporter/vcs/github.rb
89
82
  - lib/circleci/coverage_reporter/version.rb
90
83
  homepage: https://github.com/increments/circleci-coverage_reporter
91
84
  licenses: