gitlab-dangerfiles 3.9.0 → 3.11.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: 5759d8762183090115e7cb10b4b2d7244735d3225b53966c8feaf28e9d9eee7e
4
- data.tar.gz: f49d06c663430072bad4c4f05b8bd1f509ca2c1a095bd1e499e3870fbe061fc9
3
+ metadata.gz: 2ee27fb91564bfb45f28aed3fca576c6731c91ae9f69719e2ebb0ce5807ff1ee
4
+ data.tar.gz: 3bcd268c5fc1a91141a447ff6bb1b0c63841fe4dab2c65fffc61c7c488048275
5
5
  SHA512:
6
- metadata.gz: 3cd96f3ceb33c2a028f62b1f72a16196ee1afa3768f0463783262ce3a4bd1d98d85e9ab905a916c0ad27cf7bfaf2c16608c5d533e07c30b6463807122d711f09
7
- data.tar.gz: 253aa1b4a8a31c2c323ff05fbad3e2f613b932c82a5f1d61505e92966c1bfe7c593d17bae094f6ebd59b5568433d93d83e443b16df7c75d1b257d1015834a405
6
+ metadata.gz: d5cab2d3171779a9f28c00452e4e0435a6aa93852d80847b4da3b03f38fe294e7c855232b1402d6f3ac14f99b04518993b5fb6401da928ed9189f86a44948769
7
+ data.tar.gz: dc580aa4781087b6598c8d4f2befb2fec6b9d87ae4ce964227b35a4fbc537c62f2bad0e4d947a65154753157a896cb890472be33d99f0e15463d63beed17b6ee
@@ -2,7 +2,7 @@
2
2
  commit from this merge request, and `<NEW_VERSION>` with the upcoming version number. -->
3
3
  ## Diff
4
4
 
5
- https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/compare/v<PREVIOUS_VERSION>...<COMMIT_UPDATING_VERSION>
5
+ https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/compare/v<PREVIOUS_VERSION>...<COMMIT_UPDATING_VERSION>
6
6
 
7
7
  ## Checklist
8
8
 
data/README.md CHANGED
@@ -218,17 +218,32 @@ danger-review:
218
218
  - bundle add gitlab-dangerfiles --version 3.1.0
219
219
  ```
220
220
 
221
- ## Rake tasks
221
+ ## Local Danger Rake task
222
222
 
223
- You can import this gem's Rake tasks by adding the following to your project's `Rakefile`:
223
+ You can run a Danger Rake task locally in a project to detect Danger errors before pushing commits to a remote
224
+ branch.
224
225
 
225
- ```ruby
226
- require 'gitlab-dangerfiles'
226
+ 1. [Install `gitlab-dangerfiles`](#installation) in your project.
227
+ 1. Add the following to your project's `Rakefile`:
228
+
229
+ ```ruby
230
+ require 'gitlab-dangerfiles'
231
+
232
+ Gitlab::Dangerfiles.load_tasks
233
+ ```
234
+
235
+ To run the Danger Rake task in a project that has `master` as the default branch, run:
227
236
 
228
- Gitlab::Dangerfiles.load_tasks
237
+ ```shell
238
+ bundle exec rake danger_local
229
239
  ```
230
240
 
231
- That will add the `danger_local` Rake task that allows to run Danger locally.
241
+ To run the Danger Rake task in a project that doesn't have `master` as the default branch, you must set the
242
+ `DANGER_LOCAL_BASE` environment variable. For example, in a project with `main` as the default branch:
243
+
244
+ ```shell
245
+ DANGER_LOCAL_BASE="origin/main" bundle exec rake danger_local
246
+ ```
232
247
 
233
248
  ## Documentation
234
249
 
@@ -264,6 +279,12 @@ end
264
279
 
265
280
  See an [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92580) for more details.
266
281
 
282
+ ## Contributing
283
+
284
+ Bug reports and merge requests are welcome at https://gitlab.com/gitlab-org/gitlab-dangerfiles. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://gitlab.com/gitlab-org/gitlab-dangerfiles/blob/master/CODE_OF_CONDUCT.md).
285
+
286
+ Make sure to include a changelog entry in your commit message and read the [changelog entries section](https://docs.gitlab.com/ee/development/changelog.html).
287
+
267
288
  ## Release
268
289
 
269
290
  [Automated gem release process](https://gitlab.com/gitlab-org/quality/pipeline-common#release-process) is used to release new version of `gitlab-dangerfiles` through [pipelines](https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/blob/4f33cf30cab84f7e27ca0cb9a7c0da3ecc675c11/.gitlab-ci.yml#L51), and this will:
@@ -272,24 +293,22 @@ See an [example](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92580) fo
272
293
  - Add a release in the `gitlab-dangerfiles` project: https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/releases
273
294
  - Populate the release log with the API contents. For example: https://gitlab.com/api/v4/projects/19861191/repository/changelog?version=3.4.4
274
295
 
296
+ We follow this release process in a separate merge request from the one that introduced the changes. The release merge request should just contain a version bump.
297
+
275
298
  ### Before release
276
299
 
277
- Make sure to include a changelog entry in your commit message and read the [changelog entries section](https://docs.gitlab.com/ee/development/changelog.html).
300
+ Changes merged since the last release should have had changelog entries (see [Contributing](#contributing)).
278
301
 
279
- If you forget to set the changelog entry in your commit messages, you can also edit the release notes after it's being released.
302
+ If changelog entries are missing, you can also edit the release notes after it's being released.
280
303
 
281
304
  ### Steps to release
282
305
 
283
- Use a `Release` merge request template and create a merge requet to update the version number in `version.rb`, and get the merge request merged by a maintainer.
306
+ Use a `Release` merge request template and create a merge request to update the version number in `version.rb`, and get the merge request merged by a maintainer.
284
307
 
285
308
  This will then be packaged into a gem and pushed to [rubygems.org](https://rubygems.org) by the CI/CD.
286
309
 
287
310
  For example: [Bump version to 3.4.3](https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/merge_requests/149).
288
311
 
289
- ## Contributing
290
-
291
- Bug reports and merge requests are welcome at https://gitlab.com/gitlab-org/gitlab-dangerfiles. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://gitlab.com/gitlab-org/gitlab-dangerfiles/blob/master/CODE_OF_CONDUCT.md).
292
-
293
312
  ## License
294
313
 
295
314
  The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -25,7 +25,7 @@ module Danger
25
25
  engineering_productivity: '~"Engineering Productivity" for CI, Danger',
26
26
  tooling: '~"maintenance::workflow" / ~"maintenance::pipelines" for CI, Danger',
27
27
  ci_template: '~"ci::templates"',
28
- product_intelligence: '~"product intelligence"',
28
+ analytics_instrumentation: '~"analytics instrumentation"',
29
29
  import_integrate_be: '~"group::import and integrate" (backend)',
30
30
  import_integrate_fe: '~"group::import and integrate" (frontend)',
31
31
  "Authentication and Authorization": '~"group::authentication and authorization"',
@@ -33,6 +33,34 @@ module Danger
33
33
  end
34
34
  end
35
35
 
36
+ def prepare_categories(changes_keys)
37
+ categories = Set.new(changes_keys)
38
+
39
+ # Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
40
+ categories << :database if labels.include?("database")
41
+
42
+ # Ensure to spin for Analytics Instrumentation reviewer when ~"analytics instrumentation::review pending" is applied
43
+ categories << :analytics_instrumentation if labels.include?("analytics instrumentation::review pending")
44
+
45
+ # Skip Analytics Instrumentation reviews for growth experiment MRs
46
+ categories.delete(:analytics_instrumentation) if labels.include?("growth experiment")
47
+
48
+ prepare_ux_category!(categories) if labels.include?("UX")
49
+
50
+ # Remove disabled categories
51
+ categories.subtract(helper.config.disabled_roulette_categories)
52
+
53
+ categories
54
+ end
55
+
56
+ def assign_pedroms_for_ux_wider_community_contribution(spins)
57
+ # We want at least a UX reviewer who can review any wider community
58
+ # contribution even without a team designer. We assign this to Pedro.
59
+ ux_spin = look_for_fallback_designer_for_ux_wider_community_contribution?(spins)
60
+
61
+ ux_spin && ux_spin.reviewer = teammate_pedroms
62
+ end
63
+
36
64
  # Finds the +Gitlab::Dangerfiles::Teammate+ object whose username matches the MR author username.
37
65
  #
38
66
  # @return [Gitlab::Dangerfiles::Teammate]
@@ -89,7 +117,7 @@ module Danger
89
117
  # Fetch an already picked backend maintainer, or pick one otherwise
90
118
  spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
91
119
  end
92
- when :product_intelligence
120
+ when :analytics_instrumentation
93
121
  spin.optional_role = :maintainer
94
122
 
95
123
  if spin.maintainer.nil?
@@ -124,6 +152,10 @@ module Danger
124
152
  @warnings ||= []
125
153
  end
126
154
 
155
+ def teammate_pedroms
156
+ @teammate_pedroms ||= find_member("pedroms")
157
+ end
158
+
127
159
  private
128
160
 
129
161
  def spin_for_approval_rule?(rule)
@@ -175,8 +207,8 @@ module Danger
175
207
  # @return [Boolean]
176
208
  def import_and_integrate_reject_category?(category, project)
177
209
  # Reject Import and Integrate categories if the MR author has reviewing abilities for the category.
178
- team_mr_author&.import_integrate_be?(project, category, helper.mr_labels) ||
179
- team_mr_author&.import_integrate_fe?(project, category, helper.mr_labels)
210
+ team_mr_author&.import_integrate_be?(project, category, labels) ||
211
+ team_mr_author&.import_integrate_fe?(project, category, labels)
180
212
  end
181
213
 
182
214
  def random
@@ -185,7 +217,7 @@ module Danger
185
217
 
186
218
  def spin_role_for_category(team, role, project, category)
187
219
  team.select do |member|
188
- member.public_send("#{role}?", project, category, helper.mr_labels)
220
+ member.public_send("#{role}?", project, category, labels)
189
221
  end
190
222
  end
191
223
 
@@ -258,6 +290,38 @@ module Danger
258
290
  Spin.new(category, reviewer, maintainer, false, timezone_experiment)
259
291
  end
260
292
 
293
+ def prepare_ux_category!(categories)
294
+ # Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI)
295
+ if labels.include?("Community contribution")
296
+ categories << :ux
297
+ else
298
+ begin
299
+ # We only want to spin a reviewer for merge requests which has a
300
+ # designer for the team. There's no easy way to tell this, so we
301
+ # pretend this is a community contribution, in which case we only
302
+ # pick the team designer. If there's no one got picked, it means
303
+ # there's no designer for this team.
304
+ labels << "Community contribution"
305
+
306
+ ux_spin = spin(nil, [:ux]).first
307
+
308
+ categories << :ux if ux_spin.reviewer || ux_spin.maintainer
309
+ ensure
310
+ # Make sure we delete the label afterward
311
+ labels.delete("Community contribution")
312
+ end
313
+ end
314
+ end
315
+
316
+ def look_for_fallback_designer_for_ux_wider_community_contribution?(spins)
317
+ labels.include?("Community contribution") &&
318
+ spins.find do |spin|
319
+ spin.category == :ux &&
320
+ spin.reviewer.nil? &&
321
+ spin.maintainer.nil?
322
+ end
323
+ end
324
+
261
325
  # Fetches the given +url+ and parse its response as JSON.
262
326
  #
263
327
  # @param [String] url
@@ -316,14 +380,20 @@ module Danger
316
380
  helper.config.project_name
317
381
  end
318
382
 
383
+ # Return the labels from the merge requests. This is cached.
384
+ #
385
+ # @return [String]
386
+ def labels
387
+ @labels ||= helper.mr_labels
388
+ end
389
+
319
390
  # Like +team+, but only returns teammates in the current project, based on
320
391
  # project_name.
321
392
  #
322
393
  # @return [Array<Gitlab::Dangerfiles::Teammate>]
323
394
  def project_team(project_name)
324
395
  company_members.select do |member|
325
- member.in_project?(project_name) ||
326
- member.in_project?("gitlab") # Used for universal reviewer
396
+ member.in_project?(project_name)
327
397
  end
328
398
  rescue => err
329
399
  warn("Reviewer roulette failed to load team data: #{err.message}")
@@ -81,30 +81,16 @@ def warning_list(roulette)
81
81
  end
82
82
 
83
83
  changes = helper.changes_by_category
84
-
85
- # Replicating label based categories from:
86
- # https://gitlab.com/gitlab-org/gitlab/-/blob/master/danger/roulette/Dangerfile
87
- categories = Set.new(changes.keys)
88
-
89
- # Ensure to spin for database reviewer/maintainer when ~database is applied (e.g. to review SQL queries)
90
- categories << :database if helper.mr_labels.include?('database')
91
-
92
- # Ensure to spin for UX reviewer when ~UX is applied (e.g. to review changes to the UI) except when it's from wider community contribution where we want to assign from the corresponding group
93
- categories << :ux if helper.mr_labels.include?('UX') && !helper.mr_labels.include?('Community contribution')
94
-
95
- # Ensure to spin for Product Intelligence reviewer when ~"product intelligence::review pending" is applied
96
- categories << :product_intelligence if helper.mr_labels.include?("product intelligence::review pending")
97
-
98
- # Skip Product intelligence reviews for growth experiment MRs
99
- categories.delete(:product_intelligence) if helper.mr_labels.include?("growth experiment")
100
-
101
- # Remove disabled categories
102
- categories.subtract(helper.config.disabled_roulette_categories)
84
+ categories = roulette.prepare_categories(changes.keys)
103
85
 
104
86
  if changes.any?
105
87
  show_category_column = categories.size > 1 || categories.first != :none
106
88
  random_roulette_spins = roulette.spin(nil, categories)
107
89
 
90
+ if categories.include?(:ux)
91
+ roulette.assign_pedroms_for_ux_wider_community_contribution(random_roulette_spins)
92
+ end
93
+
108
94
  rows = random_roulette_spins.map do |spin|
109
95
  markdown_row_for_spins(spin.category, [spin], show_category_column: show_category_column)
110
96
  end
@@ -21,19 +21,11 @@ module Gitlab
21
21
  end
22
22
  private_class_method :name_to_class
23
23
 
24
- def has_capability?(...)
25
- has_particular_capability?(...) || has_universal_capability?(...)
26
- end
27
-
28
- private
29
-
30
- def has_particular_capability?(teammate)
24
+ def has_capability?(teammate)
31
25
  teammate.capabilities(project).include?(capability)
32
26
  end
33
27
 
34
- def has_universal_capability?(teammate)
35
- false
36
- end
28
+ private
37
29
 
38
30
  def capability
39
31
  @capability ||= "#{kind} #{name}"
@@ -46,21 +38,17 @@ module Gitlab
46
38
  end
47
39
 
48
40
  class Test < Category
49
- private
50
-
51
- def has_particular_capability?(teammate)
41
+ def has_capability?(teammate)
52
42
  return false if kind != :reviewer
53
43
 
54
44
  area = teammate.role[/Software Engineer in Test(?:.*?, (\w+))/, 1]
55
45
 
56
- area && labels.any?("devops::#{area.downcase}")
46
+ !!area && labels.any?("devops::#{area.downcase}")
57
47
  end
58
48
  end
59
49
 
60
50
  class Tooling < Category
61
- private
62
-
63
- def has_particular_capability?(teammate)
51
+ def has_capability?(teammate)
64
52
  if super
65
53
  true
66
54
  elsif %i[trainee_maintainer maintainer].include?(kind)
@@ -72,59 +60,52 @@ module Gitlab
72
60
  end
73
61
 
74
62
  class ImportIntegrateBE < Category
75
- private
76
-
77
- def has_particular_capability?(teammate)
63
+ def has_capability?(teammate)
78
64
  kind == :reviewer &&
79
- teammate.role.match?(/Backend Engineer.+Manage:Integrations/)
65
+ teammate.role.match?(/Backend Engineer.+Manage:Import and Integrate/)
80
66
  end
81
67
  end
82
68
 
83
69
  class ImportIntegrateFE < Category
84
- private
85
-
86
- def has_particular_capability?(teammate)
70
+ def has_capability?(teammate)
87
71
  kind == :reviewer &&
88
- teammate.role.match?(/Frontend Engineer.+Manage:Integrations/)
72
+ teammate.role.match?(/Frontend Engineer.+Manage:Import and Integrate/)
89
73
  end
90
74
  end
91
75
 
92
76
  class UX < Category
77
+ def has_capability?(teammate)
78
+ super &&
79
+
80
+ if labels.any?("Community contribution")
81
+ can_review_wider_community_contribution?(teammate)
82
+ else
83
+ can_review_team_memeber_contribution?(teammate)
84
+ end
85
+ end
86
+
93
87
  private
94
88
 
95
- def has_particular_capability?(teammate)
96
- if labels.any?("Community contribution")
97
- can_review_wider_community_contribution?(teammate)
98
- else
99
- super
100
- end
89
+ def can_review_wider_community_contribution?(teammate)
90
+ # We want the designer for the team to review the wider community
91
+ # contribution because they're more familiar with that area.
92
+ the_designer_for_the_team?(teammate)
101
93
  end
102
94
 
103
- def has_universal_capability?(teammate)
104
- # No universal reviewer for community contribution.
105
- # If we do, then picking from corresponding group won't be accurate.
106
- # After solving the following issue, then we can revisit this:
107
- # https://gitlab.com/gitlab-org/ruby/gems/gitlab-dangerfiles/-/issues/58
108
- return false if labels.any?("Community contribution")
109
-
110
- teammate.projects.each_value.any? do |capabilities|
111
- capabilities.include?(capability)
112
- end
95
+ def can_review_team_memeber_contribution?(teammate)
96
+ # We don't want the designer for the team to review merge
97
+ # requests for the same team which is designed by themselves.
98
+ # So they can only review if they're not the designer for the team.
99
+ !the_designer_for_the_team?(teammate)
113
100
  end
114
101
 
115
- def can_review_wider_community_contribution?(teammate)
102
+ def the_designer_for_the_team?(teammate)
116
103
  # Pick corresponding group for community contribution
117
- # Role can be:
118
- # Product Designer, Create:Source Code
119
- # Product Designer, Verify:Pipeline Insights, Verify:Runner
120
- # Product Designer, Release
121
104
  # Specialty can be:
122
105
  # Source Code
123
106
  # [Growth: Activation, Growth: Expansion]
124
107
  # Runner
125
- areas = teammate.role[/Product Designer(?:.*?, (.+))/, 1]&.split(",")
126
-
127
- group_labels = [*teammate.specialty, *areas].map do |field|
108
+ group_labels = Array(teammate.specialty).map do |field|
128
109
  group = field.strip.sub(/^.+: ?/, "").downcase
129
110
 
130
111
  "group::#{group}"
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "3.9.0"
3
+ VERSION = "3.11.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: 3.9.0
4
+ version: 3.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GitLab
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-02 00:00:00.000000000 Z
11
+ date: 2023-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake