self.summarize

in lib/whimsy/asf/agenda/summary.rb [34:118]


  def self.summarize(fname)
    summary = {}
    meeting = File.basename(fname, '.*')
    if SKIP_AGENDAS.has_key?(meeting)
      summary[ERRORS_KEY] = "SKIP(#{meeting}) was: #{SKIP_AGENDAS[meeting]}"
      return summary
    end
    begin
      agenda = ASF::Board::Agenda.parse(File.read(fname))
    rescue StandardError => e
      summary[ERRORS_KEY] = "ERROR(#{meeting}) Agenda parse error: #{e.message} #{e.backtrace[0]}"
      return summary
    end
    begin
      summary[PEOPLE_KEY] = Hash[agenda[1][PEOPLE_KEY]]
      summary[PEOPLE_KEY].each do |id, data|
        
        data['initials'] = ASF::Board.directorInitials(id) if ASF::Board.directorHasId?(id)
      end
    rescue StandardError => e
      summary[ERRORS_KEY] = "ERROR(#{meeting}) no attendance error: #{e.message} #{e.backtrace[0]}"
      return summary
    end
    begin
      
      approvals = agenda.select{ |v| v.has_key?(APPROVED_KEY) }
      
      preports, oreports = approvals.partition{ |v| /\A[[:alpha:]]/ =~ v[ATTACH_KEY] }
      summary[OFFICERS_KEY] = Hash.new{|h,k| h[k] = {} }
      oreports.each do |r|
        summary[OFFICERS_KEY][r[TITLE_KEY]]['owner'] = r['owner'] if r.has_key?('owner')
        summary[OFFICERS_KEY][r[TITLE_KEY]][APPROVALS_KEY] =  Array.new(r['approved'])
        summary[OFFICERS_KEY][r[TITLE_KEY]][COMMENT_LEN] = r['comments'].length
        summary[OFFICERS_KEY][r[TITLE_KEY]][REPORT_LEN] = r['report'].length if r['report']
      end
      summary[PMCS_KEY] = Hash.new{|h,k| h[k] = {} }
      preports.each do |r|
        summary[PMCS_KEY][r[TITLE_KEY]]['owner'] = r['owner']
        if r.has_key?('missing')
          summary[PMCS_KEY][r[TITLE_KEY]]['missing'] = true
        else
          summary[PMCS_KEY][r[TITLE_KEY]][APPROVALS_KEY] =  Array.new(r['approved'])
          summary[PMCS_KEY][r[TITLE_KEY]][COMMENT_LEN] = r['comments'].length
          summary[PMCS_KEY][r[TITLE_KEY]][REPORT_LEN] = r['report'].length if r['report']
        end
      end
      actions = agenda.select{ |v| v.has_key?(INDEX_KEY) && v[INDEX_KEY] == 'Action Items' }[0][ACTIONS_KEY]
      if actions
        summary[ACTIONS_KEY] = Hash.new{|h,k| h[k] = [] }
        actions.each do |r|
          summary[ACTIONS_KEY][r[:owner]] << r[:pmc]
        end
      end
      
      summary[STATS_KEY] = {}
      summary[STATS_KEY]['specialorders'] = agenda.select{ |v| /\A7/ =~ v[ATTACH_KEY] }.length
      summary[STATS_KEY]['discusstextlen'] = agenda.select{ |v|
        v[INDEX_KEY] == 'Discussion Items' || /\A8[A-Z]/ =~ v[ATTACH_KEY]
      }.map {|v| v['text'].length}.sum
      totapprovals = 0
      totcommentlen = 0
      totreportlen = 0
      totreports = (summary[OFFICERS_KEY].length + summary[PMCS_KEY].length).to_f
      
      summary[OFFICERS_KEY].each do |x, data|
        totapprovals += data[APPROVALS_KEY].length if data[APPROVALS_KEY]
        totcommentlen += data[COMMENT_LEN] if data[COMMENT_LEN]
        totreportlen += data[REPORT_LEN] if data[REPORT_LEN]
      end
      summary[PMCS_KEY].each do |x, data|
        totapprovals += data[APPROVALS_KEY].length if data[APPROVALS_KEY]
        totcommentlen += data[COMMENT_LEN] if data[COMMENT_LEN]
        totreportlen += data[REPORT_LEN] if data[REPORT_LEN]
      end
      if totreports != 0 
        summary[STATS_KEY]['avgapprovals'] = (totapprovals / totreports).round(2)
        summary[STATS_KEY]['avgcommentlen'] = (totcommentlen / totreports).round(0)
        summary[STATS_KEY]['avgreportlen'] = (totreportlen / totreports).round(0)
      end
    rescue StandardError => e
      summary[ERRORS_KEY] ||= "ERROR(#{meeting}) process error: #{e.message} #{e.backtrace[0]}"
    end
    return summary
  end