danger 6.0.9 → 6.1.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49be83df41a5740ffb6d220476f14f204c1e61cc9b270179dc4c3cd1176bb6aa
4
- data.tar.gz: b6b201a266feca22443d3e92953c9c0096ec7b29ac637c226e5ed4647d06ca64
3
+ metadata.gz: 3c67b44470cd2e591a3308ff21397f02ca56c39df0777856bdb124336b8f34d8
4
+ data.tar.gz: cb10a0fbe36d92be5346930a12dda0d20f33d093968a8bc60e821894752fe4e2
5
5
  SHA512:
6
- metadata.gz: fecbd4258d3d092df13adcbe30770bdda38524b9f1f059c96e49579042c2654b4bf0fb7404577247367b94e9d7882726889c4a55351bf229d9f3248737c7a27c
7
- data.tar.gz: 0ce55dd966931a22c7940d44e302bbcbda8aa315d36178a87fb33313e6b89660c93f44de100d96eb06b00d3be54acd33aaed2ede0cf03dbe9d7d6abeae2a35ba
6
+ metadata.gz: 636bd57417f223be9410e682d687eb109a93de82c2836884cc30d378261545f8c3ab1da15c278a893ffd2fcbf024bfadb4ad13f57d15c07bfd9386ac6ede8d59
7
+ data.tar.gz: 95bd7f1b50c46cb8d62033e72d75c7aab04161590d244ab539c6e96879961f337f165ac9c061514c0c7596812c0d12578d06cb870aac123afc930114cb7e9b38
@@ -0,0 +1,44 @@
1
+ # https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables
2
+ require "uri"
3
+ require "danger/request_sources/github/github"
4
+
5
+ module Danger
6
+ # ### CI Setup
7
+ #
8
+ # Add a script step:
9
+ #
10
+ # ``` shell
11
+ # #!/usr/bin/env bash
12
+ # bundle install
13
+ # bundle exec danger
14
+ # ```
15
+ #
16
+ # ### Token Setup
17
+ #
18
+ # Add the `DANGER_GITHUB_API_TOKEN` to your environment variables.
19
+ #
20
+ class AzurePipelines < CI
21
+ def self.validates_as_ci?(env)
22
+ env.key? "AGENT_ID"
23
+ end
24
+
25
+ def self.validates_as_pr?(env)
26
+ return env["BUILD_REASON"] == "PullRequest"
27
+ end
28
+
29
+ def supported_request_sources
30
+ @supported_request_sources ||= [
31
+ Danger::RequestSources::GitHub,
32
+ Danger::RequestSources::GitLab,
33
+ Danger::RequestSources::BitbucketServer,
34
+ Danger::RequestSources::BitbucketCloud
35
+ ]
36
+ end
37
+
38
+ def initialize(env)
39
+ self.pull_request_id = env["SYSTEM_PULLREQUEST_PULLREQUESTID"]
40
+ self.repo_url = env["BUILD_REPOSITORY_URI"]
41
+ self.repo_slug = env["BUILD_REPOSITORY_NAME"]
42
+ end
43
+ end
44
+ end
@@ -35,7 +35,7 @@ module Danger
35
35
  def fetch_pull_request_url(repo_slug, build_number, token)
36
36
  build_json = fetch_build(repo_slug, build_number, token)
37
37
  pull_requests = build_json[:pull_requests]
38
- return nil unless pull_requests.first
38
+ return nil unless pull_requests && pull_requests.first
39
39
  pull_requests.first[:url]
40
40
  end
41
41
 
@@ -0,0 +1,53 @@
1
+ # https://semaphoreci.com/docs/available-environment-variables.html
2
+ require "danger/request_sources/github/github"
3
+
4
+ module Danger
5
+ # ### CI Setup
6
+ #
7
+ # To set up Danger on Codefresh, create a freestyle step in your Codefresh yaml configuration:
8
+ #
9
+ # ```yml
10
+ # Danger:
11
+ # title: Run Danger
12
+ # image: alpine/bundle
13
+ # working_directory: ${{main_clone}}
14
+ # commands:
15
+ # - bundle install --deployment
16
+ # - bundle exec danger --verbose
17
+ # ```
18
+ #
19
+ # Don't forget to add the `DANGER_GITHUB_API_TOKEN` variable to your pipeline settings so that Danger can properly post comments to your pull request.
20
+ #
21
+ class Codefresh < CI
22
+ def self.validates_as_ci?(env)
23
+ env.key?("CF_BUILD_ID") && env.key?("CF_BUILD_URL")
24
+ end
25
+
26
+ def self.validates_as_pr?(env)
27
+ return !env["CF_PULL_REQUEST_NUMBER"].to_s.empty?
28
+ end
29
+
30
+ def supported_request_sources
31
+ @supported_request_sources ||= [Danger::RequestSources::GitHub]
32
+ end
33
+
34
+ def repo_slug
35
+ return "" if @env["CF_REPO_OWNER"].to_s.empty?
36
+ return "" if @env["CF_REPO_NAME"].to_s.empty?
37
+ "#{@env['CF_REPO_OWNER']}/#{@env['CF_REPO_NAME']}".downcase!
38
+ end
39
+
40
+ def repo_url
41
+ return "" if @env["CF_COMMIT_URL"].to_s.empty?
42
+ @env["CF_COMMIT_URL"].gsub(/\/commit.+$/, "")
43
+ end
44
+
45
+ def pull_request_id
46
+ @env["CF_PULL_REQUEST_NUMBER"]
47
+ end
48
+
49
+ def initialize(env)
50
+ @env = env
51
+ end
52
+ end
53
+ end
@@ -4,7 +4,7 @@ require "danger/request_sources/vsts"
4
4
  module Danger
5
5
  # ### CI Setup
6
6
  #
7
- # You need to go to your project's build definiton. Then add a "Command Line" Task with the "Tool" field set to "bundle"
7
+ # You need to go to your project's build definition. Then add a "Command Line" Task with the "Tool" field set to "bundle"
8
8
  # and the "Arguments" field set to "exec danger".
9
9
  #
10
10
  # ### Token Setup
@@ -1,6 +1,6 @@
1
1
  require "danger/danger_core/dangerfile_generator"
2
2
 
3
- # Mainly so we can have a nice strucutre for commands
3
+ # Mainly so we can have a nice structure for commands
4
4
 
5
5
  module Danger
6
6
  class DangerfileCommand < Runner
@@ -8,7 +8,9 @@ module Danger
8
8
  # e.g. "**/something.*" for any file called something with any extension
9
9
  def include?(pattern)
10
10
  self.each do |current|
11
- return true if File.fnmatch(pattern, current) || pattern == current
11
+ unless current.nil?
12
+ return true if File.fnmatch(pattern, current) || pattern == current
13
+ end
12
14
  end
13
15
  return false
14
16
  end
@@ -3,7 +3,7 @@ require "danger/request_sources/request_source"
3
3
 
4
4
  module Danger
5
5
  class EnvironmentManager
6
- attr_accessor :ci_source, :request_source, :scm, :ui
6
+ attr_accessor :ci_source, :request_source, :scm, :ui, :danger_id
7
7
 
8
8
  # Finds a Danger::CI class based on the ENV
9
9
  def self.local_ci_source(env)
@@ -25,10 +25,11 @@ module Danger
25
25
  "danger_base".freeze
26
26
  end
27
27
 
28
- def initialize(env, ui = nil)
28
+ def initialize(env, ui = nil, danger_id = "danger")
29
29
  ci_klass = self.class.local_ci_source(env)
30
30
  self.ci_source = ci_klass.new(env)
31
31
  self.ui = ui || Cork::Board.new(silent: false, verbose: false)
32
+ self.danger_id = danger_id
32
33
 
33
34
  RequestSources::RequestSource.available_request_sources.each do |klass|
34
35
  next unless self.ci_source.supports?(klass)
@@ -21,8 +21,8 @@ module Danger
21
21
  # Run some validations
22
22
  validate!(cork, fail_if_no_pr: fail_if_no_pr)
23
23
 
24
- # OK, we now know that Danger can run in this enviroment
25
- env ||= EnvironmentManager.new(system_env, cork)
24
+ # OK, we now know that Danger can run in this environment
25
+ env ||= EnvironmentManager.new(system_env, cork, danger_id)
26
26
  dm ||= Dangerfile.new(env, cork)
27
27
 
28
28
  ran_status = begin
@@ -169,6 +169,20 @@ module Danger
169
169
  def markdown_link(paths, full_path: true)
170
170
  create_link(paths, full_path) { |href, text| create_markdown_link(href, text) }
171
171
  end
172
+
173
+ # @!group Bitbucket Server Misc
174
+ # Updates the PR with build status and build server job link.
175
+ # @param [String] status
176
+ # SUCCESSFUL, FAILED and INPROGRESS
177
+ # @param [String] build_job_link
178
+ # Build server job link
179
+ # @param [String] description
180
+ # Build status description
181
+ # @return [String]
182
+ #
183
+ def update_pr_build_status(status, build_job_link, description)
184
+ @bs.update_pr_build_status(status, build_job_link, description)
185
+ end
172
186
 
173
187
  private
174
188
 
@@ -2,7 +2,7 @@ require "danger/plugin_support/plugin"
2
2
 
3
3
  module Danger
4
4
  # A way to interact with Danger herself. Offering APIs to import plugins,
5
- # and Dangerfiles from muliple sources.
5
+ # and Dangerfiles from multiple sources.
6
6
  #
7
7
  # @example Import a plugin available over HTTP
8
8
  #
@@ -27,7 +27,7 @@ module Danger
27
27
  #
28
28
  # @example Run a Dangerfile from inside a repo
29
29
  #
30
- # danger.import_dangerfile(gitlab: "ruby-grape/danger")
30
+ # danger.import_dangerfile(gitlab_project_id: 1345)
31
31
  #
32
32
  # @example Run a Dangerfile from inside a repo branch and path
33
33
  #
@@ -85,10 +85,10 @@ module Danger
85
85
  elsif opts.key?(:gem)
86
86
  import_dangerfile_from_gem(opts[:gem])
87
87
  else
88
- raise "`import` requires a Hash with either :github or :gem"
88
+ raise "`import` requires a Hash with either :github, :gitlab, :gem, or :path"
89
89
  end
90
90
  else
91
- raise "`import` requires a Hash" unless opts.kind_of?(Hash)
91
+ raise "`import` requires a Hash"
92
92
  end
93
93
  end
94
94
 
@@ -53,6 +53,19 @@ module Danger
53
53
  #
54
54
  # warn "#{gitlab.html_link("Package.json")} was edited." if git.modified_files.include? "Package.json"
55
55
  #
56
+ # @example Select a random group member as assignee if no assignee is selected
57
+ #
58
+ # if gitlab.mr_json["assignee"].nil?
59
+ # reviewer = gitlab.api.group_members(gitlab.api.merge_request_approvals(project_id, mr_id).to_hash["approver_groups"].first["group"]["id"]).sample
60
+ # if gitlab.api.group_members(gitlab.api.merge_request_approvals(project_id, mr_id).to_hash["approver_groups"].first["group"]["id"]).length > 1
61
+ # while reviewer.to_hash["id"] == gitlab.mr_json["author"]["id"] do
62
+ # reviewer = gitlab.api.group_members(gitlab.api.merge_request_approvals(project_id, mr_id).to_hash["approver_groups"].first["group"]["id"]).sample
63
+ # end
64
+ # end
65
+ # message "Reviewer roulete rolled for: #{reviewer.to_hash['name']} (@#{reviewer.to_hash['username']})"
66
+ # gitlab.api.update_merge_request(project_id, mr_id, { assignee_id: reviewer.to_hash["id"] })
67
+ # end
68
+ #
56
69
  #
57
70
  # @see danger/danger
58
71
  # @tags core, gitlab
@@ -34,7 +34,7 @@ module Danger
34
34
  # @example Failing a build
35
35
  #
36
36
  # failure "This build didn't pass tests"
37
- # failure "Ooops!", "Something bad happend"
37
+ # failure "Ooops!", "Something bad happened"
38
38
  # failure ["This is example", "with array"]
39
39
  #
40
40
  # @example Failing a build, and note that on subsequent runs
@@ -34,7 +34,7 @@ module Danger
34
34
  # request_source implementations are invited to override this method.
35
35
  # This is mostly here to enable sources to detect when inlines change only in their
36
36
  # commit hash and not in content per-se. since the link is implementation dependant
37
- # so should be the comparision.
37
+ # so should be the comparison.
38
38
  #
39
39
  # @param [Violation or Markdown] m1
40
40
  # @param [Violation or Markdown] m2
@@ -56,7 +56,7 @@ module Danger
56
56
 
57
57
  # Add some of our custom tags
58
58
  YARD::Tags::Library.define_tag('tags', :tags)
59
- YARD::Tags::Library.define_tag('availablity', :availablity)
59
+ YARD::Tags::Library.define_tag('availability', :availability)
60
60
  end
61
61
 
62
62
  def parse
@@ -45,13 +45,17 @@ module Danger
45
45
  end
46
46
 
47
47
  def delete_comment(id)
48
- uri = URI("#{pr_api_endpoint_v1}/comments/#{id}")
48
+ uri = URI("#{pr_api_endpoint}/comments/#{id}")
49
49
  delete(uri)
50
50
  end
51
51
 
52
52
  def post_comment(text)
53
- uri = URI("#{pr_api_endpoint_v1}/comments")
54
- body = { content: text }.to_json
53
+ uri = URI("#{pr_api_endpoint}/comments")
54
+ body = {
55
+ content: {
56
+ raw: text
57
+ }
58
+ }.to_json
55
59
  post(uri, body)
56
60
  end
57
61
 
@@ -65,10 +69,6 @@ module Danger
65
69
  "#{base_url(2)}/#{pull_request_id}"
66
70
  end
67
71
 
68
- def pr_api_endpoint_v1
69
- "#{base_url(1)}/#{pull_request_id}"
70
- end
71
-
72
72
  def prs_api_endpoint(branch_name)
73
73
  "#{base_url(2)}?q=source.branch.name=\"#{branch_name}\""
74
74
  end
@@ -91,6 +91,15 @@ module Danger
91
91
  @api.delete_comment(c[:id], c[:version]) if c[:text] =~ /generated_by_#{danger_id}/
92
92
  end
93
93
  end
94
+
95
+ def update_pr_build_status(status, build_job_link, description)
96
+ changeset = self.pr_json[:fromRef][:latestCommit]
97
+ # Support for older versions of Bitbucket Server
98
+ changeset = self.pr_json[:fromRef][:latestChangeset] if self.pr_json[:fromRef].key? :latestChangeset
99
+ puts "Changeset: " + changeset
100
+ puts self.pr_json.to_json
101
+ @api.update_pr_build_status(status, changeset, build_job_link, description)
102
+ end
94
103
  end
95
104
  end
96
105
  end
@@ -5,7 +5,7 @@ require "danger/helpers/comments_helper"
5
5
  module Danger
6
6
  module RequestSources
7
7
  class BitbucketServerAPI
8
- attr_accessor :host, :pr_api_endpoint
8
+ attr_accessor :host, :pr_api_endpoint, :key, :project
9
9
 
10
10
  def initialize(project, slug, pull_request_id, environment)
11
11
  @username = environment["DANGER_BITBUCKETSERVER_USERNAME"]
@@ -14,6 +14,8 @@ module Danger
14
14
  if self.host && !(self.host.include? "http://") && !(self.host.include? "https://")
15
15
  self.host = "https://" + self.host
16
16
  end
17
+ self.key = slug
18
+ self.project = project
17
19
  self.pr_api_endpoint = "#{host}/rest/api/1.0/projects/#{project}/repos/#{slug}/pull-requests/#{pull_request_id}"
18
20
  end
19
21
 
@@ -55,6 +57,12 @@ module Danger
55
57
  body = { text: text }.to_json
56
58
  post(uri, body)
57
59
  end
60
+
61
+ def update_pr_build_status(status, changeset, build_job_link, description)
62
+ uri = URI("#{self.host}/rest/build-status/1.0/commits/#{changeset}")
63
+ body = build_status_body(status, build_job_link, description)
64
+ post(uri, body)
65
+ end
58
66
 
59
67
  private
60
68
 
@@ -95,6 +103,15 @@ module Danger
95
103
  http.request(req)
96
104
  end
97
105
  end
106
+
107
+ def build_status_body(status, build_job_link, description)
108
+ body = Hash.new
109
+ body["state"] = status
110
+ body["key"] = self.key
111
+ body["url"] = build_job_link
112
+ body["description"] = description if description
113
+ return body.to_json
114
+ end
98
115
  end
99
116
  end
100
117
  end
@@ -276,7 +276,7 @@ module Danger
276
276
  else
277
277
  # We remove non-sticky violations that have no replies
278
278
  # Since there's no direct concept of a reply in GH, we simply consider
279
- # the existance of non-danger comments in that line as replies
279
+ # the existence of non-danger comments in that line as replies
280
280
  replies = non_danger_comments.select do |potential|
281
281
  potential["path"] == comment["path"] &&
282
282
  potential["position"] == comment["position"] &&
@@ -360,7 +360,7 @@ module Danger
360
360
  else
361
361
  # We remove non-sticky violations that have no replies
362
362
  # Since there's no direct concept of a reply in GH, we simply consider
363
- # the existance of non-danger comments in that line as replies
363
+ # the existence of non-danger comments in that line as replies
364
364
  replies = non_danger_comments.select do |potential|
365
365
  potential["path"] == comment["path"] &&
366
366
  potential["position"] == comment["position"] &&
@@ -76,6 +76,10 @@ module Danger
76
76
  def file_url(_organisation: nil, _repository: nil, _branch: "master", _path: nil)
77
77
  raise "Subclass and overwrite file_url"
78
78
  end
79
+
80
+ def update_build_status(status)
81
+ raise "Subclass and overwrite update_build_status"
82
+ end
79
83
  end
80
84
  end
81
85
  end
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- VERSION = "6.0.9".freeze
2
+ VERSION = "6.1.0".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: 6.0.9
4
+ version: 6.1.0
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: 2019-05-23 00:00:00.000000000 Z
12
+ date: 2019-09-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: claide
@@ -195,6 +195,7 @@ files:
195
195
  - lib/danger.rb
196
196
  - lib/danger/ci_source/appcenter.rb
197
197
  - lib/danger/ci_source/appveyor.rb
198
+ - lib/danger/ci_source/azure_pipelines.rb
198
199
  - lib/danger/ci_source/bitbucket_pipelines.rb
199
200
  - lib/danger/ci_source/bitrise.rb
200
201
  - lib/danger/ci_source/buddybuild.rb
@@ -204,6 +205,7 @@ files:
204
205
  - lib/danger/ci_source/circle_api.rb
205
206
  - lib/danger/ci_source/cirrus.rb
206
207
  - lib/danger/ci_source/code_build.rb
208
+ - lib/danger/ci_source/codefresh.rb
207
209
  - lib/danger/ci_source/codeship.rb
208
210
  - lib/danger/ci_source/dotci.rb
209
211
  - lib/danger/ci_source/drone.rb