gitlab-dangerfiles 3.11.0 → 3.12.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: 2ee27fb91564bfb45f28aed3fca576c6731c91ae9f69719e2ebb0ce5807ff1ee
4
- data.tar.gz: 3bcd268c5fc1a91141a447ff6bb1b0c63841fe4dab2c65fffc61c7c488048275
3
+ metadata.gz: edf969f524278d280762935cb8a04c78a22180296c3b7e88deb342ab8f83c840
4
+ data.tar.gz: 6b3b3c493beb17172786cefaa6e6ac1dd1ef243234b5e90e632b79830a7fae9c
5
5
  SHA512:
6
- metadata.gz: d5cab2d3171779a9f28c00452e4e0435a6aa93852d80847b4da3b03f38fe294e7c855232b1402d6f3ac14f99b04518993b5fb6401da928ed9189f86a44948769
7
- data.tar.gz: dc580aa4781087b6598c8d4f2befb2fec6b9d87ae4ce964227b35a4fbc537c62f2bad0e4d947a65154753157a896cb890472be33d99f0e15463d63beed17b6ee
6
+ metadata.gz: 56e849f993eec188646a8f06106855409146070234b158c8cd48abe0378008c9d1c957dafbb1af6dbee4f86744014d1a852bc426993337f8b9978b9e7cdcdd80
7
+ data.tar.gz: 19f31baf98812c924fc62d88cdc601f0f73a0c9e0c239647e25d6e79c6a1a4eaec831397658883b9cc9aff70e0fabee8e3f4df0908f119c0262788296097793e
@@ -11,11 +11,7 @@ module Danger
11
11
  ROULETTE_DATA_URL = "https://gitlab-org.gitlab.io/gitlab-roulette/roulette.json"
12
12
  HOURS_WHEN_PERSON_CAN_BE_PICKED = (6..14).freeze
13
13
 
14
- INCLUDE_TIMEZONE_FOR_CATEGORY = {
15
- database: false,
16
- }.freeze
17
-
18
- Spin = Struct.new(:category, :reviewer, :maintainer, :optional_role, :timezone_experiment)
14
+ Spin = Struct.new(:category, :reviewer, :maintainer, :optional_role)
19
15
  HTTPError = Class.new(StandardError)
20
16
 
21
17
  Approval = Struct.new(:category, :spin) do
@@ -73,26 +69,22 @@ module Danger
73
69
  #
74
70
  # @param project [String] A project path.
75
71
  # @param categories [Array<Symbol>] An array of categories symbols.
76
- # @param timezone_experiment [Boolean] Whether to select reviewers based in timezone or not.
77
72
  #
78
73
  # @return [Array<Spin>]
79
74
  # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
80
- def spin(project = nil, categories = [:none], timezone_experiment: false)
75
+ def spin(project = nil, categories = [:none])
81
76
  project = (project || config_project_name).downcase
82
77
  categories = categories.map { |category| category&.downcase || :none }
83
78
  categories.reject! { |category| import_and_integrate_reject_category?(category, project) }
84
79
 
85
80
  spins = categories.sort_by(&:to_s).map do |category|
86
- including_timezone = INCLUDE_TIMEZONE_FOR_CATEGORY.fetch(category, timezone_experiment)
87
-
88
- spin_for_category(project, category, timezone_experiment: including_timezone)
81
+ spin_for_category(project, category)
89
82
  end
90
83
 
91
84
  backend_spin = spins.find { |spin| spin.category == :backend }
92
85
  frontend_spin = spins.find { |spin| spin.category == :frontend }
93
86
 
94
87
  spins.each do |spin|
95
- including_timezone = INCLUDE_TIMEZONE_FOR_CATEGORY.fetch(spin.category, timezone_experiment)
96
88
  case spin.category
97
89
  when :qa
98
90
  # MR includes QA changes, but also other changes, and author isn't an SET
@@ -105,24 +97,24 @@ module Danger
105
97
 
106
98
  if spin.reviewer.nil?
107
99
  # Fetch an already picked backend reviewer, or pick one otherwise
108
- spin.reviewer = backend_spin&.reviewer || spin_for_category(project, :backend, timezone_experiment: including_timezone).reviewer
100
+ spin.reviewer = backend_spin&.reviewer || spin_for_category(project, :backend).reviewer
109
101
  end
110
102
  when :tooling, :engineering_productivity # Deprecated as of 2.3.0 in favor of tooling
111
103
  if spin.maintainer.nil?
112
104
  # Fetch an already picked backend maintainer, or pick one otherwise
113
- spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
105
+ spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend).maintainer
114
106
  end
115
107
  when :ci_template
116
108
  if spin.maintainer.nil?
117
109
  # Fetch an already picked backend maintainer, or pick one otherwise
118
- spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
110
+ spin.maintainer = backend_spin&.maintainer || spin_for_category(project, :backend).maintainer
119
111
  end
120
112
  when :analytics_instrumentation
121
113
  spin.optional_role = :maintainer
122
114
 
123
115
  if spin.maintainer.nil?
124
116
  # Fetch an already picked maintainer, or pick one otherwise
125
- spin.maintainer = backend_spin&.maintainer || frontend_spin&.maintainer || spin_for_category(project, :backend, timezone_experiment: including_timezone).maintainer
117
+ spin.maintainer = backend_spin&.maintainer || frontend_spin&.maintainer || spin_for_category(project, :backend).maintainer
126
118
  end
127
119
  when :import_integrate_be, :import_integrate_fe
128
120
  spin.optional_role = :maintainer
@@ -136,7 +128,7 @@ module Danger
136
128
 
137
129
  # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
138
130
 
139
- def required_approvals
131
+ def codeowners_approvals
140
132
  approval_rules = helper.mr_approval_state["rules"]
141
133
 
142
134
  return [] unless approval_rules
@@ -156,13 +148,25 @@ module Danger
156
148
  @teammate_pedroms ||= find_member("pedroms")
157
149
  end
158
150
 
151
+ alias_method :required_approvals, :codeowners_approvals
152
+
159
153
  private
160
154
 
161
155
  def spin_for_approval_rule?(rule)
162
156
  rule["rule_type"] == "code_owner" &&
163
- rule["approvals_required"] > 0 &&
157
+ should_include_codeowners_rule?(rule) &&
164
158
  # Exclude generic codeowners rule, which should be covered by others already
165
- !generic_codeowners_rule?(rule)
159
+ !generic_codeowners_rule?(rule) &&
160
+ !excluded_required_codeowners_rule?(rule)
161
+ end
162
+
163
+ def should_include_codeowners_rule?(rule)
164
+ rule["approvals_required"] > 0 ||
165
+ helper.config.included_optional_codeowners_sections_for_roulette.include?(rule["section"])
166
+ end
167
+
168
+ def excluded_required_codeowners_rule?(rule)
169
+ helper.config.excluded_required_codeowners_sections_for_roulette.include?(rule["section"])
166
170
  end
167
171
 
168
172
  def generic_codeowners_rule?(rule)
@@ -191,12 +195,6 @@ module Danger
191
195
  !mr_author?(person) && person.available
192
196
  end
193
197
 
194
- # @param [Gitlab::Dangerfiles::Teammate] person
195
- # @return [Boolean]
196
- def valid_person_with_timezone?(person)
197
- valid_person?(person) && HOURS_WHEN_PERSON_CAN_BE_PICKED.cover?(person.local_hour)
198
- end
199
-
200
198
  # @param [Gitlab::Dangerfiles::Teammate] person
201
199
  # @return [Boolean]
202
200
  def mr_author?(person)
@@ -227,14 +225,10 @@ module Danger
227
225
  # @param [Array<Gitlab::Dangerfiles::Teammate>] people
228
226
  #
229
227
  # @return [Gitlab::Dangerfiles::Teammate]
230
- def spin_for_person(people, timezone_experiment: false)
228
+ def spin_for_person(people)
231
229
  shuffled_people = people.shuffle(random: random)
232
230
 
233
- if timezone_experiment
234
- shuffled_people.find(&method(:valid_person_with_timezone?))
235
- else
236
- shuffled_people.find(&method(:valid_person?))
237
- end
231
+ shuffled_people.find(&method(:valid_person?))
238
232
  end
239
233
 
240
234
  # Spin a reviewer for a particular approval rule
@@ -274,7 +268,7 @@ module Danger
274
268
  fallback_approvers.sample(random: random)
275
269
  end
276
270
 
277
- def spin_for_category(project, category, timezone_experiment: false)
271
+ def spin_for_category(project, category)
278
272
  team = project_team(project)
279
273
  reviewers, traintainers, maintainers =
280
274
  %i[reviewer traintainer maintainer].map do |role|
@@ -284,10 +278,10 @@ module Danger
284
278
  weighted_reviewers = Gitlab::Dangerfiles::Weightage::Reviewers.new(reviewers, traintainers).execute
285
279
  weighted_maintainers = Gitlab::Dangerfiles::Weightage::Maintainers.new(maintainers).execute
286
280
 
287
- reviewer = spin_for_person(weighted_reviewers, timezone_experiment: timezone_experiment)
288
- maintainer = spin_for_person(weighted_maintainers, timezone_experiment: timezone_experiment)
281
+ reviewer = spin_for_person(weighted_reviewers)
282
+ maintainer = spin_for_person(weighted_maintainers)
289
283
 
290
- Spin.new(category, reviewer, maintainer, false, timezone_experiment)
284
+ Spin.new(category, reviewer, maintainer, false)
291
285
  end
292
286
 
293
287
  def prepare_ux_category!(categories)
@@ -33,6 +33,14 @@ module Gitlab
33
33
  # @return [Array] indicating which categories would be disabled for the simple roulette. Default to `[]` (all categories are enabled)
34
34
  attr_accessor :disabled_roulette_categories
35
35
 
36
+ # @!attribute included_optional_codeowners_sections_for_roulette
37
+ # @return [Array] indicating which optional codeowners sections should be included in roulette. Default to `[]`.
38
+ attr_accessor :included_optional_codeowners_sections_for_roulette
39
+
40
+ # @!attribute excluded_required_codeowners_sections_for_roulette
41
+ # @return [Array] indicating which required codeowners sections should be excluded from roulette. Default to `[]`.
42
+ attr_accessor :excluded_required_codeowners_sections_for_roulette
43
+
36
44
  DEFAULT_CHANGES_SIZE_THRESHOLDS = { high: 2_000, medium: 500 }.freeze
37
45
  DEFAULT_COMMIT_MESSAGES_MAX_COMMITS_COUNT = 10
38
46
 
@@ -44,6 +52,8 @@ module Gitlab
44
52
  @code_size_thresholds = DEFAULT_CHANGES_SIZE_THRESHOLDS
45
53
  @max_commits_count = DEFAULT_COMMIT_MESSAGES_MAX_COMMITS_COUNT
46
54
  @disabled_roulette_categories = []
55
+ @included_optional_codeowners_sections_for_roulette = []
56
+ @excluded_required_codeowners_sections_for_roulette = []
47
57
  end
48
58
  end
49
59
  end
@@ -1,5 +1,5 @@
1
1
  module Gitlab
2
2
  module Dangerfiles
3
- VERSION = "3.11.0"
3
+ VERSION = "3.12.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.11.0
4
+ version: 3.12.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-06-22 00:00:00.000000000 Z
11
+ date: 2023-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake