blob: ccd9fa5b0505ea2c655a6a2cf31460348c025e32 [file] [log] [blame]
require 'chronic'
## This is a script to generate an email for committers@apache.org
# load agenda and minutes
board_svn = ASF::SVN['foundation_board']
minutes_file = File.join(AGENDA_WORK, "board_minutes_#@date.yml")
agenda_file = File.join(board_svn, "board_agenda_#@date.txt")
minutes = YAML.load_file(minutes_file) rescue {}
agenda = Agenda.parse(File.basename(agenda_file), :full)
# extract attendance from minutes and people from agenda
attendance = Array(minutes['attendance']).select {|_name, info| info[:present]}.
sort_by {|_name, info| info[:sortName]}
people = agenda[1]['people'].values
# merge role from agenda into attendance
attendance.each do |name, info|
person = people.find {|person| person[:name] == name}
info[:role] = person ? person[:role] : :guest
end
# group attendance by role (directors, officers, guests)
@attendance = attendance.group_by {|_name, info| info[:role]}.
map {|group, list| [group, list.map {|name, _info| name}]}.to_h
# get a list of missing attachments
@missing_reports = Array.new
agenda.each do |item|
next unless item['missing']
next if item['to'] == 'president'
@missing_reports << item
end
# extract list of rejected reports
@rejected = Array(minutes[:rejected])
# extract date of the meeting
@date = Time.at(agenda[0]['timestamp']/1000)
# get list of minutes
@approved_minutes = Array.new
@other_minutes = Array.new
agenda.each do |item|
next unless item[:attach] =~ /^3[A-Z]/
month = item['title'].split(' ').first
if minutes[item['title']] == 'approved'
@approved_minutes << month
else
@other_minutes << [ month, minutes[item['title']] || 'tabled' ]
end
end
# get list of resolutions
@approved_resolutions = Array.new
@other_resolutions = Array.new
agenda.each do |item|
next unless item[:attach] =~ /^7[A-Z]/
title = item['fulltitle'] || item['title']
if minutes[item['title']] == 'unanimous'
chair = item['chair']
title += " (#{item['people'][chair][:name]}, VP)" if chair
@approved_resolutions << title
else
@other_resolutions << [item['fulltitle'], minutes[item['title']]||'tabled']
end
end
# Find out the date of the next board report
next_meeting = ASF::Board.nextMeeting
@next_meeting = next_meeting.day.ordinalize + " of " +
next_meeting.strftime('%B')
# author of the email
sender = ASF::Person.find(env.user || ENV['USER'])
@from = "#{sender.public_name.inspect} <#{sender.id}@apache.org>"
##### Write the report
template = File.read('templates/committers_report.text.erb')
Erubis::Eruby.new(template).result(binding)