class Reviewlette
Constants
- VERSION
Public Class Methods
new(members:, github_config: nil, trello_config: nil)
click to toggle source
# File lib/reviewlette.rb, line 6 def initialize(members:, github_config: nil, trello_config: nil) @trello = TrelloConnection.new(trello_config) @github = github_config || YAML.load_file("#{File.dirname(__FILE__)}/../config/github.yml") @members = members end
Public Instance Methods
check_repo(repo_name, token)
click to toggle source
# File lib/reviewlette.rb, line 19 def check_repo(repo_name, token) repo = GithubConnection.new(repo_name, token) unless repo.repo_exists? puts "Repository #{repo_name} does not exist. Check your configuration" return end repo.pull_requests.each do |issue| issue_id = issue[:number] issue_title = issue[:title] issue_labels = repo.labels(issue_id) puts "*** Checking GitHub pull request: #{issue_title}" matched = issue_title.match(/\d+[_'"]?$/) unless matched puts 'Pull request not assigned to a trello card' next end card_id = matched[0].to_i card = @trello.find_card_by_id(card_id) unless card puts "No matching card found (id #{card_id})" next end puts "Found matching trello card: #{card.name}" assignees = issue[:assignees].map(&:login) already_assigned_members = @members.select { |m| assignees.include? m.github_handle } wanted_number = how_many_should_review(issue_labels) if assignees.size < wanted_number reviewers = select_reviewers(card, wanted_number, already_assigned_members) if reviewers.empty? puts "Could not find a reviewer for card: #{card.name}" next end repo.add_assignees(issue_id, reviewers.map { |r| r.github_handle } ) repo.comment_reviewers(issue_id, reviewers, card) @trello.comment_reviewers(card, repo_name, issue_id, reviewers) @trello.move_card_to_list(card, 'In review') already_assigned_members end end end
how_many_should_review(labels)
click to toggle source
# File lib/reviewlette.rb, line 79 def how_many_should_review(labels) return 2 if labels.include? '2 reviewers' 1 end
run()
click to toggle source
# File lib/reviewlette.rb, line 12 def run @github['repos'].each do |repo| puts "Checking repository #{repo}..." check_repo(repo, @github['token']) end end
select_reviewers(card, number = 1, already_assigned = [])
click to toggle source
# File lib/reviewlette.rb, line 71 def select_reviewers(card, number = 1, already_assigned = []) reviewers = @members reviewers.reject! { |r| card.members.map(&:username).include? r.trello_handle } reviewers -= already_assigned reviewers.sample(number - already_assigned.size) + already_assigned end