diff options
Diffstat (limited to 'lib/gitlab/danger/roulette.rb')
-rw-r--r-- | lib/gitlab/danger/roulette.rb | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/lib/gitlab/danger/roulette.rb b/lib/gitlab/danger/roulette.rb index 9f7980dc20a..ed4af3f4a43 100644 --- a/lib/gitlab/danger/roulette.rb +++ b/lib/gitlab/danger/roulette.rb @@ -5,8 +5,12 @@ require_relative 'teammate' module Gitlab module Danger module Roulette - ROULETTE_DATA_URL = 'https://about.gitlab.com/roulette.json' - OPTIONAL_CATEGORIES = [:qa, :test].freeze + ROULETTE_DATA_URL = 'https://gitlab-org.gitlab.io/gitlab-roulette/roulette.json' + HOURS_WHEN_PERSON_CAN_BE_PICKED = (6..14).freeze + + INCLUDE_TIMEZONE_FOR_CATEGORY = { + database: false + }.freeze Spin = Struct.new(:category, :reviewer, :maintainer, :optional_role) @@ -14,7 +18,7 @@ module Gitlab # for each change category that a Merge Request contains. # # @return [Array<Spin>] - def spin(project, categories, branch_name) + def spin(project, categories, branch_name, timezone_experiment: false) team = begin project_team(project) @@ -26,7 +30,9 @@ module Gitlab canonical_branch_name = canonical_branch_name(branch_name) spin_per_category = categories.each_with_object({}) do |category, memo| - memo[category] = spin_for_category(team, project, category, canonical_branch_name) + including_timezone = INCLUDE_TIMEZONE_FOR_CATEGORY.fetch(category, timezone_experiment) + + memo[category] = spin_for_category(team, project, category, canonical_branch_name, timezone_experiment: including_timezone) end spin_per_category.map do |category, spin| @@ -80,9 +86,14 @@ module Gitlab # Known issue: If someone is rejected due to OOO, and then becomes not OOO, the # selection will change on next spin # @param [Array<Teammate>] people - def spin_for_person(people, random:) - people.shuffle(random: random) - .find(&method(:valid_person?)) + def spin_for_person(people, random:, timezone_experiment: false) + shuffled_people = people.shuffle(random: random) + + if timezone_experiment + shuffled_people.find(&method(:valid_person_with_timezone?)) + else + shuffled_people.find(&method(:valid_person?)) + end end private @@ -90,7 +101,13 @@ module Gitlab # @param [Teammate] person # @return [Boolean] def valid_person?(person) - !mr_author?(person) && person.available? + !mr_author?(person) && person.available + end + + # @param [Teammate] person + # @return [Boolean] + def valid_person_with_timezone?(person) + valid_person?(person) && HOURS_WHEN_PERSON_CAN_BE_PICKED.cover?(person.local_hour) end # @param [Teammate] person @@ -105,7 +122,7 @@ module Gitlab end end - def spin_for_category(team, project, category, branch_name) + def spin_for_category(team, project, category, branch_name, timezone_experiment: false) reviewers, traintainers, maintainers = %i[reviewer traintainer maintainer].map do |role| spin_role_for_category(team, role, project, category) @@ -116,14 +133,10 @@ module Gitlab # Make traintainers have triple the chance to be picked as a reviewer random = new_random(branch_name) - reviewer = spin_for_person(reviewers + traintainers + traintainers, random: random) - maintainer = spin_for_person(maintainers, random: random) + reviewer = spin_for_person(reviewers + traintainers + traintainers, random: random, timezone_experiment: timezone_experiment) + maintainer = spin_for_person(maintainers, random: random, timezone_experiment: timezone_experiment) - Spin.new(category, reviewer, maintainer).tap do |spin| - if OPTIONAL_CATEGORIES.include?(category) - spin.optional_role = :maintainer - end - end + Spin.new(category, reviewer, maintainer) end end end |