Class: Log::ProgressBar
- Inherits:
-
Object
- Object
- Log::ProgressBar
- Defined in:
- lib/rbbt/util/log/progress.rb,
lib/rbbt/util/log/progress/util.rb,
lib/rbbt/util/log/progress/report.rb
Constant Summary collapse
- BAR_MUTEX =
Mutex.new
- BARS =
[]
- REMOVE =
[]
Instance Attribute Summary collapse
-
#depth ⇒ Object
Returns the value of attribute depth.
-
#desc ⇒ Object
Returns the value of attribute desc.
-
#frequency ⇒ Object
Returns the value of attribute frequency.
-
#history ⇒ Object
Returns the value of attribute history.
-
#max ⇒ Object
Returns the value of attribute max.
-
#mean_max ⇒ Object
Returns the value of attribute mean_max.
-
#ticks ⇒ Object
Returns the value of attribute ticks.
Class Method Summary collapse
- .cleanup_bars ⇒ Object
- .new_bar(max, options = {}) ⇒ Object
- .remove_bar(bar) ⇒ Object
- .with_bar(max, options = {}) ⇒ Object
Instance Method Summary collapse
- #done(io = STDERR) ⇒ Object
- #down_lines(depth) ⇒ Object
- #eta_msg ⇒ Object
-
#initialize(max = nil, options = {}) ⇒ ProgressBar
constructor
A new instance of ProgressBar.
- #percent ⇒ Object
- #print(io, str) ⇒ Object
- #report(io = STDERR) ⇒ Object
- #report_msg ⇒ Object
- #thr ⇒ Object
- #thr_msg ⇒ Object
- #tick(step = nil) ⇒ Object
- #up_lines(depth) ⇒ Object
Constructor Details
#initialize(max = nil, options = {}) ⇒ ProgressBar
Returns a new instance of ProgressBar.
8 9 10 11 12 13 14 15 16 17 18 19 20 |
# File 'lib/rbbt/util/log/progress.rb', line 8 def initialize(max = nil, = {}) = Misc.add_defaults , :depth => 0, :num_reports => 100, :desc => "Progress", :io => STDERR, :severity => Log.severity depth, num_reports, desc, io, severity = Misc. , :depth, :num_reports, :desc, :io, :severity @max = max @ticks = 0 @frequency = 2 @last_time = nil @last_count = nil @last_percent = nil @depth = depth @desc = desc end |
Instance Attribute Details
#depth ⇒ Object
Returns the value of attribute depth.
7 8 9 |
# File 'lib/rbbt/util/log/progress.rb', line 7 def depth @depth end |
#desc ⇒ Object
Returns the value of attribute desc.
7 8 9 |
# File 'lib/rbbt/util/log/progress.rb', line 7 def desc @desc end |
#frequency ⇒ Object
Returns the value of attribute frequency.
7 8 9 |
# File 'lib/rbbt/util/log/progress.rb', line 7 def frequency @frequency end |
#history ⇒ Object
Returns the value of attribute history.
20 21 22 |
# File 'lib/rbbt/util/log/progress/report.rb', line 20 def history @history end |
#max ⇒ Object
Returns the value of attribute max.
7 8 9 |
# File 'lib/rbbt/util/log/progress.rb', line 7 def max @max end |
#mean_max ⇒ Object
Returns the value of attribute mean_max.
20 21 22 |
# File 'lib/rbbt/util/log/progress/report.rb', line 20 def mean_max @mean_max end |
#ticks ⇒ Object
Returns the value of attribute ticks.
7 8 9 |
# File 'lib/rbbt/util/log/progress.rb', line 7 def ticks @ticks end |
Class Method Details
.cleanup_bars ⇒ Object
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/rbbt/util/log/progress/util.rb', line 17 def self. BAR_MUTEX.synchronize do REMOVE.each do || index = BARS.index if index BARS.delete_at index BARS.each_with_index do |,i| .depth = i end end end REMOVE.clear BARS.length end end |
.new_bar(max, options = {}) ⇒ Object
7 8 9 10 11 12 13 14 15 |
# File 'lib/rbbt/util/log/progress/util.rb', line 7 def self.(max, = {}) BAR_MUTEX.synchronize do Log::LAST.replace "new_bar" if Log::LAST == "progress" = Misc.add_defaults , :depth => BARS.length BARS << ( = ProgressBar.new(max, )) end end |
.remove_bar(bar) ⇒ Object
33 34 35 36 37 38 |
# File 'lib/rbbt/util/log/progress/util.rb', line 33 def self.() .done if .respond_to? :done BAR_MUTEX.synchronize do REMOVE << end end |
.with_bar(max, options = {}) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/rbbt/util/log/progress/util.rb', line 40 def self.(max, = {}) = (max, ) begin yield keep = false rescue KeepBar keep = true ensure () if end end |
Instance Method Details
#done(io = STDERR) ⇒ Object
111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/rbbt/util/log/progress/report.rb', line 111 def done(io = STDERR) done_msg = Log.color(:magenta, desc) << " " << Log.color(:green, "done") if @start ellapsed = (Time.now - @start).to_i else ellapsed = 0 end ellapsed = [ellapsed/3600, ellapsed/60 % 60, ellapsed % 60].map{|t| "%02i" % t }.join(':') done_msg << " " << Log.color(:blue, (@ticks).to_s) << " in " << Log.color(:green, ellapsed) @last_count = 0 @last_time = @start done_msg << " (" << thr_msg << ")" print(io, up_lines(@depth) << done_msg << down_lines(@depth)) end |
#down_lines(depth) ⇒ Object
7 8 9 |
# File 'lib/rbbt/util/log/progress/report.rb', line 7 def down_lines(depth) "\n\033[#{depth + 2}E" end |
#eta_msg ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/rbbt/util/log/progress/report.rb', line 51 def eta_msg percent = self.percent time = Time.now indicator = "" 10.times{|i| if i < percent / 10 then indicator << Log.color(:yellow, ".") else indicator << " " end } indicator << " #{Log.color(:blue, percent.to_s << "%")}" used = time - @start if @mean_max and @mean_max > 0 eta = (@max - @ticks) / @mean else eta = (@max - @ticks) / (@ticks/used) end used = Misc.format_seconds(used) eta = [eta/3600, eta/60 % 60, eta % 60].map{|t| "%02i" % t }.join(':') indicator << " #{Log.color :yellow, used} used #{Log.color :yellow, eta} left" indicator end |
#percent ⇒ Object
22 23 24 |
# File 'lib/rbbt/util/log/progress.rb', line 22 def percent (@ticks * 100) / @max end |
#print(io, str) ⇒ Object
11 12 13 14 15 16 17 18 |
# File 'lib/rbbt/util/log/progress/report.rb', line 11 def print(io, str) return if ENV["RBBT_NO_PROGRESS"] == "true" LOG_MUTEX.synchronize do STDERR.print str Log.logfile.puts str unless Log.logfile.nil? Log::LAST.replace "progress" end end |
#report(io = STDERR) ⇒ Object
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/rbbt/util/log/progress/report.rb', line 93 def report(io = STDERR) if Log::LAST != "progress" length = Log::ProgressBar. = BARS print(io, Log.color(:yellow, "...Progress\n")) .sort_by{|b| b.depth }.reverse.each do || print(io, Log.color(:yellow ,.report_msg) << "\n") end else = BARS end print(io, up_lines(.length) << Log.color(:yellow, "...Progress\n") << down_lines(.length)) print(io, up_lines(@depth) << report_msg << down_lines(@depth)) @last_time = Time.now @last_count = ticks @last_percent = percent if max end |
#report_msg ⇒ Object
81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/rbbt/util/log/progress/report.rb', line 81 def report_msg str = Log.color :magenta, desc return str << " " << Log.color(:yellow, "waiting") if @ticks == 0 str << " " << thr_msg if max str << Log.color(:blue, " -- ") << eta_msg else str << Log.color(:blue, " -- ") << ticks.to_s end str end |
#thr ⇒ Object
21 22 23 24 25 26 27 28 29 |
# File 'lib/rbbt/util/log/progress/report.rb', line 21 def thr count = @ticks - @last_count if @last_time.nil? seconds = 0.001 else seconds = Time.now - @last_time end thr = count / seconds end |
#thr_msg ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# File 'lib/rbbt/util/log/progress/report.rb', line 31 def thr_msg thr = self.thr if @history.nil? @history ||= [] else @history << thr @history.shift if @history.length > 20 end @mean_max ||= 0 if @history.length > 3 mean = @mean = Misc.mean(@history) @mean_max = mean if mean > @mean_max end str = "#{ Log.color :blue, thr.to_i.to_s } per sec." str << " #{ Log.color :yellow, mean.to_i.to_s } avg. #{Log.color :yellow, @mean_max.to_i.to_s} max." if @mean_max > 0 str end |
#tick(step = nil) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/rbbt/util/log/progress.rb', line 26 def tick(step = nil) return if ENV["RBBT_NO_PROGRESS"] == "true" @ticks += 1 time = Time.now if @last_time.nil? @last_time = time @last_count = @ticks @start = time return end diff = time - @last_time report and return if diff > @frequency return unless max percent = self.percent if @last_percent.nil? @last_percent = percent return end report and return if percent > @last_percent and diff > 0.3 end |
#up_lines(depth) ⇒ Object
3 4 5 |
# File 'lib/rbbt/util/log/progress/report.rb', line 3 def up_lines(depth) "\033[#{depth + 1}F\033[2K" end |