codecov 0.2.2 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/codecov.rb +27 -8
- data/test/test_codecov.rb +137 -20
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7cd3288a24f1d4655e837e068c45a5be7817d60c08de8acebb5ca0f3afcb0569
|
4
|
+
data.tar.gz: a42575d126b29448adda5177e95ac961070098aca3761c7074b4b6a1b9827154
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 00210aa6e8cbf2837c5c199e3f7b2ce3d80a7c171f4bb84f94c0202da55fff0b33fe7ea6ad2ec39ed65086d41b6c375433954197d0fd9343e4de0bc7cf437c83
|
7
|
+
data.tar.gz: e492d90061f8db4c1df141d5d2e04d520cf4f8704a923f5556ed5a50d28bc6fcf2ec9cf72acea749671da975cef11420a60d1c8bf20498291bb5761f79e3e35f
|
data/lib/codecov.rb
CHANGED
@@ -8,7 +8,7 @@ require 'colorize'
|
|
8
8
|
require 'zlib'
|
9
9
|
|
10
10
|
class SimpleCov::Formatter::Codecov
|
11
|
-
VERSION = '0.2.
|
11
|
+
VERSION = '0.2.7'
|
12
12
|
|
13
13
|
### CIs
|
14
14
|
RECOGNIZED_CIS = [
|
@@ -20,6 +20,7 @@ class SimpleCov::Formatter::Codecov
|
|
20
20
|
CIRCLE = 'Circle CI',
|
21
21
|
CODESHIP = 'Codeship CI',
|
22
22
|
DRONEIO = 'Drone CI',
|
23
|
+
GITHUB = 'GitHub Actions',
|
23
24
|
GITLAB = 'GitLab CI',
|
24
25
|
HEROKU = 'Heroku CI',
|
25
26
|
JENKINS = 'Jenkins CI',
|
@@ -62,6 +63,8 @@ class SimpleCov::Formatter::Codecov
|
|
62
63
|
CODESHIP
|
63
64
|
elsif ((ENV['CI'] == 'true') || (ENV['CI'] == 'drone')) && (ENV['DRONE'] == 'true')
|
64
65
|
DRONEIO
|
66
|
+
elsif (ENV['CI'] == 'true') && (ENV['GITHUB_ACTIONS'] == 'true')
|
67
|
+
GITHUB
|
65
68
|
elsif !ENV['GITLAB_CI'].nil?
|
66
69
|
GITLAB
|
67
70
|
elsif ENV['HEROKU_TEST_RUN_ID']
|
@@ -172,6 +175,15 @@ class SimpleCov::Formatter::Codecov
|
|
172
175
|
params[:build_url] = ENV['DRONE_BUILD_LINK'] || ENV['DRONE_BUILD_URL'] || ENV['CI_BUILD_URL']
|
173
176
|
params[:pr] = ENV['DRONE_PULL_REQUEST']
|
174
177
|
params[:tag] = ENV['DRONE_TAG']
|
178
|
+
when GITHUB
|
179
|
+
# https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables
|
180
|
+
params[:service] = 'github-actions'
|
181
|
+
params[:branch] = ENV['GITHUB_HEAD_REF'] || ENV['GITHUB_REF'].sub('refs/head/', '')
|
182
|
+
# PR refs are in the format: refs/pull/7/merge for pull_request events
|
183
|
+
params[:pr] = ENV['GITHUB_REF'].split('/')[2] unless ENV['GITHUB_HEAD_REF'].nil? || ENV['GITHUB_HEAD_REF'].empty?
|
184
|
+
params[:slug] = ENV['GITHUB_REPOSITORY']
|
185
|
+
params[:build] = ENV['GITHUB_RUN_ID']
|
186
|
+
params[:commit] = ENV['GITHUB_SHA']
|
175
187
|
when GITLAB
|
176
188
|
# http://doc.gitlab.com/ci/examples/README.html#environmental-variables
|
177
189
|
# https://gitlab.com/gitlab-org/gitlab-ci-runner/blob/master/lib/build.rb#L96
|
@@ -305,7 +317,7 @@ class SimpleCov::Formatter::Codecov
|
|
305
317
|
def create_report(report)
|
306
318
|
result = {
|
307
319
|
'meta' => {
|
308
|
-
'version' => 'codecov-ruby/v' +
|
320
|
+
'version' => 'codecov-ruby/v' + VERSION
|
309
321
|
}
|
310
322
|
}
|
311
323
|
result.update(result_to_codecov(report))
|
@@ -315,14 +327,17 @@ class SimpleCov::Formatter::Codecov
|
|
315
327
|
def gzip_report(report)
|
316
328
|
puts ['==>'.green, 'Gzipping contents'].join(' ')
|
317
329
|
|
318
|
-
|
330
|
+
io = StringIO.new
|
331
|
+
gzip = Zlib::GzipWriter.new(io)
|
319
332
|
gzip << report
|
333
|
+
gzip.close
|
320
334
|
|
321
|
-
|
335
|
+
io.string
|
322
336
|
end
|
323
337
|
|
324
338
|
def upload_to_codecov(ci, report)
|
325
339
|
url = ENV['CODECOV_URL'] || 'https://codecov.io'
|
340
|
+
is_enterprise = url != 'https://codecov.io'
|
326
341
|
|
327
342
|
params = build_params(ci)
|
328
343
|
params_secret_token = params.clone
|
@@ -340,8 +355,11 @@ class SimpleCov::Formatter::Codecov
|
|
340
355
|
puts " url: #{url}"
|
341
356
|
puts " query: #{query_without_token}"
|
342
357
|
|
343
|
-
response =
|
344
|
-
|
358
|
+
response = false
|
359
|
+
unless is_enterprise
|
360
|
+
response = upload_to_v4(url, gzipped_report, query, query_without_token)
|
361
|
+
return false if response == false
|
362
|
+
end
|
345
363
|
|
346
364
|
response || upload_to_v2(url, gzipped_report, query, query_without_token)
|
347
365
|
end
|
@@ -352,7 +370,7 @@ class SimpleCov::Formatter::Codecov
|
|
352
370
|
https.use_ssl = !url.match(/^https/).nil?
|
353
371
|
|
354
372
|
puts ['-> '.green, 'Pinging Codecov'].join(' ')
|
355
|
-
puts "#{url}
|
373
|
+
puts "#{url}#{uri.path}?#{query_without_token}"
|
356
374
|
|
357
375
|
req = Net::HTTP::Post.new(
|
358
376
|
"#{uri.path}?#{query}",
|
@@ -407,11 +425,12 @@ class SimpleCov::Formatter::Codecov
|
|
407
425
|
https.use_ssl = !url.match(/^https/).nil?
|
408
426
|
|
409
427
|
puts ['-> '.green, 'Uploading to Codecov'].join(' ')
|
410
|
-
puts "#{url}
|
428
|
+
puts "#{url}#{uri.path}?#{query_without_token}"
|
411
429
|
|
412
430
|
req = Net::HTTP::Post.new(
|
413
431
|
"#{uri.path}?#{query}",
|
414
432
|
{
|
433
|
+
'Accept' => 'application/json',
|
415
434
|
'Content-Encoding' => 'gzip',
|
416
435
|
'Content-Type' => 'text/plain',
|
417
436
|
'X-Content-Encoding' => 'gzip'
|
data/test/test_codecov.rb
CHANGED
@@ -3,14 +3,44 @@
|
|
3
3
|
require 'helper'
|
4
4
|
|
5
5
|
class TestCodecov < Minitest::Test
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
CI = SimpleCov::Formatter::Codecov.new.detect_ci
|
7
|
+
|
8
|
+
REALENV =
|
9
|
+
if CI == SimpleCov::Formatter::Codecov::CIRCLE
|
10
|
+
{
|
11
|
+
'CIRCLECI' => ENV['CIRCLECI'],
|
12
|
+
'CIRCLE_BUILD_NUM' => ENV['CIRCLE_BUILD_NUM'],
|
13
|
+
'CIRCLE_NODE_INDEX' => ENV['CIRCLE_NODE_INDEX'],
|
14
|
+
'CIRCLE_PROJECT_REPONAME' => ENV['CIRCLE_PROJECT_REPONAME'],
|
15
|
+
'CIRCLE_PROJECT_USERNAME' => ENV['CIRCLE_PROJECT_USERNAME'],
|
16
|
+
'CIRCLE_REPOSITORY_URL' => ENV['CIRCLE_REPOSITORY_URL'],
|
17
|
+
'CIRCLE_PR_NUMBER' => ENV['CIRCLE_PR_NUMBER'],
|
18
|
+
'CIRCLE_BRANCH' => ENV['CIRCLE_BRANCH'],
|
19
|
+
'CIRCLE_SHA1' => ENV['CIRCLE_SHA1']
|
20
|
+
}
|
21
|
+
elsif CI == SimpleCov::Formatter::Codecov::GITHUB
|
22
|
+
{
|
23
|
+
'GITHUB_ACTIONS' => ENV['GITHUB_ACTIONS'],
|
24
|
+
'GITHUB_HEAD_REF' => ENV['GITHUB_HEAD_REF'],
|
25
|
+
'GITHUB_REF' => ENV['GITHUB_REF'],
|
26
|
+
'GITHUB_REPOSITORY' => ENV['GITHUB_REPOSITORY'],
|
27
|
+
'GITHUB_RUN_ID' => ENV['GITHUB_RUN_ID'],
|
28
|
+
'GITHUB_SHA' => ENV['GITHUB_SHA']
|
29
|
+
}
|
30
|
+
elsif CI == SimpleCov::Formatter::Codecov::TRAVIS
|
31
|
+
{
|
32
|
+
'TRAVIS' => ENV['TRAVIS'],
|
33
|
+
'TRAVIS_BRANCH' => ENV['TRAVIS_BRANCH'],
|
34
|
+
'TRAVIS_COMMIT' => ENV['TRAVIS_COMMIT'],
|
35
|
+
'TRAVIS_REPO_SLUG' => ENV['TRAVIS_REPO_SLUG'],
|
36
|
+
'TRAVIS_JOB_NUMBER' => ENV['TRAVIS_JOB_NUMBER'],
|
37
|
+
'TRAVIS_PULL_REQUEST' => ENV['TRAVIS_PULL_REQUEST'],
|
38
|
+
'TRAVIS_JOB_ID' => ENV['TRAVIS_JOB_ID']
|
39
|
+
}
|
40
|
+
else
|
41
|
+
{}
|
42
|
+
end.freeze
|
43
|
+
|
14
44
|
def url
|
15
45
|
ENV['CODECOV_URL'] || 'https://codecov.io'
|
16
46
|
end
|
@@ -32,22 +62,37 @@ class TestCodecov < Minitest::Test
|
|
32
62
|
stub('SimpleCov::SourceFile', filename: filename, lines: lines)
|
33
63
|
end
|
34
64
|
|
35
|
-
def upload(success=true)
|
65
|
+
def upload(success = true)
|
66
|
+
WebMock.enable!
|
36
67
|
formatter = SimpleCov::Formatter::Codecov.new
|
37
68
|
result = stub('SimpleCov::Result', files: [
|
38
69
|
stub_file('/path/lib/something.rb', [1, 0, 0, nil, 1, nil]),
|
39
70
|
stub_file('/path/lib/somefile.rb', [1, nil, 1, 1, 1, 0, 0, nil, 1, nil])
|
40
71
|
])
|
41
72
|
SimpleCov.stubs(:root).returns('/path')
|
42
|
-
|
73
|
+
success_stubs if success
|
74
|
+
data = formatter.format(result, false)
|
43
75
|
puts data
|
44
76
|
puts data['params']
|
45
|
-
if success
|
46
|
-
|
47
|
-
end
|
77
|
+
assert_successful_upload(data) if success
|
78
|
+
WebMock.reset!
|
48
79
|
data
|
49
80
|
end
|
50
81
|
|
82
|
+
def success_stubs
|
83
|
+
stub_request(:post, %r{https:\/\/codecov.io\/upload\/v4})
|
84
|
+
.to_return(
|
85
|
+
status: 200,
|
86
|
+
body: "https://codecov.io/gh/fake\n" \
|
87
|
+
'https://storage.googleapis.com/codecov/fake'
|
88
|
+
)
|
89
|
+
stub_request(:put, %r{https:\/\/storage.googleapis.com\/})
|
90
|
+
.to_return(
|
91
|
+
status: 200,
|
92
|
+
body: ''
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
51
96
|
def assert_successful_upload(data)
|
52
97
|
assert_equal(data['result']['uploaded'], true)
|
53
98
|
assert_equal(data['result']['message'], 'Coverage reports upload successfully')
|
@@ -60,6 +105,8 @@ class TestCodecov < Minitest::Test
|
|
60
105
|
|
61
106
|
def setup
|
62
107
|
ENV['CI'] = nil
|
108
|
+
ENV['CIRCLECI'] = nil
|
109
|
+
ENV['GITHUB_ACTIONS'] = nil
|
63
110
|
ENV['TRAVIS'] = nil
|
64
111
|
end
|
65
112
|
|
@@ -134,6 +181,12 @@ class TestCodecov < Minitest::Test
|
|
134
181
|
ENV['ghprbSourceBranch'] = nil
|
135
182
|
ENV['GIT_BRANCH'] = nil
|
136
183
|
ENV['GIT_COMMIT'] = nil
|
184
|
+
ENV['GITHUB_ACTIONS'] = nil
|
185
|
+
ENV['GITHUB_REF'] = nil
|
186
|
+
ENV['GITHUB_HEAD_REF'] = nil
|
187
|
+
ENV['GITHUB_REPOSITORY'] = nil
|
188
|
+
ENV['GITHUB_RUN_ID'] = nil
|
189
|
+
ENV['GITHUB_SHA'] = nil
|
137
190
|
ENV['GITLAB_CI'] = nil
|
138
191
|
ENV['HEROKU_TEST_RUN_ID'] = nil
|
139
192
|
ENV['HEROKU_TEST_RUN_BRANCH'] = nil
|
@@ -149,13 +202,13 @@ class TestCodecov < Minitest::Test
|
|
149
202
|
ENV['SEMAPHORE_REPO_SLUG'] = nil
|
150
203
|
ENV['SHIPPABLE'] = nil
|
151
204
|
ENV['TF_BUILD'] = nil
|
152
|
-
ENV['TRAVIS'] =
|
153
|
-
ENV['TRAVIS_BRANCH'] =
|
154
|
-
ENV['TRAVIS_COMMIT'] =
|
155
|
-
ENV['TRAVIS_JOB_ID'] =
|
156
|
-
ENV['TRAVIS_JOB_NUMBER'] =
|
157
|
-
ENV['TRAVIS_PULL_REQUEST'] =
|
158
|
-
ENV['TRAVIS_REPO_SLUG'] =
|
205
|
+
ENV['TRAVIS'] = nil
|
206
|
+
ENV['TRAVIS_BRANCH'] = nil
|
207
|
+
ENV['TRAVIS_COMMIT'] = nil
|
208
|
+
ENV['TRAVIS_JOB_ID'] = nil
|
209
|
+
ENV['TRAVIS_JOB_NUMBER'] = nil
|
210
|
+
ENV['TRAVIS_PULL_REQUEST'] = nil
|
211
|
+
ENV['TRAVIS_REPO_SLUG'] = nil
|
159
212
|
ENV['VCS_COMMIT_ID'] = nil
|
160
213
|
ENV['WERCKER_GIT_BRANCH'] = nil
|
161
214
|
ENV['WERCKER_GIT_COMMIT'] = nil
|
@@ -163,6 +216,8 @@ class TestCodecov < Minitest::Test
|
|
163
216
|
ENV['WERCKER_GIT_REPOSITORY'] = nil
|
164
217
|
ENV['WERCKER_MAIN_PIPELINE_STARTED'] = nil
|
165
218
|
ENV['WORKSPACE'] = nil
|
219
|
+
|
220
|
+
REALENV.each_pair { |k, v| ENV[k] = v }
|
166
221
|
end
|
167
222
|
|
168
223
|
def test_git
|
@@ -174,6 +229,23 @@ class TestCodecov < Minitest::Test
|
|
174
229
|
assert_equal(`git rev-parse HEAD`.strip, result['params'][:commit])
|
175
230
|
end
|
176
231
|
|
232
|
+
def test_enterprise
|
233
|
+
stub = stub_request(:post, %r{https:\/\/example.com\/upload\/v2})
|
234
|
+
.to_return(
|
235
|
+
status: 200,
|
236
|
+
body: "{\"id\": \"12345678-1234-abcd-ef12-1234567890ab\", \"message\": \"Coverage reports upload successfully\", \"meta\": { \"status\": 200 }, \"queued\": true, \"uploaded\": true, \"url\": \"https://example.com/github/codecov/codecov-bash/commit/2f6b51562b93e72c610671644fe2a303c5c0e8e5\"}"
|
237
|
+
)
|
238
|
+
|
239
|
+
ENV['CODECOV_URL'] = 'https://example.com'
|
240
|
+
ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
|
241
|
+
result = upload
|
242
|
+
assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
|
243
|
+
assert_equal('12345678-1234-abcd-ef12-1234567890ab', result['result']['id'])
|
244
|
+
branch = `git rev-parse --abbrev-ref HEAD`.strip
|
245
|
+
assert_equal(branch != 'HEAD' ? branch : 'master', result['params'][:branch])
|
246
|
+
assert_equal(`git rev-parse HEAD`.strip, result['params'][:commit])
|
247
|
+
end
|
248
|
+
|
177
249
|
def test_travis
|
178
250
|
ENV['CI'] = 'true'
|
179
251
|
ENV['TRAVIS'] = 'true'
|
@@ -384,6 +456,44 @@ class TestCodecov < Minitest::Test
|
|
384
456
|
assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
|
385
457
|
end
|
386
458
|
|
459
|
+
def test_github_pull_request
|
460
|
+
ENV['CI'] = 'true'
|
461
|
+
ENV['GITHUB_ACTIONS'] = 'true'
|
462
|
+
ENV['GITHUB_HEAD_REF'] = 'patch-2'
|
463
|
+
ENV['GITHUB_REF'] = 'refs/pull/7/merge'
|
464
|
+
ENV['GITHUB_REPOSITORY'] = 'codecov/ci-repo'
|
465
|
+
ENV['GITHUB_RUN_ID'] = '1'
|
466
|
+
ENV['GITHUB_SHA'] = 'c739768fcac68144a3a6d82305b9c4106934d31a'
|
467
|
+
ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
|
468
|
+
result = upload
|
469
|
+
assert_equal('github-actions', result['params'][:service])
|
470
|
+
assert_equal('c739768fcac68144a3a6d82305b9c4106934d31a', result['params'][:commit])
|
471
|
+
assert_equal('codecov/ci-repo', result['params'][:slug])
|
472
|
+
assert_equal('1', result['params'][:build])
|
473
|
+
assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
|
474
|
+
assert_equal('patch-2', result['params'][:branch])
|
475
|
+
assert_equal('7', result['params'][:pr])
|
476
|
+
end
|
477
|
+
|
478
|
+
def test_github_push
|
479
|
+
ENV['CI'] = 'true'
|
480
|
+
ENV['GITHUB_ACTIONS'] = 'true'
|
481
|
+
ENV['GITHUB_HEAD_REF'] = nil
|
482
|
+
ENV['GITHUB_REF'] = 'refs/head/master'
|
483
|
+
ENV['GITHUB_REPOSITORY'] = 'codecov/ci-repo'
|
484
|
+
ENV['GITHUB_RUN_ID'] = '1'
|
485
|
+
ENV['GITHUB_SHA'] = 'c739768fcac68144a3a6d82305b9c4106934d31a'
|
486
|
+
ENV['CODECOV_TOKEN'] = 'f881216b-b5c0-4eb1-8f21-b51887d1d506'
|
487
|
+
result = upload
|
488
|
+
assert_equal('github-actions', result['params'][:service])
|
489
|
+
assert_equal('c739768fcac68144a3a6d82305b9c4106934d31a', result['params'][:commit])
|
490
|
+
assert_equal('codecov/ci-repo', result['params'][:slug])
|
491
|
+
assert_equal('1', result['params'][:build])
|
492
|
+
assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
|
493
|
+
assert_equal('master', result['params'][:branch])
|
494
|
+
assert_equal(false, result['params'].key?(:pr))
|
495
|
+
end
|
496
|
+
|
387
497
|
def test_gitlab
|
388
498
|
ENV['GITLAB_CI'] = 'true'
|
389
499
|
ENV['CI_BUILD_REF_NAME'] = 'master'
|
@@ -521,6 +631,13 @@ class TestCodecov < Minitest::Test
|
|
521
631
|
end
|
522
632
|
|
523
633
|
def test_invalid_token
|
634
|
+
stub_request(:post, %r{https:\/\/codecov.io\/upload})
|
635
|
+
.to_return(
|
636
|
+
status: 400,
|
637
|
+
body: "HTTP 400\n" \
|
638
|
+
'Provided token is not a UUID.'
|
639
|
+
)
|
640
|
+
|
524
641
|
ENV['CODECOV_TOKEN'] = 'fake'
|
525
642
|
result = upload(false)
|
526
643
|
assert_equal(false, result['result']['uploaded'])
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codecov
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- codecov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: colorize
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest-ci
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: mocha
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,7 +157,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
143
157
|
requirements:
|
144
158
|
- - ">="
|
145
159
|
- !ruby/object:Gem::Version
|
146
|
-
version: '
|
160
|
+
version: '2.4'
|
147
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
162
|
requirements:
|
149
163
|
- - ">="
|