danger 8.2.3 → 8.4.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cd811a6fad28534b9e0b28ccbed30d0694e4ab3408ad22852a8897a56c55f2ed
4
- data.tar.gz: 747e7a6ff6fce272eb7b732ced8f6358602159725e5490a3ce783f7ce06dcc83
3
+ metadata.gz: 423862c4ae06fbd90dbc52ae126b171c3af53da1867f6051db5e1e00cd1cb09e
4
+ data.tar.gz: 45d13ff59705d33a756f8a221ef597f8c29f534511a9cd310241d2730b118e59
5
5
  SHA512:
6
- metadata.gz: 54612a3b0e7999fce7289a884febff1548edbfa92af9947a8c8cc4bbef5fa69451ac88b493bc2ba0125e23ef96f7a46846a7a3b1e7adb8ac4d8f98aafa0065ce
7
- data.tar.gz: 6612a1c511c7fe579c2734f6b4c8b15955dc2a2dd196a4a0277a901d61307b58c2abdd7f000867c1f212d2db065b39c8dfcd9f83c774154b1089a37395f45096
6
+ metadata.gz: 3a1e23473e3012edb47a6860ca50a4e0e12512ade5c2796b79720c71ba049c034060893505a5264df3ee36439ae702dffe1cc9472da4e6357d2cef7ba81e24b8
7
+ data.tar.gz: 4e186a0412277f4d3add84821f39529900c9faec5439ccd62329bc24e6a753c19feafe68208f9ff3b7fe8b12e64ba8b31379b7af5273f24dfa230ec804f12648
@@ -19,7 +19,11 @@ module Danger
19
19
  #
20
20
  class AzurePipelines < CI
21
21
  def self.validates_as_ci?(env)
22
- env.key?("AGENT_ID") && env["BUILD_REPOSITORY_PROVIDER"] != "TfsGit"
22
+ # AGENT_ID is being used by AppCenter as well, so checking here to make sure AppCenter CI doesn't get a false positive for AzurePipelines
23
+ # Anyone working with AzurePipelines could provide a better/truly unique env key to avoid checking for AppCenter
24
+ !Danger::Appcenter::validates_as_ci?(env) &&
25
+ env.key?("AGENT_ID") &&
26
+ env["BUILD_REPOSITORY_PROVIDER"] != "TfsGit"
23
27
  end
24
28
 
25
29
  def self.validates_as_pr?(env)
@@ -45,7 +45,7 @@ module Danger
45
45
  end
46
46
 
47
47
  def supported_request_sources
48
- @supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
48
+ @supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab, Danger::RequestSources::BitbucketServer]
49
49
  end
50
50
  end
51
51
  end
@@ -0,0 +1,58 @@
1
+ # https://docs.codemagic.io/building/environment-variables/
2
+
3
+ module Danger
4
+ # ### CI Setup
5
+ #
6
+ # Add a script step to your workflow:
7
+ #
8
+ # ```
9
+ # - name: Running Danger
10
+ # script: |
11
+ # bundle install
12
+ # bundle exec danger
13
+ # ```
14
+ #
15
+ # ### Token Setup
16
+ #
17
+ # Add the following environment variables to your workflow's environment configuration.
18
+ # https://docs.codemagic.io/getting-started/yaml/
19
+ #
20
+ # #### GitHub
21
+ # Add the `DANGER_GITHUB_API_TOKEN` to your build user's ENV.
22
+ #
23
+ # #### GitLab
24
+ # Add the `DANGER_GITLAB_API_TOKEN` to your build user's ENV.
25
+ #
26
+ # #### Bitbucket Cloud
27
+ # Add the `DANGER_BITBUCKETSERVER_USERNAME`, `DANGER_BITBUCKETSERVER_PASSWORD`
28
+ # to your build user's ENV.
29
+ #
30
+ # #### Bitbucket server
31
+ # Add the `DANGER_BITBUCKETSERVER_USERNAME`, `DANGER_BITBUCKETSERVER_PASSWORD`
32
+ # and `DANGER_BITBUCKETSERVER_HOST` to your build user's ENV.
33
+ #
34
+ class Codemagic < CI
35
+ def self.validates_as_ci?(env)
36
+ env.key? "FCI_PROJECT_ID"
37
+ end
38
+
39
+ def self.validates_as_pr?(env)
40
+ return !env["FCI_PULL_REQUEST_NUMBER"].to_s.empty?
41
+ end
42
+
43
+ def supported_request_sources
44
+ @supported_request_sources ||= [
45
+ Danger::RequestSources::GitHub,
46
+ Danger::RequestSources::GitLab,
47
+ Danger::RequestSources::BitbucketServer,
48
+ Danger::RequestSources::BitbucketCloud
49
+ ]
50
+ end
51
+
52
+ def initialize(env)
53
+ self.pull_request_id = env["FCI_PULL_REQUEST_NUMBER"]
54
+ self.repo_slug = env["FCI_REPO_SLUG"]
55
+ self.repo_url = GitRepo.new.origins # Codemagic doesn't provide a repo url env variable for n
56
+ end
57
+ end
58
+ end
@@ -133,7 +133,7 @@ module Danger
133
133
  matches = change_url.match(%r{(.+)\/pull\/[0-9]+})
134
134
  matches[1] unless matches.nil?
135
135
  when %r{\/merge_requests\/} # GitLab
136
- matches = change_url.match(%r{(.+)\/merge_requests\/[0-9]+})
136
+ matches = change_url.match(%r{(.+?)(\/-)?\/merge_requests\/[0-9]+})
137
137
  matches[1] unless matches.nil?
138
138
  when %r{\/pull-requests\/} # Bitbucket
139
139
  matches = change_url.match(%r{(.+)\/pull-requests\/[0-9]+})
@@ -137,7 +137,7 @@ module Danger
137
137
 
138
138
  def client
139
139
  scm_provider = find_scm_provider(remote_url)
140
-
140
+
141
141
  case scm_provider
142
142
  when :bitbucket_cloud
143
143
  require "danger/request_sources/bitbucket_cloud_api"
@@ -151,8 +151,15 @@ module Danger
151
151
 
152
152
  when :github
153
153
  require "octokit"
154
- Octokit::Client.new(access_token: ENV["DANGER_GITHUB_API_TOKEN"], api_endpoint: api_url)
155
-
154
+ access_token = ENV["DANGER_GITHUB_API_TOKEN"]
155
+ bearer_token = ENV["DANGER_GITHUB_BEARER_TOKEN"]
156
+ if bearer_token && !bearer_token.empty?
157
+ Octokit::Client.new(bearer_token: bearer_token, api_endpoint: api_url)
158
+ elsif access_token && !access_token.empty?
159
+ Octokit::Client.new(access_token: access_token, api_endpoint: api_url)
160
+ else
161
+ raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN` or `DANGER_GITHUB_BEARER_TOKEN`"
162
+ end
156
163
  else
157
164
  raise "SCM provider not supported: #{scm_provider}"
158
165
  end
@@ -0,0 +1,38 @@
1
+ module Danger
2
+ # ### CI Setup
3
+ #
4
+ # In order to work with Xcode Cloud and Danger, you will need to add `bundle exec danger` to
5
+ # the `ci_scripts/ci_post_xcodebuild.sh` (Xcode Cloud's expected filename for a post-action build script).
6
+ # More details and documentation on Xcode Cloud configuration can be found [here](https://developer.apple.com/documentation/xcode/writing-custom-build-scripts).
7
+ #
8
+ # ### Token Setup
9
+ #
10
+ # You will need to add the `DANGER_GITHUB_API_TOKEN` to your build environment.
11
+ # If running on GitHub Enterprise, make sure you also set the expected values for
12
+ # both `DANGER_GITHUB_API_HOST` and `DANGER_GITHUB_HOST`.
13
+ #
14
+ class XcodeCloud < CI
15
+ def self.validates_as_ci?(env)
16
+ env.key? "CI_XCODEBUILD_ACTION"
17
+ end
18
+
19
+ def self.validates_as_pr?(env)
20
+ env.key? "CI_PULL_REQUEST_NUMBER"
21
+ end
22
+
23
+ def supported_request_sources
24
+ @supported_request_sources ||= [
25
+ Danger::RequestSources::GitHub,
26
+ Danger::RequestSources::GitLab,
27
+ Danger::RequestSources::BitbucketCloud,
28
+ Danger::RequestSources::BitbucketServer
29
+ ]
30
+ end
31
+
32
+ def initialize(env)
33
+ self.repo_slug = env["CI_PULL_REQUEST_SOURCE_REPO"]
34
+ self.pull_request_id = env["CI_PULL_REQUEST_NUMBER"]
35
+ self.repo_url = env["CI_PULL_REQUEST_HTML_URL"]
36
+ end
37
+ end
38
+ end
@@ -17,10 +17,5 @@
17
17
  <%= current %>
18
18
  <%# the previous line has to be aligned far to the left, otherwise markdown can break easily %>
19
19
  <%- end -%>
20
- <%# We need to add the generated_by_ to identify comments from danger. But with inlines %>
21
- <%# it might be a little annoying, so we set on the table, but if we have markdown we add the footer anyway %>
22
- <%- if @markdowns.count > 0 -%>
23
- <p align="right" data-meta="generated_by_<%= @danger_id %>">
24
- Generated by :no_entry_sign: <a href="http://danger.systems/">Danger</a>
25
- </p>
26
- <%- end -%>
20
+ <%# Add the generated_by_ as a html coment to identify comments from danger. %>
21
+ <!-- "generated_by_<%= @danger_id %>" -->
@@ -143,6 +143,14 @@ module Danger
143
143
  @github.issue_json["labels"].map { |l| l[:name] }
144
144
  end
145
145
 
146
+ # @!group PR Metadata
147
+ # Whether the PR is a Draft.
148
+ # @return [Boolean]
149
+ #
150
+ def pr_draft?
151
+ pr_json["mergeable_state"] == "draft"
152
+ end
153
+
146
154
  # @!group PR Commit Metadata
147
155
  # The branch to which the PR is going to be merged into.
148
156
  # @return [String]
@@ -131,6 +131,22 @@ module Danger
131
131
  @gitlab.mr_diff
132
132
  end
133
133
 
134
+ # @!group MR Changes
135
+ # The array of changes
136
+ # @return [Array<Gitlab::ObjectifiedHash>]
137
+ #
138
+ def mr_changes
139
+ @gitlab.mr_changes.changes
140
+ end
141
+
142
+ # @!group MR Closes issues
143
+ # The array of issues that this MR closes
144
+ # @return [Array<Gitlab::ObjectifiedHash>]
145
+ #
146
+ def mr_closes_issues
147
+ @gitlab.mr_closes_issues
148
+ end
149
+
134
150
  # @!group MR Commit Metadata
135
151
  # The branch to which the MR is going to be merged into
136
152
  # @deprecated Please use {#branch_for_base} instead
@@ -148,7 +148,7 @@ module Danger
148
148
  def generate_description(warnings: nil, errors: nil, template: "github")
149
149
  emoji_mapper = EmojiMapper.new(template)
150
150
  if errors.empty? && warnings.empty?
151
- return "All green. #{random_compliment}"
151
+ return ENV['DANGER_SUCCESS_MESSAGE'] || "All green. #{random_compliment}"
152
152
  else
153
153
  message = "#{emoji_mapper.map('warning')} "
154
154
  message += "#{'Error'.danger_pluralize(errors.count)}. " unless errors.empty?
@@ -10,7 +10,7 @@ module Danger
10
10
  "bitbucket_server" => {
11
11
  "no_entry_sign" => ":no_entry_sign:",
12
12
  "warning" => ":warning:",
13
- "book" => ":book:",
13
+ "book" => ":blue_book:",
14
14
  "white_check_mark" => ":white_check_mark:"
15
15
  }
16
16
  }.freeze
@@ -20,10 +20,12 @@ module Danger
20
20
  end
21
21
 
22
22
  def self.optional_env_vars
23
- ["DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_KEY",
24
- "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_TITLE",
25
- "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_DESCRIPTION",
26
- "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_LOGO_URL"
23
+ [
24
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_KEY",
25
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_TITLE",
26
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_DESCRIPTION",
27
+ "DANGER_BITBUCKETSERVER_CODE_INSIGHTS_REPORT_LOGO_URL",
28
+ "DANGER_BITBUCKETSERVER_VERIFY_SSL"
27
29
  ]
28
30
  end
29
31
 
@@ -110,17 +112,20 @@ module Danger
110
112
  markdowns = main_violations[:markdowns] || []
111
113
  end
112
114
 
113
- comment = generate_description(warnings: warnings,
114
- errors: errors)
115
- comment += "\n\n"
116
- comment += generate_comment(warnings: warnings,
117
- errors: errors,
118
- messages: messages,
119
- markdowns: markdowns,
120
- previous_violations: {},
121
- danger_id: danger_id,
122
- template: "bitbucket_server")
123
- @api.post_comment(comment)
115
+ has_comments = (warnings.count > 0 || errors.count > 0 || messages.count > 0 || markdowns.count > 0)
116
+ if has_comments
117
+ comment = generate_description(warnings: warnings,
118
+ errors: errors)
119
+ comment += "\n\n"
120
+ comment += generate_comment(warnings: warnings,
121
+ errors: errors,
122
+ messages: messages,
123
+ markdowns: markdowns,
124
+ previous_violations: {},
125
+ danger_id: danger_id,
126
+ template: "bitbucket_server")
127
+ @api.post_comment(comment)
128
+ end
124
129
  end
125
130
 
126
131
  def delete_old_comments(danger_id: "danger")
@@ -1,16 +1,18 @@
1
1
  # coding: utf-8
2
2
 
3
+ require "openssl"
3
4
  require "danger/helpers/comments_helper"
4
5
 
5
6
  module Danger
6
7
  module RequestSources
7
8
  class BitbucketServerAPI
8
- attr_accessor :host, :pr_api_endpoint, :key, :project
9
+ attr_accessor :host, :verify_ssl, :pr_api_endpoint, :key, :project
9
10
 
10
11
  def initialize(project, slug, pull_request_id, environment)
11
12
  @username = environment["DANGER_BITBUCKETSERVER_USERNAME"]
12
13
  @password = environment["DANGER_BITBUCKETSERVER_PASSWORD"]
13
14
  self.host = environment["DANGER_BITBUCKETSERVER_HOST"]
15
+ self.verify_ssl = environment["DANGER_BITBUCKETSERVER_VERIFY_SSL"] == "false" ? false : true
14
16
  if self.host && !(self.host.include? "http://") && !(self.host.include? "https://")
15
17
  self.host = "https://" + self.host
16
18
  end
@@ -57,7 +59,7 @@ module Danger
57
59
  body = { text: text }.to_json
58
60
  post(uri, body)
59
61
  end
60
-
62
+
61
63
  def update_pr_build_status(status, changeset, build_job_link, description)
62
64
  uri = URI("#{self.host}/rest/build-status/1.0/commits/#{changeset}")
63
65
  body = build_status_body(status, build_job_link, description)
@@ -73,7 +75,7 @@ module Danger
73
75
  def fetch_json(uri)
74
76
  req = Net::HTTP::Get.new(uri.request_uri, { "Content-Type" => "application/json" })
75
77
  req.basic_auth @username, @password
76
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: use_ssl) do |http|
78
+ res = http(uri).start do |http|
77
79
  http.request(req)
78
80
  end
79
81
  JSON.parse(res.body, symbolize_names: true)
@@ -84,7 +86,7 @@ module Danger
84
86
  req.basic_auth @username, @password
85
87
  req.body = body
86
88
 
87
- res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: use_ssl) do |http|
89
+ res = http(uri).start do |http|
88
90
  http.request(req)
89
91
  end
90
92
 
@@ -99,11 +101,18 @@ module Danger
99
101
  def delete(uri)
100
102
  req = Net::HTTP::Delete.new(uri.request_uri, { "Content-Type" => "application/json" })
101
103
  req.basic_auth @username, @password
102
- Net::HTTP.start(uri.hostname, uri.port, use_ssl: use_ssl) do |http|
104
+ http(uri).start do |http|
103
105
  http.request(req)
104
106
  end
105
107
  end
106
-
108
+
109
+ def http(uri)
110
+ http = Net::HTTP.new(uri.hostname, uri.port)
111
+ http.use_ssl = use_ssl
112
+ http.verify_mode = verify_ssl ? OpenSSL::SSL::VERIFY_PEER : OpenSSL::SSL::VERIFY_NONE
113
+ http
114
+ end
115
+
107
116
  def build_status_body(status, build_job_link, description)
108
117
  body = Hash.new
109
118
  body["state"] = status
@@ -17,7 +17,7 @@ module Danger
17
17
  attr_accessor :pr_json, :issue_json, :support_tokenless_auth, :dismiss_out_of_range_messages
18
18
 
19
19
  def self.env_vars
20
- ["DANGER_GITHUB_API_TOKEN"]
20
+ ["DANGER_GITHUB_API_TOKEN", "DANGER_GITHUB_BEARER_TOKEN"]
21
21
  end
22
22
 
23
23
  def self.optional_env_vars
@@ -30,7 +30,8 @@ module Danger
30
30
  self.support_tokenless_auth = false
31
31
  self.dismiss_out_of_range_messages = false
32
32
 
33
- @token = @environment["DANGER_GITHUB_API_TOKEN"]
33
+ @access_token = @environment["DANGER_GITHUB_API_TOKEN"]
34
+ @bearer_token = @environment["DANGER_GITHUB_BEARER_TOKEN"]
34
35
  end
35
36
 
36
37
  def get_pr_from_branch(repo_name, branch_name, owner)
@@ -45,7 +46,7 @@ module Danger
45
46
  end
46
47
 
47
48
  def validates_as_api_source?
48
- (@token && !@token.empty?) || self.environment["DANGER_USE_LOCAL_GIT"]
49
+ valid_bearer_token? || valid_access_token? || self.environment["DANGER_USE_LOCAL_GIT"]
49
50
  end
50
51
 
51
52
  def scm
@@ -72,12 +73,16 @@ module Danger
72
73
  end
73
74
 
74
75
  def client
75
- raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN`" if !@token && !support_tokenless_auth
76
+ raise "No API token given, please provide one using `DANGER_GITHUB_API_TOKEN` or `DANGER_GITHUB_BEARER_TOKEN`" if !valid_access_token? && !valid_bearer_token? && !support_tokenless_auth
76
77
  @client ||= begin
77
78
  Octokit.configure do |config|
78
79
  config.connection_options[:ssl] = { verify: verify_ssl }
79
80
  end
80
- Octokit::Client.new(access_token: @token, auto_paginate: true, api_endpoint: api_url)
81
+ if valid_bearer_token?
82
+ Octokit::Client.new(bearer_token: @bearer_token, auto_paginate: true, api_endpoint: api_url)
83
+ elsif valid_access_token?
84
+ Octokit::Client.new(access_token: @access_token, auto_paginate: true, api_endpoint: api_url)
85
+ end
81
86
  end
82
87
  end
83
88
 
@@ -493,6 +498,14 @@ module Danger
493
498
 
494
499
  private
495
500
 
501
+ def valid_access_token?
502
+ @access_token && !@access_token.empty?
503
+ end
504
+
505
+ def valid_bearer_token?
506
+ @bearer_token && !@bearer_token.empty?
507
+ end
508
+
496
509
  def regular_violations_group(warnings: [], errors: [], messages: [], markdowns: [])
497
510
  {
498
511
  warnings: warnings.reject(&:inline?),
@@ -130,6 +130,12 @@ module Danger
130
130
  end
131
131
  end
132
132
 
133
+ def mr_closes_issues
134
+ @mr_closes_issues ||= begin
135
+ client.merge_request_closes_issues(ci_source.repo_slug, ci_source.pull_request_id)
136
+ end
137
+ end
138
+
133
139
  def setup_danger_branches
134
140
  # we can use a GitLab specific feature here:
135
141
  base_branch = self.mr_json.source_branch
@@ -298,6 +304,10 @@ module Danger
298
304
  end
299
305
  end
300
306
 
307
+ def markdown_link_to_message(message, _)
308
+ "#{message.file}#L#{message.line}: "
309
+ end
310
+
301
311
  # @return [String] The organisation name, is nil if it can't be detected
302
312
  def organisation
303
313
  nil # TODO: Implement this
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- VERSION = "8.2.3".freeze
2
+ VERSION = "8.4.2".freeze
3
3
  DESCRIPTION = "Like Unit Tests, but for your Team Culture.".freeze
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: danger
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.2.3
4
+ version: 8.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Orta Therox
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-10 00:00:00.000000000 Z
12
+ date: 2021-11-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: claide
@@ -219,6 +219,7 @@ files:
219
219
  - lib/danger/ci_source/cirrus.rb
220
220
  - lib/danger/ci_source/code_build.rb
221
221
  - lib/danger/ci_source/codefresh.rb
222
+ - lib/danger/ci_source/codemagic.rb
222
223
  - lib/danger/ci_source/codeship.rb
223
224
  - lib/danger/ci_source/concourse.rb
224
225
  - lib/danger/ci_source/dotci.rb
@@ -243,6 +244,7 @@ files:
243
244
  - lib/danger/ci_source/teamcity.rb
244
245
  - lib/danger/ci_source/travis.rb
245
246
  - lib/danger/ci_source/vsts.rb
247
+ - lib/danger/ci_source/xcode_cloud.rb
246
248
  - lib/danger/ci_source/xcode_server.rb
247
249
  - lib/danger/clients/rubygems_client.rb
248
250
  - lib/danger/commands/dangerfile/gem.rb