gitlab-dangerfiles 4.9.3 → 4.10.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: 8cbb5261eaf8bbbfa1b29d6a61899f9c51842b9e78163cff2d4594aef4ff39e6
4
- data.tar.gz: 90871d71ce7905d33a83ddcfeff2f9769d539d3811cda951982fbe06b7bcd200
3
+ metadata.gz: dc6047699d31bc320127f651d567ddf984b6189eeeb7646eb4f0d46b4185e9fd
4
+ data.tar.gz: 655da17704203a02f6f138b8493bb8cf2002c2121d1015a63da0677ebf23b48d
5
5
  SHA512:
6
- metadata.gz: 3f5b6f291c53680a0b46b8821270adc30f3e241579fd88ad525984b78740fdaafbb3fcaf627ef1d4d7cfda20b79b3e26a6b16b41f0eeeedba99d7405648819b0
7
- data.tar.gz: 9941183c8365d7152b2367aa3060b5fd85e8b7cf6fbeae441d31b387d332e672b9b6a28cfdad2ccda2b63d3d3eec599535ea9113bfbcebab890de656ec26fb97
6
+ metadata.gz: 02613c71246a09f46d15e0117e3f304ae626618c5736ff9b02f5e15bfbeccaa4921cefa694c97548dc5af2f4611866b58eb29f9eb5e0305d7412461097980a2c
7
+ data.tar.gz: 6703f6fe3502ad2336c33a4296a67d3e7d77d0dd9e46db97f510f0bd4c17a729f1bb20afcbb4ab6a0d5b24da477e4e50378e76cb943b9fc474fbed29320e619b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gitlab-dangerfiles (4.9.3)
4
+ gitlab-dangerfiles (4.10.0)
5
5
  danger (>= 9.3.0)
6
6
  danger-gitlab (>= 8.0.0)
7
7
  rake (~> 13.0)
data/README.md CHANGED
@@ -202,6 +202,28 @@ project. To use it in your project, perform the following steps:
202
202
  dangerfiles.import_dangerfiles(only: %w[simple_roulette])
203
203
  end
204
204
  ```
205
+
206
+ ##### Auto-assignment
207
+
208
+ By default, the simple roulette only suggests reviewers in a comment. You can, optionally, configure it to automatically assign reviewers from the roulette to your merge requests.
209
+
210
+ Configure `auto_assign_for_roulette_roles` to specify which roles to assign (`:reviewer`, `:maintainer`, or both). If empty (default), no auto-assignment occurs.
211
+
212
+ Optionally, configure `auto_assign_for_roulette_labels` to only auto-assign for Merge Requests with specific labels. If empty (default), auto-assignment applies to all MRs.
213
+
214
+ ###### Examples
215
+
216
+ ``` ruby
217
+ # Auto-assign reviewers for all MRs
218
+ helper.config.auto_assign_for_roulette_roles = [:reviewer]
219
+
220
+ # Auto-assign both reviewer and maintainer for all MRs
221
+ helper.config.auto_assign_for_roulette_roles = [:reviewer, :maintainer]
222
+
223
+ # Auto-assign reviewers only for a specific MR label
224
+ helper.config.auto_assign_for_roulette_roles = [:reviewer]
225
+ helper.config.auto_assign_for_roulette_labels = ["maintenance::dependency"]
226
+ ```
205
227
 
206
228
  ##### Available configurations
207
229
 
@@ -87,6 +87,35 @@ module Danger
87
87
  Gitlab::Dangerfiles::Teammate.warnings
88
88
  end
89
89
 
90
+ # Automatically assigns reviewers from roulette spins if configured to do so
91
+ #
92
+ # @param spins [Array<Spin>] The roulette spins to potentially assign from
93
+ def assign_reviewers_from_roulette(spins)
94
+ return if helper.mr_reviewers.any?
95
+
96
+ reviewers_to_assign = find_reviewers_to_assign(spins)
97
+
98
+ if reviewers_to_assign.any?
99
+ post_assignment_message(reviewers_to_assign)
100
+ else
101
+ warn("No reviewers available for assignment")
102
+ end
103
+ end
104
+
105
+ # Determines if auto-assignment should happen based on configuration
106
+ #
107
+ # @return [Boolean]
108
+ def auto_assign_reviewers?
109
+ return false if helper.config.auto_assign_for_roulette_roles.empty?
110
+
111
+ configured_labels = helper.config.auto_assign_for_roulette_labels
112
+
113
+ return true if configured_labels.empty?
114
+
115
+ mr_labels = helper.mr_labels
116
+ configured_labels.any? { |label| mr_labels.include?(label) }
117
+ end
118
+
90
119
  private
91
120
 
92
121
  def ux_fallback_reviewer
@@ -158,5 +187,41 @@ module Danger
158
187
  def labels
159
188
  @labels ||= helper.mr_labels
160
189
  end
190
+
191
+ # Find reviewers to assign based on configured roles
192
+ #
193
+ # @param spins [Array<Spin>] The roulette spins
194
+ # @return [Array<String>] Array of usernames to assign
195
+ def find_reviewers_to_assign(spins)
196
+ roles_to_assign = helper.config.auto_assign_for_roulette_roles
197
+ reviewers_to_assign = []
198
+
199
+ spins.each do |spin|
200
+ if roles_to_assign.include?(:reviewer) && spin.reviewer&.username
201
+ reviewers_to_assign << spin.reviewer.username
202
+ end
203
+
204
+ if roles_to_assign.include?(:maintainer) && spin.maintainer&.username
205
+ reviewers_to_assign << spin.maintainer.username
206
+ end
207
+
208
+ if reviewers_to_assign.any?
209
+ break
210
+ end
211
+ end
212
+
213
+ reviewers_to_assign
214
+ end
215
+
216
+ # Posts the assignment message with the selected reviewers
217
+ #
218
+ # @param reviewers_to_assign [Array<String>] Array of usernames to assign
219
+ def post_assignment_message(reviewers_to_assign)
220
+ role_text = helper.config.auto_assign_for_roulette_roles.map(&:to_s).join(' and ')
221
+ message = "🎲 Assigned #{role_text}s based on reviewer roulette.\n/assign_reviewer #{reviewers_to_assign.map { |u| "@#{u}" }.join(' ')}"
222
+ markdown(message)
223
+ rescue StandardError => e
224
+ warn("Failed to assign reviewers: #{e.message}")
225
+ end
161
226
  end
162
227
  end
@@ -8,9 +8,6 @@ MESSAGE = <<MARKDOWN
8
8
  Changes that require review have been detected! A merge request is normally
9
9
  reviewed by both a reviewer and a maintainer in its primary category and by a
10
10
  maintainer in all other categories.
11
- MARKDOWN
12
-
13
- TABLE_MARKDOWN = <<MARKDOWN
14
11
 
15
12
  To spread load more evenly across eligible reviewers, Danger has picked a candidate for each
16
13
  review slot. Feel free to
@@ -26,9 +23,11 @@ Please consider assigning a reviewer or maintainer who is a
26
23
  [domain expert](https://about.gitlab.com/handbook/engineering/projects/##{PROJECT_NAME})
27
24
  in the area of the merge request.
28
25
 
26
+ MARKDOWN
27
+
28
+ NO_AUTO_ASSIGN = <<MARKDOWN
29
29
  Once you've decided who will review this merge request, mention them as you
30
30
  normally would! Danger does not automatically notify them for you.
31
-
32
31
  MARKDOWN
33
32
 
34
33
  TABLE_HEADER_WITH_CATEGORIES = <<MARKDOWN
@@ -101,5 +100,11 @@ if changes.any?
101
100
 
102
101
  markdown(format(WARNING_MESSAGE, warnings: warnings)) if warnings
103
102
 
104
- markdown(TABLE_MARKDOWN + table_header + rows.join("\n")) unless rows.empty?
103
+ markdown(table_header + rows.join("\n")) unless rows.empty?
104
+
105
+ if roulette.auto_assign_reviewers?
106
+ roulette.assign_reviewers_from_roulette(random_roulette_spins)
107
+ else
108
+ markdown(NO_AUTO_ASSIGN)
109
+ end
105
110
  end
@@ -55,6 +55,14 @@ module Gitlab
55
55
  # @return [Array] indicating which required codeowners sections should be excluded from roulette. Default to `[]`.
56
56
  attr_accessor :excluded_required_codeowners_sections_for_roulette
57
57
 
58
+ # @!attribute auto_assign_for_roulette_roles
59
+ # @return [Array<Symbol>] which roles to auto assign as reviewers, given roulette recommendations (:reviewer, :maintainer, or both). If empty, auto-assignment is disabled. Default to `[]`.
60
+ attr_accessor :auto_assign_for_roulette_roles
61
+
62
+ # @!attribute auto_assign_for_roulette_labels
63
+ # @return [Array<String>] MR labels that allow auto reviewer assignment. If empty, applies to all MRs, provided :auto_assign_for_roulette_roles is not empty. Default to `[]`.
64
+ attr_accessor :auto_assign_for_roulette_labels
65
+
58
66
  DEFAULT_CHANGES_SIZE_THRESHOLDS = { high: 2_000, medium: 500 }.freeze
59
67
  DEFAULT_COMMIT_MESSAGES_MAX_COMMITS_COUNT = 10
60
68
 
@@ -69,6 +77,8 @@ module Gitlab
69
77
  @disabled_roulette_categories = []
70
78
  @included_optional_codeowners_sections_for_roulette = []
71
79
  @excluded_required_codeowners_sections_for_roulette = []
80
+ @auto_assign_for_roulette_roles = []
81
+ @auto_assign_for_roulette_labels = []
72
82
  @duo_code_review = :optional
73
83
  end
74
84
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "4.9.3"
3
+ VERSION = "4.10.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gitlab-dangerfiles
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.9.3
4
+ version: 4.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-07-24 00:00:00.000000000 Z
11
+ date: 2025-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake