gitlab-dangerfiles 0.8.0 → 1.1.1

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: f2fca983a5c97d75dbd16b7689b26ed93a12ae5ea1781ce7bac4787f7ed2a6d3
4
- data.tar.gz: f24ee73b3ee86de8ee2f447db04ca4cf46dda59d3711d85fd27fad002a2644f3
3
+ metadata.gz: f5e1069be5416d6980879af3330451834b57881c46101119bfc5917e2057edd7
4
+ data.tar.gz: e911c514f8d32d65e4aecef6ad111c80c808dd273b12775d57438532ba8a05b3
5
5
  SHA512:
6
- metadata.gz: 5a04e545969282bbc1561201db8ba45e1677dedc2ccd5ac35fcd8b069366906d66f79ff8d0b2ecd73e0bca064d5b158cfd40790df28e33df160c8f97f125b1b4
7
- data.tar.gz: bc7f08b1508e130491cc860b96947cf6ccac0e03a0cb577118399f391f7997c5e69e82db4658fd845b039b92cea8c6ab0ada5337f044cc9bea79a2bb66d4e58b
6
+ metadata.gz: b3814724620240a6485ffce4191fb8a2461c267dda5dad2466b6dc5173fbe848b66cae92aaea69ef82a49dd4726db3a7e77c106fdbd73ea58738eaf4613c4cba
7
+ data.tar.gz: 0fcabbe03f856d29951ae2f35e9f6f9784fa22af8d8d6bfa13a41452b4a1c35a454135751443882e6a2762325ef05dd6b8bd1b3dde58c5c7661db65ffef4c5d7
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
28
  spec.require_paths = ["lib"]
29
29
 
30
- spec.add_dependency "danger"
30
+ spec.add_dependency "danger-gitlab"
31
31
 
32
32
  spec.add_development_dependency "rspec", "~> 3.0"
33
33
  spec.add_development_dependency "rspec-parameterized"
@@ -2,10 +2,10 @@
2
2
 
3
3
  require "net/http"
4
4
  require "json"
5
- require "danger"
6
- require_relative "../gitlab/dangerfiles/changes"
7
- require_relative "../gitlab/dangerfiles/teammate"
8
- require_relative "../gitlab/dangerfiles/title_linting"
5
+
6
+ require_relative "../../gitlab/dangerfiles/changes"
7
+ require_relative "../../gitlab/dangerfiles/teammate"
8
+ require_relative "../../gitlab/dangerfiles/title_linting"
9
9
 
10
10
  module Danger
11
11
  # Common helper functions for our danger scripts.
@@ -19,6 +19,7 @@ module Danger
19
19
  test: "~test ~Quality for `spec/features/*`",
20
20
  engineering_productivity: '~"Engineering Productivity" for CI, Danger',
21
21
  ci_template: '~"ci::templates"',
22
+ product_intelligence: '~"product intelligence"',
22
23
  }.freeze
23
24
 
24
25
  HTTPError = Class.new(StandardError)
@@ -51,8 +52,62 @@ module Danger
51
52
  JSON.parse(rsp.body)
52
53
  end
53
54
 
55
+ def added_files
56
+ @added_files ||= if changes_from_api
57
+ changes_from_api.select { |file| file["new_file"] }.map { |file| file["new_path"] }
58
+ else
59
+ git.added_files.to_a
60
+ end
61
+ end
62
+
63
+ def modified_files
64
+ @modified_files ||= if changes_from_api
65
+ changes_from_api.select { |file| !file["new_file"] && !file["deleted_file"] && !file["renamed_file"] }.map { |file| file["new_path"] }
66
+ else
67
+ git.modified_files.to_a
68
+ end
69
+ end
70
+
71
+ def renamed_files
72
+ @renamed_files ||= if changes_from_api
73
+ changes_from_api.select { |file| file["renamed_file"] }.each_with_object([]) do |file, memo|
74
+ memo << { before: file["old_path"], after: file["new_path"] }
75
+ end
76
+ else
77
+ git.renamed_files.to_a
78
+ end
79
+ end
80
+
81
+ def deleted_files
82
+ @deleted_files ||= if changes_from_api
83
+ changes_from_api.select { |file| file["deleted_file"] }.map { |file| file["new_path"] }
84
+ else
85
+ git.deleted_files.to_a
86
+ end
87
+ end
88
+
89
+ def diff_for_file(filename)
90
+ if changes_from_api
91
+ changes_hash = changes_from_api.find { |file| file["new_path"] == filename }
92
+ changes_hash["diff"] if changes_hash
93
+ else
94
+ git.diff_for_file(filename)&.patch
95
+ end
96
+ end
97
+
98
+ def changes_from_api
99
+ return nil unless ci?
100
+ return nil if defined?(@force_changes_from_git)
101
+
102
+ @changes_from_api ||= gitlab_helper.mr_changes.to_h["changes"]
103
+ rescue
104
+ # Fallback to the Git strategy in any case
105
+ @force_changes_from_git = true
106
+ nil
107
+ end
108
+
54
109
  # Returns a list of all files that have been added, modified or renamed.
55
- # `git.modified_files` might contain paths that already have been renamed,
110
+ # `modified_files` might contain paths that already have been renamed,
56
111
  # so we need to remove them from the list.
57
112
  #
58
113
  # Considering these changes:
@@ -70,10 +125,10 @@ module Danger
70
125
  # @return [Array<String>]
71
126
  def all_changed_files
72
127
  Set.new
73
- .merge(git.added_files.to_a)
74
- .merge(git.modified_files.to_a)
75
- .merge(git.renamed_files.map { |x| x[:after] })
76
- .subtract(git.renamed_files.map { |x| x[:before] })
128
+ .merge(added_files)
129
+ .merge(modified_files)
130
+ .merge(renamed_files.map { |x| x[:after] })
131
+ .subtract(renamed_files.map { |x| x[:before] })
77
132
  .to_a
78
133
  .sort
79
134
  end
@@ -87,10 +142,10 @@ module Danger
87
142
  # "+ # Test change",
88
143
  # "- # Old change" ]
89
144
  def changed_lines(changed_file)
90
- diff = git.diff_for_file(changed_file)
145
+ diff = diff_for_file(changed_file)
91
146
  return [] unless diff
92
147
 
93
- diff.patch.split("\n").select { |line| %r{^[+-]}.match?(line) }
148
+ diff.split("\n").select { |line| %r{^[+-]}.match?(line) }
94
149
  end
95
150
 
96
151
  def release_automation?
@@ -117,23 +172,23 @@ module Danger
117
172
  # @return [Gitlab::Dangerfiles::Changes]
118
173
  def changes(categories)
119
174
  Gitlab::Dangerfiles::Changes.new([]).tap do |changes|
120
- git.added_files.each do |file|
175
+ added_files.each do |file|
121
176
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :added, category) }
122
177
  end
123
178
 
124
- git.modified_files.each do |file|
179
+ modified_files.each do |file|
125
180
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :modified, category) }
126
181
  end
127
182
 
128
- git.deleted_files.each do |file|
183
+ deleted_files.each do |file|
129
184
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :deleted, category) }
130
185
  end
131
186
 
132
- git.renamed_files.map { |x| x[:before] }.each do |file|
187
+ renamed_files.map { |x| x[:before] }.each do |file|
133
188
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :renamed_before, category) }
134
189
  end
135
190
 
136
- git.renamed_files.map { |x| x[:after] }.each do |file|
191
+ renamed_files.map { |x| x[:after] }.each do |file|
137
192
  categories_for_file(file, categories).each { |category| changes << Gitlab::Dangerfiles::Change.new(file, :renamed_after, category) }
138
193
  end
139
194
  end
@@ -169,31 +224,43 @@ module Danger
169
224
  end
170
225
 
171
226
  def mr_iid
172
- return "" unless gitlab_helper
227
+ return "" unless ci?
173
228
 
174
229
  gitlab_helper.mr_json["iid"]
175
230
  end
176
231
 
232
+ def mr_author
233
+ return `whoami`.strip unless ci?
234
+
235
+ gitlab_helper.mr_author
236
+ end
237
+
177
238
  def mr_title
178
- return "" unless gitlab_helper
239
+ return "" unless ci?
179
240
 
180
241
  gitlab_helper.mr_json["title"]
181
242
  end
182
243
 
183
244
  def mr_web_url
184
- return "" unless gitlab_helper
245
+ return "" unless ci?
185
246
 
186
247
  gitlab_helper.mr_json["web_url"]
187
248
  end
188
249
 
189
250
  def mr_labels
190
- return [] unless gitlab_helper
251
+ return [] unless ci?
191
252
 
192
253
  gitlab_helper.mr_labels
193
254
  end
194
255
 
256
+ def mr_source_branch
257
+ return `git rev-parse --abbrev-ref HEAD`.strip unless ci?
258
+
259
+ gitlab_helper.mr_json["source_branch"]
260
+ end
261
+
195
262
  def mr_target_branch
196
- return "" unless gitlab_helper
263
+ return "" unless ci?
197
264
 
198
265
  gitlab_helper.mr_json["target_branch"]
199
266
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../gitlab/dangerfiles/teammate"
4
- require_relative "../gitlab/dangerfiles/weightage/maintainers"
5
- require_relative "../gitlab/dangerfiles/weightage/reviewers"
3
+ require_relative "../../gitlab/dangerfiles/teammate"
4
+ require_relative "../../gitlab/dangerfiles/weightage/maintainers"
5
+ require_relative "../../gitlab/dangerfiles/weightage/reviewers"
6
6
 
7
7
  module Danger
8
8
  # Common helper functions for our danger scripts. See Danger::Helper
@@ -18,14 +18,14 @@ module Danger
18
18
  Spin = Struct.new(:category, :reviewer, :maintainer, :optional_role, :timezone_experiment)
19
19
 
20
20
  def team_mr_author
21
- team.find { |person| person.username == mr_author_username }
21
+ team.find { |person| person.username == helper.mr_author }
22
22
  end
23
23
 
24
24
  # Assigns GitLab team members to be reviewer and maintainer
25
25
  # for each change category that a Merge Request contains.
26
26
  #
27
27
  # @return [Array<Spin>]
28
- def spin(project, categories, timezone_experiment: false)
28
+ def spin(project, categories = [nil], timezone_experiment: false)
29
29
  spins = categories.sort.map do |category|
30
30
  including_timezone = INCLUDE_TIMEZONE_FOR_CATEGORY.fetch(category, timezone_experiment)
31
31
 
@@ -59,6 +59,8 @@ module Danger
59
59
  # Fetch an already picked backend maintainer, or pick one otherwise
60
60
  spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
61
61
  end
62
+ when :product_intelligence
63
+ spin.optional_role = :maintainer
62
64
  end
63
65
  end
64
66
 
@@ -119,21 +121,7 @@ module Danger
119
121
  # @param [Teammate] person
120
122
  # @return [Boolean]
121
123
  def mr_author?(person)
122
- person.username == mr_author_username
123
- end
124
-
125
- def mr_author_username
126
- helper.gitlab_helper&.mr_author || `whoami`
127
- end
128
-
129
- def mr_source_branch
130
- return `git rev-parse --abbrev-ref HEAD` unless helper.gitlab_helper&.mr_json
131
-
132
- helper.gitlab_helper.mr_json["source_branch"]
133
- end
134
-
135
- def mr_labels
136
- helper.gitlab_helper&.mr_labels || []
124
+ person.username == helper.mr_author
137
125
  end
138
126
 
139
127
  def new_random(seed)
@@ -142,7 +130,7 @@ module Danger
142
130
 
143
131
  def spin_role_for_category(team, role, project, category)
144
132
  team.select do |member|
145
- member.public_send("#{role}?", project, category, mr_labels) # rubocop:disable GitlabSecurity/PublicSend
133
+ member.public_send("#{role}?", project, category, helper.mr_labels) # rubocop:disable GitlabSecurity/PublicSend
146
134
  end
147
135
  end
148
136
 
@@ -153,7 +141,7 @@ module Danger
153
141
  spin_role_for_category(team, role, project, category)
154
142
  end
155
143
 
156
- random = new_random(mr_source_branch)
144
+ random = new_random(helper.mr_source_branch)
157
145
 
158
146
  weighted_reviewers = Gitlab::Dangerfiles::Weightage::Reviewers.new(reviewers, traintainers).execute
159
147
  weighted_maintainers = Gitlab::Dangerfiles::Weightage::Maintainers.new(maintainers).execute
@@ -3,7 +3,7 @@ require "gitlab/dangerfiles/version"
3
3
  module Gitlab
4
4
  module Dangerfiles
5
5
  def self.import_plugins(danger)
6
- danger.import_plugin(File.expand_path("../danger/*.rb", __dir__))
6
+ danger.import_plugin(File.expand_path("../danger/plugins/*.rb", __dir__))
7
7
  end
8
8
  end
9
9
  end
@@ -59,7 +59,7 @@ module Gitlab
59
59
  private
60
60
 
61
61
  def subject
62
- TitleLinting.remove_draft_flag(message_parts[0])
62
+ @subject ||= TitleLinting.remove_draft_flag(message_parts[0])
63
63
  end
64
64
 
65
65
  def subject_too_short?
@@ -75,6 +75,7 @@ module Gitlab
75
75
  end
76
76
 
77
77
  def subject_starts_with_lowercase?
78
+ return false if subject.empty?
78
79
  return false if ("A".."Z").cover?(subject[0])
79
80
 
80
81
  first_char = subject.sub(/\A(\[.+\]|\w+:)\s/, "")[0]
@@ -45,17 +45,63 @@ end
45
45
 
46
46
  RSpec.shared_context "with dangerfile" do
47
47
  let(:dangerfile) { DangerSpecHelper.testing_dangerfile }
48
- let(:added_files) { %w[added1] }
49
- let(:modified_files) { %w[modified1] }
50
- let(:deleted_files) { %w[deleted1] }
51
- let(:renamed_before_file) { "renamed_before" }
52
- let(:renamed_after_file) { "renamed_after" }
48
+ let(:added_files) { %w[added-from-git] }
49
+ let(:modified_files) { %w[modified-from-git] }
50
+ let(:deleted_files) { %w[deleted-from-git] }
51
+ let(:renamed_before_file) { "renamed_before-from-git" }
52
+ let(:renamed_after_file) { "renamed_after-from-git" }
53
53
  let(:renamed_files) { [{ before: renamed_before_file, after: renamed_after_file }] }
54
54
  let(:change_class) { Gitlab::Dangerfiles::Change }
55
55
  let(:changes_class) { Gitlab::Dangerfiles::Changes }
56
56
  let(:changes) { changes_class.new([]) }
57
57
  let(:mr_title) { "Fake Title" }
58
58
  let(:mr_labels) { [] }
59
+ let(:mr_changes_from_api) do
60
+ {
61
+ "changes" => [
62
+ {
63
+ "old_path" => "added-from-api",
64
+ "new_path" => "added-from-api",
65
+ "a_mode" => "100644",
66
+ "b_mode" => "100644",
67
+ "new_file" => true,
68
+ "renamed_file" => false,
69
+ "deleted_file" => false,
70
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
71
+ },
72
+ {
73
+ "old_path" => "modified-from-api",
74
+ "new_path" => "modified-from-api",
75
+ "a_mode" => "100644",
76
+ "b_mode" => "100644",
77
+ "new_file" => false,
78
+ "renamed_file" => false,
79
+ "deleted_file" => false,
80
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
81
+ },
82
+ {
83
+ "old_path" => "renamed_before-from-api",
84
+ "new_path" => "renamed_after-from-api",
85
+ "a_mode" => "100644",
86
+ "b_mode" => "100644",
87
+ "new_file" => false,
88
+ "renamed_file" => true,
89
+ "deleted_file" => false,
90
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
91
+ },
92
+ {
93
+ "old_path" => "deleted-from-api",
94
+ "new_path" => "deleted-from-api",
95
+ "a_mode" => "100644",
96
+ "b_mode" => "100644",
97
+ "new_file" => false,
98
+ "renamed_file" => false,
99
+ "deleted_file" => true,
100
+ "diff" => "@@ -49,6 +49,14 @@\n- vendor/ruby/\n policy: pull\n \n+.danger-review-cache:\n",
101
+ },
102
+ ],
103
+ }
104
+ end
59
105
 
60
106
  let(:fake_git) { double("fake-git", added_files: added_files, modified_files: modified_files, deleted_files: deleted_files, renamed_files: renamed_files) }
61
107
  let(:fake_helper) { double("fake-helper", changes: changes, mr_iid: 1234, mr_title: mr_title, mr_labels: mr_labels) }
@@ -101,6 +101,13 @@ module Gitlab
101
101
  return true if capabilities(project).include?("#{kind} engineering_productivity")
102
102
 
103
103
  capabilities(project).include?("#{kind} backend")
104
+ when :product_intelligence
105
+ return false unless role[/Engineer, Product Intelligence/]
106
+
107
+ # any reviewer of project from Product Intelligence team can review MR
108
+ kind == :reviewer && capabilities(project).any?
109
+ when nil
110
+ capabilities(project).include?("#{kind}")
104
111
  else
105
112
  capabilities(project).include?("#{kind} #{category}")
106
113
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "0.8.0"
3
+ VERSION = "1.1.1"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-dangerfiles
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rémy Coutable
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-09 00:00:00.000000000 Z
11
+ date: 2021-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: danger
14
+ name: danger-gitlab
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
@@ -130,8 +130,8 @@ files:
130
130
  - fixtures/emojis/aliases.json
131
131
  - fixtures/emojis/digests.json
132
132
  - gitlab-dangerfiles.gemspec
133
- - lib/danger/helper.rb
134
- - lib/danger/roulette.rb
133
+ - lib/danger/plugins/helper.rb
134
+ - lib/danger/plugins/roulette.rb
135
135
  - lib/gitlab-dangerfiles.rb
136
136
  - lib/gitlab/Dangerfile
137
137
  - lib/gitlab/dangerfiles.rb