class AvgPlugin

Public Class Methods

calc_new_avg(ind) click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 153
def self.calc_new_avg(ind)
  averages2, counts, diff = Plugins.get_vars :averages2, :counts, :diff
  sum                     = averages2[ind] * counts[ind] + diff
  counts[ind]             += 1
  averages2[ind]          = sum / counts[ind]
end
def_actions() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 56
def self.def_actions
  register(:before_run, order: 1) { |options|
    read_avg
    read_full_avg
    read_advanced_avg
    show_averages if options[:show_average]
  }

  register(:after_run, order: 2) { |_, _|
    update_avg
    update_full_avg
  }

  register(:after_run, order: 4) { |options, _|
    if options[:show_average]
      read_avg
      read_full_avg
      read_advanced_avg
      show_averages
    end
  }
end
def_blockers() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 47
def self.def_blockers
  register :block_update, option: :block_update
  register(:block_update) { |options, result, average, diff| !(result || (!options[:skip_tests] && diff >= average / 2.0)) }
  register :block_full_average, option: :track_full_average, value: false
  register :block_average, option: :track_average, value: false
end
def_options() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 37
def self.def_options
  register :option, sym: :track_average, names: %w(-k --track-average), desc: 'update the average and also display a progress bar while the build is in progress'
  register :option, sym: :track_full_average, names: %w(-u --track-full-average), desc: 'update the average list and also display a progress bar while the build is in progress'
  register :option, sym: :advanced_average, names: %w(-d --advanced-average), desc: 'use k-means (with minimum optimal k) to find a list of averages and use the closest one for the progress bar and displayed average'
  register :option, sym: :show_average, names: %w(-w --show-average), desc: 'show the average(s) before and after the build (average tracking must be enabled)'
  register :option, sym: :block_update, names: %w(-b --block-update), desc: 'block the average feature from updating the file(s)'
end
def_types() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 17
def self.def_types
  register_type(:full_avg_name) { |list|
    options = Plugins.get_var :options
    pieces  = []
    list.sort_by { |v| v[:options][:order] }.each { |name| pieces << name[:block].call(options) }
    pieces.join
  }

  register_type(:block_average) { |list| basic_type(list) }

  register_type(:block_update) { |list|
    result, average, diff = Plugins.get_vars :result, :average, :diff
    basic_type(list, result, average, diff)
  }

  register_type(:block_full_average) { |list| Plugins.get(:block_average) || basic_type(list) }
end
def_vars() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 9
def self.def_vars
  register_variable :average
  register_variable :averages2
  register_variable :counts
end
float_filter(line) click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 86
def self.float_filter(line)
  begin
    f = line.chomp
    f.length == 0 || (f =~ /^\d+(\.\d+)?$/).nil? ? false : f.to_f
  rescue
    false
  end
end
full_avg_file() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 81
def self.full_avg_file
  pieces = Plugins.get :full_avg_name
  "avg#{pieces}.txt"
end
get_data(averages, counts, lines, ind) click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 127
def self.get_data(averages, counts, lines, ind)
  if lines.count > ind
    parts         = lines[ind].chomp.split(';')
    averages[ind] = parts[0].to_f
    counts[ind]   = parts[1].to_i
    averages[ind] = 0 if counts[ind] == 0
  end
end
get_time_parts(time) click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 179
def self.get_time_parts(time)
  return (time / 60.0).floor, '%06.3f' % (time % 60)
end
read_advanced_avg() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 106
def self.read_advanced_avg
  options, average = Plugins.get_vars :options, :average
  averages         = [average]
  file_name        = full_avg_file
  if !Plugins.get(:block_full_average) && options[:advanced_average] && File.exist?(file_name)
    lines    = IO.readlines(file_name)
    data     = lines.filtermap { |line| float_filter(line) }
    averages = data.nmeans
  end
  Plugins.set_var :averages, averages
end
read_avg() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 136
def self.read_avg
  options  = Plugins.get_var :options
  average  = 0
  averages = [0, 0, 0, 0]
  counts   = [0, 0, 0, 0]
  if !Plugins.get(:block_average) && File.exist?('avg.txt')
    lines = IO.readlines('avg.txt')
    get_data(averages, counts, lines, 0)
    get_data(averages, counts, lines, 1)
    get_data(averages, counts, lines, 2)
    get_data(averages, counts, lines, 3)
    pkg     = options[:package] ? 2 : 0
    average = averages[(options[:skip_tests] ? 0 : 1) + pkg]
  end
  Plugins.set_vars average: average, averages2: averages, counts: counts
end
read_full_avg() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 95
def self.read_full_avg
  average   = Plugins.get_var :average
  file_name = full_avg_file
  if !Plugins.get(:block_full_average) && File.exist?(file_name)
    lines   = IO.readlines(file_name)
    data    = lines.filtermap { |line| float_filter(line) }
    average = data.average
  end
  Plugins.set_var :average, average
end
show_averages() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 168
def self.show_averages
  averages = Plugins.get_var :averages
  unless averages.empty? || (averages.length == 1 && averages[0] == 0)
    strs = averages.map { |a|
      m, s = get_time_parts(a)
      "#{m}:#{s}"
    }
    puts "\r\e[2KAverage(s): #{strs.join(', ')}"
  end
end
update_avg() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 160
def self.update_avg
  options, averages2, counts = Plugins.get_vars :options, :averages2, :counts
  if !Plugins.get(:block_average) && !Plugins.get(:block_update)
    options[:skip_tests] ? calc_new_avg(0) : calc_new_avg(1)
    IO.write('avg.txt', "#{averages2[0]};#{counts[0]}\n#{averages2[1]};#{counts[1]}\n#{averages2[2]};#{counts[2]}\n#{averages2[3]};#{counts[3]}")
  end
end
update_full_avg() click to toggle source
# File lib/mvn2/plugin/avg.plugin.rb, line 118
def self.update_full_avg
  diff = Plugins.get_var :diff
  if !Plugins.get(:block_full_average) && !Plugins.get(:block_update)
    file = File.new(full_avg_file, 'a+')
    file.puts(diff)
    file.close
  end
end