codecov 0.2.3 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/codecov.rb +42 -6
  3. data/test/test_codecov.rb +114 -20
  4. metadata +8 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b59d7f1fb16986a207023da3b8f2130b4014084cf7d73d688c304e761c683513
4
- data.tar.gz: 68ba0cc7cd7cc16d84e88dd2bf20db83f69872eb540de4e9d4128ec0e889888f
3
+ metadata.gz: e49b9d2e3374ac7e3f5d6514045a0454c767e200db364059887cb0d0a8a3e13f
4
+ data.tar.gz: 83f5c298eb2be003da0302d329241f5eaa64a9d5d2d747be0b845437607bce88
5
5
  SHA512:
6
- metadata.gz: c636171303865424027efcfe53b8de75a1b860dc21f70bc43b65d11ea81eb6c1805c4d7a49ab650e7a0dbda992bdfd78e72aa2c6fd881f8d983859bde850ca80
7
- data.tar.gz: b9fc5e08981827a1dc873410222e7590baa41d8c8ba7563803edb35e29d9d2fd2b307a1a3ef85f7893bfd93ef27e79541e419c5cb6842b2ca7564663790a928e
6
+ metadata.gz: 4c8aba631f40e6fddca4d507613de63caf64207fda359518faceb9267e327cf0d4611ba864083e7ef8158fee9b8f4dfab10e8dfdd6e7f1f6e5d30ac4ae8275cb
7
+ data.tar.gz: b15d9af39b437902e7f59a749bdf54dee8e12a97f4e78f8c4b918d001ca66606731a17986e4f52e0fe1e4a51b9c87ca652768395d60869da6cb5025cee876827
@@ -4,11 +4,10 @@ require 'uri'
4
4
  require 'json'
5
5
  require 'net/http'
6
6
  require 'simplecov'
7
- require 'colorize'
8
7
  require 'zlib'
9
8
 
10
9
  class SimpleCov::Formatter::Codecov
11
- VERSION = '0.2.3'
10
+ VERSION = '0.2.8'
12
11
 
13
12
  ### CIs
14
13
  RECOGNIZED_CIS = [
@@ -20,6 +19,7 @@ class SimpleCov::Formatter::Codecov
20
19
  CIRCLE = 'Circle CI',
21
20
  CODESHIP = 'Codeship CI',
22
21
  DRONEIO = 'Drone CI',
22
+ GITHUB = 'GitHub Actions',
23
23
  GITLAB = 'GitLab CI',
24
24
  HEROKU = 'Heroku CI',
25
25
  JENKINS = 'Jenkins CI',
@@ -62,6 +62,8 @@ class SimpleCov::Formatter::Codecov
62
62
  CODESHIP
63
63
  elsif ((ENV['CI'] == 'true') || (ENV['CI'] == 'drone')) && (ENV['DRONE'] == 'true')
64
64
  DRONEIO
65
+ elsif (ENV['CI'] == 'true') && (ENV['GITHUB_ACTIONS'] == 'true')
66
+ GITHUB
65
67
  elsif !ENV['GITLAB_CI'].nil?
66
68
  GITLAB
67
69
  elsif ENV['HEROKU_TEST_RUN_ID']
@@ -172,6 +174,15 @@ class SimpleCov::Formatter::Codecov
172
174
  params[:build_url] = ENV['DRONE_BUILD_LINK'] || ENV['DRONE_BUILD_URL'] || ENV['CI_BUILD_URL']
173
175
  params[:pr] = ENV['DRONE_PULL_REQUEST']
174
176
  params[:tag] = ENV['DRONE_TAG']
177
+ when GITHUB
178
+ # https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables
179
+ params[:service] = 'github-actions'
180
+ params[:branch] = ENV['GITHUB_HEAD_REF'] || ENV['GITHUB_REF'].sub('refs/head/', '')
181
+ # PR refs are in the format: refs/pull/7/merge for pull_request events
182
+ params[:pr] = ENV['GITHUB_REF'].split('/')[2] unless ENV['GITHUB_HEAD_REF'].nil? || ENV['GITHUB_HEAD_REF'].empty?
183
+ params[:slug] = ENV['GITHUB_REPOSITORY']
184
+ params[:build] = ENV['GITHUB_RUN_ID']
185
+ params[:commit] = ENV['GITHUB_SHA']
175
186
  when GITLAB
176
187
  # http://doc.gitlab.com/ci/examples/README.html#environmental-variables
177
188
  # https://gitlab.com/gitlab-org/gitlab-ci-runner/blob/master/lib/build.rb#L96
@@ -305,7 +316,7 @@ class SimpleCov::Formatter::Codecov
305
316
  def create_report(report)
306
317
  result = {
307
318
  'meta' => {
308
- 'version' => 'codecov-ruby/v' + SimpleCov::Formatter::Codecov::VERSION
319
+ 'version' => 'codecov-ruby/v' + VERSION
309
320
  }
310
321
  }
311
322
  result.update(result_to_codecov(report))
@@ -325,6 +336,7 @@ class SimpleCov::Formatter::Codecov
325
336
 
326
337
  def upload_to_codecov(ci, report)
327
338
  url = ENV['CODECOV_URL'] || 'https://codecov.io'
339
+ is_enterprise = url != 'https://codecov.io'
328
340
 
329
341
  params = build_params(ci)
330
342
  params_secret_token = params.clone
@@ -342,8 +354,11 @@ class SimpleCov::Formatter::Codecov
342
354
  puts " url: #{url}"
343
355
  puts " query: #{query_without_token}"
344
356
 
345
- response = upload_to_v4(url, gzipped_report, query, query_without_token)
346
- return false if response == false
357
+ response = false
358
+ unless is_enterprise
359
+ response = upload_to_v4(url, gzipped_report, query, query_without_token)
360
+ return false if response == false
361
+ end
347
362
 
348
363
  response || upload_to_v2(url, gzipped_report, query, query_without_token)
349
364
  end
@@ -409,11 +424,12 @@ class SimpleCov::Formatter::Codecov
409
424
  https.use_ssl = !url.match(/^https/).nil?
410
425
 
411
426
  puts ['-> '.green, 'Uploading to Codecov'].join(' ')
412
- puts "#{url}/#{uri.path}?#{query_without_token}"
427
+ puts "#{url}#{uri.path}?#{query_without_token}"
413
428
 
414
429
  req = Net::HTTP::Post.new(
415
430
  "#{uri.path}?#{query}",
416
431
  {
432
+ 'Accept' => 'application/json',
417
433
  'Content-Encoding' => 'gzip',
418
434
  'Content-Type' => 'text/plain',
419
435
  'X-Content-Encoding' => 'gzip'
@@ -570,3 +586,23 @@ class SimpleCov::Formatter::Codecov
570
586
  true
571
587
  end
572
588
  end
589
+
590
+ # https://stackoverflow.com/a/11482430/5769383
591
+ class String
592
+ # colorization
593
+ def colorize(color_code)
594
+ "\e[#{color_code}m#{self}\e[0m"
595
+ end
596
+
597
+ def black
598
+ colorize(30)
599
+ end
600
+
601
+ def red
602
+ colorize(31)
603
+ end
604
+
605
+ def green
606
+ colorize(32)
607
+ end
608
+ end
@@ -3,14 +3,44 @@
3
3
  require 'helper'
4
4
 
5
5
  class TestCodecov < Minitest::Test
6
- REALENV = {
7
- 'TRAVIS_BRANCH' => ENV['TRAVIS_BRANCH'],
8
- 'TRAVIS_COMMIT' => ENV['TRAVIS_COMMIT'],
9
- 'TRAVIS_REPO_SLUG' => ENV['TRAVIS_REPO_SLUG'],
10
- 'TRAVIS_JOB_NUMBER' => ENV['TRAVIS_JOB_NUMBER'],
11
- 'TRAVIS_PULL_REQUEST' => ENV['TRAVIS_PULL_REQUEST'],
12
- 'TRAVIS_JOB_ID' => ENV['TRAVIS_JOB_ID']
13
- }.freeze
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,7 +62,8 @@ 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]),
@@ -43,15 +74,13 @@ class TestCodecov < Minitest::Test
43
74
  data = formatter.format(result, false)
44
75
  puts data
45
76
  puts data['params']
46
- if success
47
- assert_successful_upload(data)
48
- end
77
+ assert_successful_upload(data) if success
49
78
  WebMock.reset!
50
79
  data
51
80
  end
52
81
 
53
82
  def success_stubs
54
- stub_request(:post, %r{https:\/\/codecov.io\/upload})
83
+ stub_request(:post, %r{https:\/\/codecov.io\/upload\/v4})
55
84
  .to_return(
56
85
  status: 200,
57
86
  body: "https://codecov.io/gh/fake\n" \
@@ -76,6 +105,8 @@ class TestCodecov < Minitest::Test
76
105
 
77
106
  def setup
78
107
  ENV['CI'] = nil
108
+ ENV['CIRCLECI'] = nil
109
+ ENV['GITHUB_ACTIONS'] = nil
79
110
  ENV['TRAVIS'] = nil
80
111
  end
81
112
 
@@ -150,6 +181,12 @@ class TestCodecov < Minitest::Test
150
181
  ENV['ghprbSourceBranch'] = nil
151
182
  ENV['GIT_BRANCH'] = nil
152
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
153
190
  ENV['GITLAB_CI'] = nil
154
191
  ENV['HEROKU_TEST_RUN_ID'] = nil
155
192
  ENV['HEROKU_TEST_RUN_BRANCH'] = nil
@@ -165,13 +202,13 @@ class TestCodecov < Minitest::Test
165
202
  ENV['SEMAPHORE_REPO_SLUG'] = nil
166
203
  ENV['SHIPPABLE'] = nil
167
204
  ENV['TF_BUILD'] = nil
168
- ENV['TRAVIS'] = 'true'
169
- ENV['TRAVIS_BRANCH'] = REALENV['TRAVIS_BRANCH']
170
- ENV['TRAVIS_COMMIT'] = REALENV['TRAVIS_COMMIT']
171
- ENV['TRAVIS_JOB_ID'] = REALENV['TRAVIS_JOB_ID']
172
- ENV['TRAVIS_JOB_NUMBER'] = REALENV['TRAVIS_JOB_NUMBER']
173
- ENV['TRAVIS_PULL_REQUEST'] = REALENV['TRAVIS_PULL_REQUEST']
174
- ENV['TRAVIS_REPO_SLUG'] = REALENV['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
175
212
  ENV['VCS_COMMIT_ID'] = nil
176
213
  ENV['WERCKER_GIT_BRANCH'] = nil
177
214
  ENV['WERCKER_GIT_COMMIT'] = nil
@@ -179,6 +216,8 @@ class TestCodecov < Minitest::Test
179
216
  ENV['WERCKER_GIT_REPOSITORY'] = nil
180
217
  ENV['WERCKER_MAIN_PIPELINE_STARTED'] = nil
181
218
  ENV['WORKSPACE'] = nil
219
+
220
+ REALENV.each_pair { |k, v| ENV[k] = v }
182
221
  end
183
222
 
184
223
  def test_git
@@ -190,6 +229,23 @@ class TestCodecov < Minitest::Test
190
229
  assert_equal(`git rev-parse HEAD`.strip, result['params'][:commit])
191
230
  end
192
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
+
193
249
  def test_travis
194
250
  ENV['CI'] = 'true'
195
251
  ENV['TRAVIS'] = 'true'
@@ -400,6 +456,44 @@ class TestCodecov < Minitest::Test
400
456
  assert_equal('f881216b-b5c0-4eb1-8f21-b51887d1d506', result['params']['token'])
401
457
  end
402
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
+
403
497
  def test_gitlab
404
498
  ENV['GITLAB_CI'] = 'true'
405
499
  ENV['CI_BUILD_REF_NAME'] = 'master'
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codecov
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - codecov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-27 00:00:00.000000000 Z
11
+ date: 2020-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: colorize
14
+ name: json
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: json
28
+ name: simplecov
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,13 +39,13 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: simplecov
42
+ name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
- type: :runtime
48
+ type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: minitest
56
+ name: minitest-ci
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -143,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
143
143
  requirements:
144
144
  - - ">="
145
145
  - !ruby/object:Gem::Version
146
- version: '0'
146
+ version: '2.4'
147
147
  required_rubygems_version: !ruby/object:Gem::Requirement
148
148
  requirements:
149
149
  - - ">="