circleci-coverage_reporter 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +9 -1
- data/Gemfile +1 -0
- data/README.md +10 -19
- data/Rakefile +1 -1
- data/bin/rspec +18 -0
- data/bin/rubocop +18 -0
- data/bin/yard +18 -0
- data/lib/circleci/coverage_reporter/artifact.rb +8 -4
- data/lib/circleci/coverage_reporter/build.rb +9 -0
- data/lib/circleci/coverage_reporter/client.rb +13 -2
- data/lib/circleci/coverage_reporter/configuration.rb +7 -31
- data/lib/circleci/coverage_reporter/report.rb +43 -29
- data/lib/circleci/coverage_reporter/reporters/base.rb +119 -0
- data/lib/circleci/coverage_reporter/reporters/flow.rb +32 -0
- data/lib/circleci/coverage_reporter/reporters/link.rb +51 -0
- data/lib/circleci/coverage_reporter/reporters/rubycritic.rb +33 -0
- data/lib/circleci/coverage_reporter/reporters/simplecov.rb +32 -0
- data/lib/circleci/coverage_reporter/result.rb +12 -0
- data/lib/circleci/coverage_reporter/runner.rb +3 -9
- data/lib/circleci/coverage_reporter/vcs/base.rb +23 -0
- data/lib/circleci/coverage_reporter/vcs/github.rb +39 -0
- data/lib/circleci/coverage_reporter/version.rb +1 -1
- data/lib/circleci/coverage_reporter.rb +4 -4
- metadata +13 -20
- data/lib/circleci/coverage_reporter/abstract_build_result.rb +0 -24
- data/lib/circleci/coverage_reporter/abstract_current_result.rb +0 -45
- data/lib/circleci/coverage_reporter/abstract_reporter.rb +0 -56
- data/lib/circleci/coverage_reporter/abstract_result.rb +0 -21
- data/lib/circleci/coverage_reporter/abstract_vcs_client.rb +0 -21
- data/lib/circleci/coverage_reporter/flow/build_result.rb +0 -23
- data/lib/circleci/coverage_reporter/flow/current_result.rb +0 -23
- data/lib/circleci/coverage_reporter/flow/reporter.rb +0 -37
- data/lib/circleci/coverage_reporter/github_client.rb +0 -35
- data/lib/circleci/coverage_reporter/link/current_result.rb +0 -28
- data/lib/circleci/coverage_reporter/link/reporter.rb +0 -35
- data/lib/circleci/coverage_reporter/reports_renderer.rb +0 -24
- data/lib/circleci/coverage_reporter/rubycritic/build_result.rb +0 -23
- data/lib/circleci/coverage_reporter/rubycritic/current_result.rb +0 -29
- data/lib/circleci/coverage_reporter/rubycritic/reporter.rb +0 -37
- data/lib/circleci/coverage_reporter/simplecov/build_result.rb +0 -23
- data/lib/circleci/coverage_reporter/simplecov/current_result.rb +0 -23
- data/lib/circleci/coverage_reporter/simplecov/reporter.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7aca8bd4148d9c5416e8238dea67eb03dbd6f2c
|
4
|
+
data.tar.gz: 693fafae6e3340ce02cad34b682b5dbbc9f00b48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8864275c0508988de280fd1424ffab28075e980c0388eb8a82b741517266d056d0cf9f01822cbdb60d369ba7520eab6a73c2d632ffba9afbe4f6330426edc82a
|
7
|
+
data.tar.gz: 0fa44d79b06c75752d09dfaa4f8b4a7faf177e470bce2bcc2190686b3ea111def27dbc3e7ccdee1bea713eb95b8369a510ee634175fddfdb37be2a6f00c85246
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [0.6.0] - 2017-05-30
|
10
|
+
### Changed
|
11
|
+
- Refactor how to implement reporter. Now a reporter consists of a single ruby class
|
12
|
+
|
13
|
+
### Removed
|
14
|
+
- Remove template configuration
|
15
|
+
|
9
16
|
## [0.5.0] - 2017-05-18
|
10
17
|
### Added
|
11
18
|
- Add Link reporter
|
@@ -60,7 +67,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
|
|
60
67
|
### Added
|
61
68
|
- Initial release
|
62
69
|
|
63
|
-
[Unreleased]: https://github.com/increments/circleci-coverage_reporter/compare/v0.
|
70
|
+
[Unreleased]: https://github.com/increments/circleci-coverage_reporter/compare/v0.6.0...HEAD
|
71
|
+
[0.6.0]: https://github.com/increments/circleci-coverage_reporter/compare/v0.5.0...v0.6.0
|
64
72
|
[0.5.0]: https://github.com/increments/circleci-coverage_reporter/compare/v0.4.0...v0.5.0
|
65
73
|
[0.4.0]: https://github.com/increments/circleci-coverage_reporter/compare/v0.3.1...v0.4.0
|
66
74
|
[0.3.1]: https://github.com/increments/circleci-coverage_reporter/compare/v0.3.0...v0.3.1
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -56,7 +56,7 @@ CircleCI::CoverageReporter.run
|
|
56
56
|
## Reporters
|
57
57
|
### SimpleCov
|
58
58
|
|
59
|
-
`CircleCI::CoverageReporter::
|
59
|
+
`CircleCI::CoverageReporter::Reporters::SimpleCovReporter` handles coverage files generated by
|
60
60
|
[SimpleCov](https://github.com/colszowka/simplecov).
|
61
61
|
|
62
62
|
It expects that coverage files are located in `$CIRCLE_ARTIFACTS/coverage` directory:
|
@@ -73,13 +73,13 @@ If you put files in another directory, say `$CIRCLE_ARTIFACTS/foo/bar`, you have
|
|
73
73
|
|
74
74
|
```ruby
|
75
75
|
CircleCI::CoverageReporter.configure do |config|
|
76
|
-
config.reporters << CircleCI::CoverageReporter::SimpleCov
|
76
|
+
config.reporters << CircleCI::CoverageReporter::Reporters::SimpleCov.new(dir: 'foo/bar')
|
77
77
|
end
|
78
78
|
```
|
79
79
|
|
80
80
|
### Flow
|
81
81
|
|
82
|
-
`CircleCI::CoverageReporter::
|
82
|
+
`CircleCI::CoverageReporter::Reporters::FlowReporter` handles coverage files generated by
|
83
83
|
[flow-coverage-report](https://github.com/rpl/flow-coverage-report)
|
84
84
|
|
85
85
|
It expects that there is `$CIRCLE_ARTIFACTS/flow-coverage/flow-coverage.json`:
|
@@ -93,36 +93,27 @@ you have to set reporter as follows:
|
|
93
93
|
|
94
94
|
```ruby
|
95
95
|
CircleCI::CoverageReporter.configure do |config|
|
96
|
-
config.reporters << CircleCI::CoverageReporter::Flow
|
96
|
+
config.reporters << CircleCI::CoverageReporter::Reporters::Flow.new(dir: 'foo/bar')
|
97
97
|
end
|
98
98
|
```
|
99
99
|
|
100
100
|
### RubyCritic
|
101
101
|
|
102
|
-
`CircleCI::CoverageReporter::RubyCritic
|
102
|
+
`CircleCI::CoverageReporter::Reporters::RubyCritic` handles code quality files generated by
|
103
103
|
[rubycritic](https://github.com/whitesmith/rubycritic)
|
104
104
|
|
105
|
-
At least json format report is required:
|
106
|
-
|
107
105
|
```bash
|
108
106
|
bundle exec rubycritic -p $CIRCLE_ARTIFACTS/rubycritic -f json --no-browser --mode-ci app
|
109
|
-
bundle exec rubycritic -p $CIRCLE_ARTIFACTS/rubycritic -f html --no-browser --mode-ci app
|
107
|
+
bundle exec rubycritic -p $CIRCLE_ARTIFACTS/rubycritic -f html --no-browser --mode-ci app
|
110
108
|
```
|
111
109
|
|
112
|
-
|
113
|
-
### Template
|
110
|
+
### Link
|
114
111
|
|
115
|
-
|
116
|
-
[`Report`](http://www.rubydoc.info/gems/circleci-coverage_reporter/CircleCI/CoverageReporter/Report))
|
117
|
-
and `vcs_type` (always `"github"`).
|
112
|
+
`CircleCI::CoverageReporter::Reporters::Link` reports a link to an artifact file.
|
118
113
|
|
119
|
-
```
|
114
|
+
```ruby
|
120
115
|
CircleCI::CoverageReporter.configure do |config|
|
121
|
-
config.
|
122
|
-
<%- reports.each do |report| -%>
|
123
|
-
[<%= report.type %>](<%= report.url %>) <%= report.coverage %>%
|
124
|
-
<%- end -%>
|
125
|
-
ERB
|
116
|
+
config.reporters << CircleCI::CoverateReporter::Reporters::Link.new(path: 'path/to/file', name: 'NAME')
|
126
117
|
end
|
127
118
|
```
|
128
119
|
|
data/Rakefile
CHANGED
@@ -14,7 +14,7 @@ RuboCop::RakeTask.new
|
|
14
14
|
YARD::Rake::YardocTask.new
|
15
15
|
|
16
16
|
CircleCI::CoverageReporter.configure do |config|
|
17
|
-
config.reporters << CircleCI::CoverageReporter::Link
|
17
|
+
config.reporters << CircleCI::CoverageReporter::Reporters::Link.new(path: 'doc/index.html', name: 'YARD')
|
18
18
|
end
|
19
19
|
|
20
20
|
desc 'Run RubyCritic'
|
data/bin/rspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rspec' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
require 'rubygems'
|
16
|
+
require 'bundler/setup'
|
17
|
+
|
18
|
+
load Gem.bin_path('rspec-core', 'rspec')
|
data/bin/rubocop
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'rubocop' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
require 'rubygems'
|
16
|
+
require 'bundler/setup'
|
17
|
+
|
18
|
+
load Gem.bin_path('rubocop', 'rubocop')
|
data/bin/yard
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
#
|
5
|
+
# This file was generated by Bundler.
|
6
|
+
#
|
7
|
+
# The application 'yard' is installed as part of a gem, and
|
8
|
+
# this file is here to facilitate running it.
|
9
|
+
#
|
10
|
+
|
11
|
+
require 'pathname'
|
12
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
|
+
|
15
|
+
require 'rubygems'
|
16
|
+
require 'bundler/setup'
|
17
|
+
|
18
|
+
load Gem.bin_path('yard', 'yard')
|
@@ -1,13 +1,17 @@
|
|
1
1
|
module CircleCI
|
2
2
|
module CoverageReporter
|
3
3
|
# Encapsulate a CircleCI artifact
|
4
|
-
|
4
|
+
#
|
5
|
+
# @attr path [String] abstract path to the artifact in CircleCI container
|
6
|
+
# @attr url [String] URL of the artifact
|
7
|
+
Artifact = Struct.new(:path, :url) do
|
8
|
+
# @param value [String]
|
5
9
|
# @return [Boolean]
|
6
|
-
def
|
7
|
-
|
10
|
+
def match?(value)
|
11
|
+
path.end_with?(value)
|
8
12
|
end
|
9
13
|
|
10
|
-
# @return [String]
|
14
|
+
# @return [String] content of the artifact
|
11
15
|
def body
|
12
16
|
@body ||= CoverageReporter.client.get(url).body
|
13
17
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module CircleCI
|
2
2
|
module CoverageReporter
|
3
3
|
# Encapsulate a CircleCI build
|
4
|
+
#
|
5
|
+
# @attr vcs_revision [String] revision of git
|
6
|
+
# @attr build_number [Integer] the ID of the CircleCI build
|
4
7
|
Build = Struct.new(:vcs_revision, :build_number) do
|
5
8
|
# @param revision [String]
|
6
9
|
# @return [Boolean]
|
@@ -12,6 +15,12 @@ module CircleCI
|
|
12
15
|
def artifacts
|
13
16
|
@artifacts ||= CoverageReporter.client.artifacts(build_number)
|
14
17
|
end
|
18
|
+
|
19
|
+
# @param string [String]
|
20
|
+
# @return [Artifact, nil]
|
21
|
+
def find_artifact(string)
|
22
|
+
artifacts.find { |artifact| artifact.match?(string) }
|
23
|
+
end
|
15
24
|
end
|
16
25
|
end
|
17
26
|
end
|
@@ -6,12 +6,16 @@ require_relative 'errors'
|
|
6
6
|
|
7
7
|
module CircleCI
|
8
8
|
module CoverageReporter
|
9
|
+
# CircleCI API client
|
9
10
|
class Client
|
10
11
|
CIRCLECI_ENDPOINT = 'https://circleci.com/api/v1.1'.freeze
|
11
12
|
|
13
|
+
# Fetch a build data from API and create a {Build} object for it.
|
14
|
+
#
|
12
15
|
# @param build_number [Integer, nil]
|
13
16
|
# @return [Build, nil]
|
14
17
|
# @raise [RequestError]
|
18
|
+
# @see https://circleci.com/docs/api/v1-reference/#build
|
15
19
|
def single_build(build_number)
|
16
20
|
return unless build_number
|
17
21
|
resp = get(single_build_url(build_number))
|
@@ -20,9 +24,12 @@ module CircleCI
|
|
20
24
|
create_build(body)
|
21
25
|
end
|
22
26
|
|
27
|
+
# Retrieve artifacts for the build.
|
28
|
+
#
|
23
29
|
# @param build_number [Integer]
|
24
30
|
# @return [Array<Artifact>]
|
25
31
|
# @raise [RequestError]
|
32
|
+
# @see https://circleci.com/docs/api/v1-reference/#build-artifacts
|
26
33
|
def artifacts(build_number)
|
27
34
|
resp = get(artifacts_url(build_number))
|
28
35
|
body = JSON.parse(resp.body)
|
@@ -30,6 +37,8 @@ module CircleCI
|
|
30
37
|
body.map(&method(:create_artifact))
|
31
38
|
end
|
32
39
|
|
40
|
+
# Find the latest build number for the given vcs revision.
|
41
|
+
#
|
33
42
|
# @param revision [String]
|
34
43
|
# @param branch [String, nil]
|
35
44
|
# @return [Integer, nil]
|
@@ -38,6 +47,8 @@ module CircleCI
|
|
38
47
|
build ? build.build_number : nil
|
39
48
|
end
|
40
49
|
|
50
|
+
# Raw entry point for GET APIs.
|
51
|
+
#
|
41
52
|
# @param url [String]
|
42
53
|
# @param params [Hash]
|
43
54
|
# @return [Faraday::Response]
|
@@ -54,7 +65,7 @@ module CircleCI
|
|
54
65
|
end
|
55
66
|
|
56
67
|
# @param build_number [Integer]
|
57
|
-
# @return [String]
|
68
|
+
# @return [String] URL for "Artifacts of a Bulid API"
|
58
69
|
def artifacts_url(build_number)
|
59
70
|
[
|
60
71
|
CIRCLECI_ENDPOINT,
|
@@ -104,7 +115,7 @@ module CircleCI
|
|
104
115
|
# @param hash [Hash]
|
105
116
|
# @return [Artifact]
|
106
117
|
def create_artifact(hash)
|
107
|
-
Artifact.new(hash['path'], hash['
|
118
|
+
Artifact.new(hash['path'], hash['url'])
|
108
119
|
end
|
109
120
|
|
110
121
|
# @param hash [Hash]
|
@@ -1,29 +1,15 @@
|
|
1
|
-
require_relative 'flow
|
2
|
-
require_relative 'rubycritic
|
3
|
-
require_relative 'simplecov
|
1
|
+
require_relative 'reporters/flow'
|
2
|
+
require_relative 'reporters/rubycritic'
|
3
|
+
require_relative 'reporters/simplecov'
|
4
4
|
|
5
5
|
module CircleCI
|
6
6
|
module CoverageReporter
|
7
7
|
class Configuration
|
8
8
|
DEFAULT_REPORTERS = [
|
9
|
-
SimpleCov
|
10
|
-
Flow
|
11
|
-
RubyCritic
|
9
|
+
Reporters::SimpleCov.new,
|
10
|
+
Reporters::Flow.new,
|
11
|
+
Reporters::RubyCritic.new
|
12
12
|
].freeze
|
13
|
-
DEFAULT_TEMPLATE = <<~'ERB'.freeze
|
14
|
-
<%- reports.each do |report| -%>
|
15
|
-
<%
|
16
|
-
link = "[#{report.reporter.name}](#{report.current_result.url})"
|
17
|
-
emoji = report.base_diff.nil? || report.base_diff.nan? || report.base_diff.round(2).zero? ? nil : report.base_diff.positive? ? ' :chart_with_upwards_trend:' : ' :chart_with_downwards_trend:'
|
18
|
-
base_progress = report.base_diff ? "[master](#{report.base_result.url}): #{report.pretty_base_diff}" : nil
|
19
|
-
branch_progress = report.branch_diff ? "[previous](#{report.previous_result.url}): #{report.pretty_branch_diff}" : nil
|
20
|
-
progresses = [base_progress, branch_progress].compact
|
21
|
-
progress = progresses.empty? ? nil : " (#{progresses.join(', ')})"
|
22
|
-
-%>
|
23
|
-
<%= link %>: <%= report.current_result.pretty_coverage %><%= emoji %><%= progress %>
|
24
|
-
<%- end -%>
|
25
|
-
ERB
|
26
|
-
DEFAULT_TEMPLATE_TRIM_MODE = '-'.freeze
|
27
13
|
DEFAULT_VCS_TYPE = 'github'.freeze
|
28
14
|
|
29
15
|
attr_accessor :circleci_token, :vcs_token
|
@@ -35,7 +21,7 @@ module CircleCI
|
|
35
21
|
"#{user_name}/#{repository_name}"
|
36
22
|
end
|
37
23
|
|
38
|
-
# @return [Array<
|
24
|
+
# @return [Array<Reporters::Base>]
|
39
25
|
def reporters
|
40
26
|
@reporters ||= DEFAULT_REPORTERS.dup
|
41
27
|
end
|
@@ -75,16 +61,6 @@ module CircleCI
|
|
75
61
|
@repository_name ||= ENV['CIRCLE_PROJECT_REPONAME']
|
76
62
|
end
|
77
63
|
|
78
|
-
# @return [String]
|
79
|
-
def template
|
80
|
-
@template ||= DEFAULT_TEMPLATE
|
81
|
-
end
|
82
|
-
|
83
|
-
# @return [String, nil]
|
84
|
-
def template_trim_mode
|
85
|
-
@template_trim_mode ||= DEFAULT_TEMPLATE_TRIM_MODE
|
86
|
-
end
|
87
|
-
|
88
64
|
# @return [String]
|
89
65
|
def user_name
|
90
66
|
@user_name ||= ENV['CIRCLE_PROJECT_USERNAME']
|
@@ -1,22 +1,13 @@
|
|
1
1
|
module CircleCI
|
2
2
|
module CoverageReporter
|
3
|
+
# Encapsulate a report created by a reporter.
|
4
|
+
#
|
5
|
+
# @see Reporters::Base#report
|
3
6
|
class Report
|
4
|
-
# @
|
5
|
-
|
6
|
-
|
7
|
-
# @
|
8
|
-
attr_reader :current_result
|
9
|
-
|
10
|
-
# @return [AbstractResult, nil]
|
11
|
-
attr_reader :base_result
|
12
|
-
|
13
|
-
# @return [AbstractResult, nil]
|
14
|
-
attr_reader :previous_result
|
15
|
-
|
16
|
-
# @param reporter [AbstractReporter]
|
17
|
-
# @param current [AbstractCurrentResult]
|
18
|
-
# @param base [AbstractBuildResult, nil]
|
19
|
-
# @param previous [AbstractBuildResult, nil]
|
7
|
+
# @param reporter [Reporters::Base] the reporter of the report
|
8
|
+
# @param current [Result]
|
9
|
+
# @param base [Result, nil] result at master branch
|
10
|
+
# @param previous [Result, nil] result at previous build in same branch
|
20
11
|
def initialize(reporter, current, base: nil, previous: nil)
|
21
12
|
@reporter = reporter
|
22
13
|
@current_result = current
|
@@ -24,24 +15,49 @@ module CircleCI
|
|
24
15
|
@previous_result = previous
|
25
16
|
end
|
26
17
|
|
27
|
-
# @return [String]
|
28
|
-
def
|
29
|
-
|
18
|
+
# @return [String]
|
19
|
+
def to_s
|
20
|
+
"#{link}: #{current_result.pretty_coverage}#{emoji}#{progress}"
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :reporter, :current_result, :base_result, :previous_result
|
26
|
+
|
27
|
+
# @return [String]
|
28
|
+
def link
|
29
|
+
"[#{reporter.name}](#{current_result.url})"
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [String]
|
33
|
+
def emoji
|
34
|
+
if base_diff.nil? || base_diff.nan? || base_diff.round(2).zero?
|
35
|
+
''
|
36
|
+
elsif base_diff.positive?
|
37
|
+
':chart_with_upwards_trend:'
|
38
|
+
else
|
39
|
+
':chart_with_downwards_trend:'
|
40
|
+
end
|
30
41
|
end
|
31
42
|
|
32
43
|
# @return [String]
|
33
|
-
def
|
34
|
-
|
44
|
+
def progress
|
45
|
+
progresses.empty? ? '' : "(#{progresses.join(', ')})"
|
35
46
|
end
|
36
47
|
|
37
|
-
# @return [
|
38
|
-
def
|
39
|
-
|
48
|
+
# @return [Array<String>]
|
49
|
+
def progresses
|
50
|
+
[base_progress, branch_progress].compact
|
40
51
|
end
|
41
52
|
|
42
|
-
# @return [String]
|
43
|
-
def
|
44
|
-
|
53
|
+
# @return [String, nil]
|
54
|
+
def base_progress
|
55
|
+
base_diff ? "[master](#{base_result.url}): #{pretty_base_diff}" : nil
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [String, nil]
|
59
|
+
def branch_progress
|
60
|
+
branch_diff ? "[previous](#{previous_result.url}): #{pretty_branch_diff}" : nil
|
45
61
|
end
|
46
62
|
|
47
63
|
# @return [String, nil]
|
@@ -68,8 +84,6 @@ module CircleCI
|
|
68
84
|
current_result.coverage - previous_result.coverage
|
69
85
|
end
|
70
86
|
|
71
|
-
private
|
72
|
-
|
73
87
|
# @param diff [Float]
|
74
88
|
# @return [String]
|
75
89
|
def pretty_diff(diff)
|