danger 6.3.1 → 6.3.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: c582d1189749d620a69040b53f7fc73c581efd772c39ab7931cd7ed886522fe8
4
- data.tar.gz: 59a22185cdd2cd993ceef9f01934e7757fa6f4f4cd4229e76634bca4b13dd5b1
3
+ metadata.gz: 27b09c31a2f456489426bf90c66b907f7c7b620bc0019387c3c7dd89e14267b6
4
+ data.tar.gz: 7aeed8d94b83e5fb757ca0f319fe55e3c07a4fc641c93dd56408efc1aaeccf4a
5
5
  SHA512:
6
- metadata.gz: 9e6f93dae26ee18d328f10d1287c4dc0127b3199e8b055992795d4440180625010b7ecb5d229241b4d415918846cdecd9d46d214fc51b66ed43c399203ce0490
7
- data.tar.gz: f0ea9446eadaa3705337982b51bf1abd49ca96e9ddecf14b888c69b48cad6ceec7ff5d59cd48f18061d8128c6c12c3cc9be12d8149461eedc8d6388f65e17179
6
+ metadata.gz: 267bc39cef40d450ec1be77ddeb0c279ef6b5b7f5cd8a3dd2afdb49f6a4b5fa32feb10622c84f0f2f85a3907b4fb05824ecfad0b517fcf4eacd0d4949423dc69
7
+ data.tar.gz: de72c74f898bdc9a3c70bf730158e2c642aa6b392935a3e89a6980a457262475c549f10380e0123e4a5b92c03ae9b27018bf7cb8aa919667256edd5639d70149
@@ -21,7 +21,7 @@ module Danger
21
21
  #
22
22
  # ### bitbucket server and bitrsie
23
23
  #
24
- # Danger will read the environemnt variable GIT_REPOSITORY_URL to construct the Bitbucket Server API URL
24
+ # Danger will read the environment variable GIT_REPOSITORY_URL to construct the Bitbucket Server API URL
25
25
  # finding the project and repo slug in the GIT_REPOSITORY_URL variable. This GIT_REPOSITORY_URL variable
26
26
  # comes from the App Settings tab for your Bitrsie App. If you are manually setting a repo URL in the
27
27
  # Git Clone Repo step, you may need to set adjust this propery in the settings tab, maybe even fake it.
@@ -48,13 +48,16 @@ module Danger
48
48
  def initialize(env)
49
49
  self.pull_request_id = env["BITRISE_PULL_REQUEST"]
50
50
  self.repo_url = env["GIT_REPOSITORY_URL"]
51
-
52
- if repo_url.include? ".com/"
53
- repo_matches = self.repo_url.match(%r{\.com/(.*)})[1].split(/\.git$|$/)[0]
54
- elsif repo_url.include? ".com:"
55
- repo_matches = self.repo_url.match(%r{\.com:(.*)})[1].split(/\.git$|$/)[0]
56
- end
57
51
 
52
+ matcher_url = self.repo_url
53
+
54
+ #If the URL contains https:// as :// leads to inaccurate matching. So we remove it and proceed to match.
55
+ if repo_url.include? "https://"
56
+ matcher_url["https://"] = ''
57
+ end
58
+
59
+ repo_matches = matcher_url.match(%r{([\/:])(([^\/]+\/)+[^\/]+?)(\.git$|$)})[2]
60
+
58
61
  self.repo_slug = repo_matches unless repo_matches.nil?
59
62
 
60
63
  end
@@ -3,25 +3,18 @@ require "danger/request_sources/github/github"
3
3
  module Danger
4
4
  # ### CI Setup
5
5
  #
6
- # You can use `danger/danger` Action in your .github/main.workflow.
6
+ # You can use `danger/danger` Action in your `.github/workflows/xxx.yml`.
7
+ # And so, you can use GITHUB_TOKEN secret as `DANGER_GITHUB_API_TOKEN` environment variable.
7
8
  #
8
9
  # ```
9
- # action "Danger" {
10
- # uses = "danger/danger"
11
- # }
10
+ # ...
11
+ # steps:
12
+ # - uses: actions/checkout@v1
13
+ # - uses: danger/danger@master
14
+ # env:
15
+ # DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
12
16
  # ```
13
17
  #
14
- # ### Token Setup
15
- #
16
- # Set DANGER_GITHUB_API_TOKEN to secrets, or you can also use GITHUB_TOKEN.
17
- #
18
- # ```
19
- # action "Danger" {
20
- # uses = "danger/danger"
21
- # secrets = ["GITHUB_TOKEN"]
22
- # }
23
- # ```
24
- #
25
18
  class GitHubActions < CI
26
19
  def self.validates_as_ci?(env)
27
20
  env.key? "GITHUB_ACTION"
@@ -2,7 +2,7 @@
2
2
  <%- table[:content].each do |violation| -%>
3
3
  <%= @emoji_mapper.map(table[:emoji]) if table[:emoji] %> <%= violation.message %>
4
4
  <%- end -%>
5
- <%- table[:resolved].each do |message| -%>
5
+ <%- table[:resolved] && table[:resolved].each do |message| -%>
6
6
  <%= @emoji_mapper.map("white_check_mark") %> <%= message %>
7
7
  <%- end -%>
8
8
  <%- end -%>
@@ -60,7 +60,6 @@ module Danger
60
60
  # that the core DSLs have, then starts looking at plugins support.
61
61
 
62
62
  # rubocop:disable Style/MethodMissing
63
-
64
63
  def method_missing(method_sym, *arguments, &_block)
65
64
  @core_plugins.each do |plugin|
66
65
  if plugin.public_methods(false).include?(method_sym)
@@ -243,16 +242,23 @@ module Danger
243
242
 
244
243
  def post_results(danger_id, new_comment, remove_previous_comments)
245
244
  violations = violation_report
246
-
247
- env.request_source.update_pull_request!(
248
- warnings: violations[:warnings].uniq,
249
- errors: violations[:errors].uniq,
250
- messages: violations[:messages].uniq,
251
- markdowns: status_report[:markdowns].uniq,
252
- danger_id: danger_id,
253
- new_comment: new_comment,
254
- remove_previous_comments: remove_previous_comments
255
- )
245
+ report = {
246
+ warnings: violations[:warnings].uniq,
247
+ errors: violations[:errors].uniq,
248
+ messages: violations[:messages].uniq,
249
+ markdowns: status_report[:markdowns].uniq,
250
+ danger_id: danger_id
251
+ }
252
+
253
+ if env.request_source.respond_to?(:update_pr_by_line!) && ENV["DANGER_MESSAGE_AGGREGATION"]
254
+ env.request_source.update_pr_by_line!(messages: MessageAggregator.aggregate(**report))
255
+ else
256
+ env.request_source.update_pull_request!(
257
+ **report,
258
+ new_comment: new_comment,
259
+ remove_previous_comments: remove_previous_comments
260
+ )
261
+ end
256
262
  end
257
263
 
258
264
  def setup_for_running(base_branch, head_branch)
@@ -0,0 +1,12 @@
1
+ class MessageAggregator
2
+ def self.aggregate(*args)
3
+ new(*args).aggregate
4
+ end
5
+
6
+ def initialize(warnings: [],
7
+ errors: [],
8
+ messages: [],
9
+ markdowns: [],
10
+ danger_id: "danger")
11
+ end
12
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Danger
4
+ class MessageGroup
5
+ def initialize(file: nil, line: nil)
6
+ @file = file
7
+ @line = line
8
+ end
9
+
10
+ # Returns whether this `MessageGroup` is for the same line of code as
11
+ # `other`, taking which file they are in to account.
12
+ # @param other [MessageGroup, Markdown, Violation]
13
+ # @return [Boolean] whether this `MessageGroup` is for the same line of code
14
+ def same_line?(other)
15
+ other.file == file && other.line == line
16
+ end
17
+
18
+ # Merges two `MessageGroup`s that represent the same line of code
19
+ # In future, perhaps `MessageGroup` will be able to represent a group of
20
+ # messages for multiple lines.
21
+ def merge(other)
22
+ raise ArgumentError, "Cannot merge with MessageGroup for a different line" unless same_line?(other)
23
+
24
+ @messages = (messages + other.messages).uniq
25
+ end
26
+
27
+ # Adds a message to the group.
28
+ # @param message [Markdown, Violation] the message to add
29
+ def <<(message)
30
+ # TODO: insertion sort
31
+ messages << message if same_line?(message)
32
+ end
33
+
34
+ # The list of messages in this group. This list will be sorted in decreasing
35
+ # order of severity (error, warning, message, markdown)
36
+ def messages
37
+ @messages ||= []
38
+ end
39
+
40
+ attr_reader :file, :line
41
+ end
42
+ end
@@ -0,0 +1,56 @@
1
+ module Danger
2
+ class BaseMessage
3
+ attr_accessor :message, :file, :line, :type
4
+
5
+ def initialize(type:, message:, file: nil, line: nil)
6
+ @type = type
7
+ @message = message
8
+ @file = file
9
+ @line = line
10
+ end
11
+
12
+ def compare_by_file_and_line(other)
13
+ order = cmp_nils(file, other.file)
14
+ return order unless order.nil?
15
+
16
+ order = file <=> other.file
17
+ return order unless order.zero?
18
+
19
+ order = cmp_nils(line, other.line)
20
+ return order unless order.nil?
21
+
22
+ line <=> other.line
23
+ end
24
+ # compares a and b based entirely on whether one or the other is nil
25
+ # arguments are in the same order as `a <=> b`
26
+ # nil is sorted earlier - so cmp_nils(nil, 1) => -1
27
+ #
28
+ # If neither are nil, rather than returning `a <=> b` which would seem
29
+ # like the obvious shortcut, `nil` is returned.
30
+ # This allows us to distinguish between cmp_nils returning 0 for a
31
+ # comparison of filenames, which means "a comparison on the lines is
32
+ # meaningless - you cannot have a line number for a nil file - so they
33
+ # should be sorted the same", and a <=> b returning 0, which means "the
34
+ # files are the same, so compare on the lines"
35
+ #
36
+ # @return 0, 1, -1, or nil
37
+ def cmp_nils(a, b)
38
+ if a.nil? && b.nil?
39
+ 0
40
+ elsif a.nil?
41
+ -1
42
+ elsif b.nil?
43
+ 1
44
+ end
45
+ end
46
+
47
+ def eql?(other)
48
+ return self == other
49
+ end
50
+
51
+ # @return [Boolean] returns true if is a file or line, false otherwise
52
+ def inline?
53
+ file || line
54
+ end
55
+ end
56
+ end
@@ -1,11 +1,11 @@
1
+ # frozen_string_literal: true
2
+ require "danger/danger_core/messages/base"
3
+
1
4
  module Danger
2
- class Markdown
3
- attr_accessor :message, :file, :line
5
+ class Markdown < BaseMessage
4
6
 
5
7
  def initialize(message, file = nil, line = nil)
6
- self.message = message
7
- self.file = file
8
- self.line = line
8
+ super(type: :markdown, message: message, file: file, line: line)
9
9
  end
10
10
 
11
11
  def ==(other)
@@ -25,15 +25,6 @@ module Danger
25
25
  h
26
26
  end
27
27
 
28
- def eql?(other)
29
- return self == other
30
- end
31
-
32
- # @return [Boolean] returns true if is a file or line, false otherwise
33
- def inline?
34
- file || line
35
- end
36
-
37
28
  def to_s
38
29
  extra = []
39
30
  extra << "file: #{file}" unless file
@@ -41,5 +32,11 @@ module Danger
41
32
 
42
33
  "Markdown #{message} { #{extra.join ', '.freeze} }"
43
34
  end
35
+
36
+ def <=>(other)
37
+ return 1 if other.type != :markdown
38
+
39
+ compare_by_file_and_line(other)
40
+ end
44
41
  end
45
42
  end
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "danger/danger_core/messages/base"
4
+
1
5
  module Danger
2
- class Violation
3
- attr_accessor :message, :sticky, :file, :line
6
+ class Violation < BaseMessage
7
+ VALID_TYPES = %I[error warning message].freeze
8
+ attr_accessor :sticky
4
9
 
5
- def initialize(message, sticky, file = nil, line = nil)
6
- self.message = message
10
+ def initialize(message, sticky, file = nil, line = nil, type: :warning)
11
+ raise ArgumentError unless VALID_TYPES.include?(type)
12
+
13
+ super(type: type, message: message, file: file, line: line)
7
14
  self.sticky = sticky
8
- self.file = file
9
- self.line = line
10
15
  end
11
16
 
12
17
  def ==(other)
@@ -28,13 +33,12 @@ module Danger
28
33
  h
29
34
  end
30
35
 
31
- def eql?(other)
32
- return self == other
33
- end
36
+ def <=>(other)
37
+ types = VALID_TYPES + [:markdown]
38
+ order = types.index(type) <=> types.index(other.type)
39
+ return order unless order.zero?
34
40
 
35
- # @return [Boolean] returns true if is a file or line, false otherwise
36
- def inline?
37
- file || line
41
+ compare_by_file_and_line(other)
38
42
  end
39
43
 
40
44
  def to_s
@@ -42,6 +46,7 @@ module Danger
42
46
  extra << "sticky: #{sticky}"
43
47
  extra << "file: #{file}" if file
44
48
  extra << "line: #{line}" if line
49
+ extra << "type: #{type}"
45
50
 
46
51
  "Violation #{message} { #{extra.join ', '.freeze} }"
47
52
  end
@@ -124,7 +124,7 @@ module Danger
124
124
  line = options.fetch(:line, nil)
125
125
 
126
126
  messages.flatten.each do |message|
127
- @messages << Violation.new(message, sticky, file, line) if message
127
+ @messages << Violation.new(message, sticky, file, line, type: :message) if message
128
128
  end
129
129
  end
130
130
 
@@ -149,7 +149,7 @@ module Danger
149
149
 
150
150
  warnings.flatten.each do |warning|
151
151
  next if should_ignore_violation(warning)
152
- @warnings << Violation.new(warning, sticky, file, line) if warning
152
+ @warnings << Violation.new(warning, sticky, file, line, type: :warning) if warning
153
153
  end
154
154
  end
155
155
 
@@ -174,7 +174,7 @@ module Danger
174
174
 
175
175
  failures.flatten.each do |failure|
176
176
  next if should_ignore_violation(failure)
177
- @errors << Violation.new(failure, sticky, file, line) if failure
177
+ @errors << Violation.new(failure, sticky, file, line, type: :error) if failure
178
178
  end
179
179
  end
180
180
 
@@ -104,7 +104,7 @@ module Danger
104
104
  )
105
105
  end
106
106
 
107
- def generate_inline_comment_body(emoji, message, danger_id: "danger", resolved: [], template: "github")
107
+ def generate_inline_comment_body(emoji, message, danger_id: "danger", resolved: false, template: "github")
108
108
  apply_template(
109
109
  tables: [{ content: [message], resolved: resolved, emoji: emoji }],
110
110
  danger_id: danger_id,
@@ -1,4 +1,4 @@
1
1
  module Danger
2
- VERSION = "6.3.1".freeze
2
+ VERSION = "6.3.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: 6.3.1
4
+ version: 6.3.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: 2020-03-03 00:00:00.000000000 Z
12
+ date: 2020-03-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: claide
@@ -262,6 +262,9 @@ files:
262
262
  - lib/danger/danger_core/dangerfile_generator.rb
263
263
  - lib/danger/danger_core/environment_manager.rb
264
264
  - lib/danger/danger_core/executor.rb
265
+ - lib/danger/danger_core/message_aggregator.rb
266
+ - lib/danger/danger_core/message_group.rb
267
+ - lib/danger/danger_core/messages/base.rb
265
268
  - lib/danger/danger_core/messages/markdown.rb
266
269
  - lib/danger/danger_core/messages/violation.rb
267
270
  - lib/danger/danger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb