| Class | ProgressBar |
| In: |
lib/more/facets/progressbar.rb
|
| Parent: | Object |
ProgressBar is a text-based progressbar library.
pbar = ProgressBar.new( "Demo", 100 )
100.times { pbar.inc }
pbar.finish
# File lib/more/facets/progressbar.rb, line 38
38: def initialize(title, total, out = STDERR)
39: @title = title
40: @total = total
41: @out = out
42: @bar_length = 80
43: @bar_mark = "o"
44: @total_overflow = true
45: @current = 0
46: @previous = 0
47: @is_finished = false
48: @start_time = Time.now
49: @format = "%-14s %3d%% %s %s"
50: @format_arguments = [:title, :percentage, :bar, :stat]
51: show_progress
52: end
# File lib/more/facets/progressbar.rb, line 189
189: def bar_mark=(mark)
190: @bar_mark = String(mark)[0..0]
191: end
# File lib/more/facets/progressbar.rb, line 181
181: def file_transfer_mode
182: @format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer]
183: end
# File lib/more/facets/progressbar.rb, line 205
205: def finish
206: @current = @total
207: @is_finished = true
208: show_progress
209: end
# File lib/more/facets/progressbar.rb, line 197
197: def format=(format)
198: @format = format
199: end
# File lib/more/facets/progressbar.rb, line 201
201: def format_arguments=(arguments)
202: @format_arguments = arguments
203: end
# File lib/more/facets/progressbar.rb, line 215
215: def halt
216: @is_finished = true
217: show_progress
218: end
# File lib/more/facets/progressbar.rb, line 235
235: def inc(step = 1)
236: @current += step
237: @current = @total if @current > @total
238: show_progress
239: @previous = @current
240: end
# File lib/more/facets/progressbar.rb, line 242
242: def inspect
243: "(ProgressBar: #{@current}/#{@total})"
244: end
# File lib/more/facets/progressbar.rb, line 220
220: def set(count)
221: if count < 0
222: raise "invalid count less than zero: #{count}"
223: elsif count > @total
224: if @total_overflow
225: @total = count + 1
226: else
227: raise "invalid count greater than total: #{count}"
228: end
229: end
230: @current = count
231: show_progress
232: @previous = @current
233: end
# File lib/more/facets/progressbar.rb, line 193
193: def total_overflow=(boolv)
194: @total_overflow = boolv ? true : false
195: end
# File lib/more/facets/progressbar.rb, line 116
116: def bar
117: len = percentage * @bar_length / 100
118: sprintf("|%s%s|", @bar_mark * len, " " * (@bar_length - len))
119: end
# File lib/more/facets/progressbar.rb, line 55
55: def convert_bytes (bytes)
56: if bytes < 1024
57: sprintf("%6dB", bytes)
58: elsif bytes < 1024 * 1000 # 1000kb
59: sprintf("%5.1fKB", bytes.to_f / 1024)
60: elsif bytes < 1024 * 1024 * 1000 # 1000mb
61: sprintf("%5.1fMB", bytes.to_f / 1024 / 1024)
62: else
63: sprintf("%5.1fGB", bytes.to_f / 1024 / 1024 / 1024)
64: end
65: end
# File lib/more/facets/progressbar.rb, line 95
95: def elapsed
96: elapsed = Time.now - @start_time
97: sprintf("Time: %s", format_time(elapsed))
98: end
# File lib/more/facets/progressbar.rb, line 112
112: def eol
113: if @is_finished then "\n" else "\r" end
114: end
ETA stands for Estimated Time of Arrival.
# File lib/more/facets/progressbar.rb, line 85
85: def eta
86: if @current == 0
87: "ETA: --:--:--"
88: else
89: elapsed = Time.now - @start_time
90: eta = elapsed * @total / @current - elapsed;
91: sprintf("ETA: %s", format_time(eta))
92: end
93: end
# File lib/more/facets/progressbar.rb, line 76
76: def format_time(t)
77: t = t.to_i
78: sec = t % 60
79: min = (t / 60) % 60
80: hour = t / 3600
81: sprintf("%02d:%02d:%02d", hour, min, sec);
82: end
# File lib/more/facets/progressbar.rb, line 133
133: def get_width
134: # FIXME: I don't know how portable it is.
135: default_width = 80
136: begin
137: tiocgwinsz = 0x5413
138: data = [0, 0, 0, 0].pack("SSSS")
139: if @out.ioctl(tiocgwinsz, data) >= 0 then
140: rows, cols, xpixels, ypixels = data.unpack("SSSS")
141: if cols >= 0 then cols else default_width end
142: else
143: default_width
144: end
145: rescue Exception
146: default_width
147: end
148: end
# File lib/more/facets/progressbar.rb, line 121
121: def percentage
122: if @total.zero?
123: 100
124: else
125: @current * 100 / @total
126: end
127: end
# File lib/more/facets/progressbar.rb, line 150
150: def show
151: arguments = @format_arguments.map{|method| send(method)}
152: line = sprintf(@format, *arguments)
153:
154: width = get_width
155: if line.length == width - 1
156: @out.print(line + eol)
157: elsif line.length >= width
158: @bar_length = [@bar_length - (line.length - width + 1), 0].max
159: if @bar_length == 0 then @out.print(line + eol) else show end
160: else #line.length < width - 1
161: @bar_length += width - line.length + 1
162: show
163: end
164: end
# File lib/more/facets/progressbar.rb, line 166
166: def show_progress
167: if @total.zero?
168: cur_percentage = 100
169: prev_percentage = 0
170: else
171: cur_percentage = (@current * 100 / @total).to_i
172: prev_percentage = (@previous * 100 / @total).to_i
173: end
174:
175: if cur_percentage > prev_percentage || @is_finished
176: show
177: end
178: end
# File lib/more/facets/progressbar.rb, line 100
100: def stat
101: if @is_finished then elapsed else eta end
102: end
# File lib/more/facets/progressbar.rb, line 104
104: def stat_for_file_transfer
105: if @is_finished then
106: sprintf("%s %s %s", bytes, transfer_rate, elapsed)
107: else
108: sprintf("%s %s %s", bytes, transfer_rate, eta)
109: end
110: end