Class: AvgPlugin

Inherits:
Object
  • Object
show all
Extended by:
Plugin, PluginType, TypeHelper
Defined in:
lib/mvn2/plugin/avg.plugin.rb

Class Method Summary collapse

Class Method Details

.calc_new_avg(ind) ⇒ Object



153
154
155
156
157
158
# 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_actionsObject



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 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_blockersObject



47
48
49
50
51
52
# 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_optionsObject



37
38
39
40
41
42
43
# 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_typesObject



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 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_varsObject



9
10
11
12
13
# 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) ⇒ Object



86
87
88
89
90
91
92
93
# 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_fileObject



81
82
83
84
# 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) ⇒ Object



127
128
129
130
131
132
133
134
# 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) ⇒ Object



179
180
181
# 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_avgObject



106
107
108
109
110
111
112
113
114
115
116
# 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_avgObject



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# 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_avgObject



95
96
97
98
99
100
101
102
103
104
# 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_averagesObject



168
169
170
171
172
173
174
175
176
177
# 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_avgObject



160
161
162
163
164
165
166
# 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_avgObject



118
119
120
121
122
123
124
125
# 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