module Pghub::AutoAssign

Constants

VERSION

Public Class Methods

post(issue_path, opened_pr_user) click to toggle source
# File lib/pghub/auto_assign.rb, line 21
def post(issue_path, opened_pr_user)
  assignees = select_members(Pghub.config.num_of_assignees_per_team, opened_pr_user, [opened_pr_user])
  reviewers = select_members(Pghub.config.num_of_reviewers_per_team, opened_pr_user)
  assign(issue_path, assignees)
  request_review(issue_path, reviewers)
end

Private Class Methods

all_members() click to toggle source
# File lib/pghub/auto_assign.rb, line 30
def all_members
  teams_data.each_with_object({}) do |team, members|
    members[team[:name].to_sym] = team_members(team[:id])
  end
end
assign(issue_path, assignees) click to toggle source
# File lib/pghub/auto_assign.rb, line 77
def assign(issue_path, assignees)
  connection.post do |req|
    req.url request_url("#{issue_path}/assignees")
    req.headers['Content-Type'] = 'application/json'
    req.body = { assignees: assignees }.to_json
  end
end
request_review(issue_path, reviewers) click to toggle source
# File lib/pghub/auto_assign.rb, line 85
def request_review(issue_path, reviewers)
  pr_path = issue_path.gsub('issues', 'pulls')

  connection.post do |req|
    req.url request_url("#{pr_path}/requested_reviewers")
    req.headers['Content-Type'] = 'application/json'
    req.body = { reviewers: reviewers }.to_json
  end
end
request_url(path) click to toggle source
# File lib/pghub/auto_assign.rb, line 95
def request_url(path)
  "/repos/#{Pghub.config.github_organization}/#{path}?access_token=#{Pghub.config.github_access_token}"
end
select_members(num_of_members_per_team, opened_pr_user, members = []) click to toggle source
# File lib/pghub/auto_assign.rb, line 62
def select_members(num_of_members_per_team, opened_pr_user, members = [])
  return members if num_of_members_per_team.empty?

  num_of_members_per_team.each do |team, number|
    team_members = all_members[team.to_sym]
    raise TooManyNumOfMembersError, team if number > team_members.length

    team_members.delete(opened_pr_user)
    selected_members = team_members.sample(number)
    members += selected_members
  end

  members
end
team_members(team_id) click to toggle source
# File lib/pghub/auto_assign.rb, line 55
def team_members(team_id)
  response = connection.get("/teams/#{team_id}/members?access_token=#{Pghub.config.github_access_token}")
  body = JSON.parse(response.body).map(&:with_indifferent_access)

  body.map { |h| h[:login] }
end
teams_data() click to toggle source
# File lib/pghub/auto_assign.rb, line 36
def teams_data
  response = connection.get("/orgs/#{Pghub.config.github_organization}/teams?access_token=#{Pghub.config.github_access_token}")
  body = JSON.parse(response.body).map(&:with_indifferent_access)

  team_names = body.map { |data| data[:name] }
  validate_teams(team_names)

  body.map { |data| { id: data[:id], name: data[:name] } }
end
validate_teams(valid_teams) click to toggle source
# File lib/pghub/auto_assign.rb, line 46
def validate_teams(valid_teams)
  Pghub.config.num_of_assignees_per_team.each_key do |team|
    raise UnknownTeamError, "Unknown #{team}" unless valid_teams.include?(team.to_s)
  end
  Pghub.config.num_of_reviewers_per_team.each_key do |team|
    raise UnknownTeamError, "Unknown #{team}" unless valid_teams.include?(team.to_s)
  end
end