Object
Ruby/ProgressBar - a text progress bar library
Copyright (C) 2001-2005 Satoru Takabayashi
All rights reserved. This is free software with ABSOLUTELY NO WARRANTY.
You can redistribute it and/or modify it under the terms of Ruby’s license.
# File lib/progressbar.rb, line 15 15: def initialize (title, total, out = STDERR) 16: @title = title 17: @total = total 18: @out = out 19: @terminal_width = 80 20: @bar_mark = "o" 21: @current = 0 22: @previous = 0 23: @finished_p = false 24: @start_time = Time.now 25: @previous_time = @start_time 26: @title_width = 14 27: @format = "%-#{@title_width}s %3d%% %s %s" 28: @format_arguments = [:title, :percentage, :bar, :stat] 29: clear 30: show 31: end
# File lib/progressbar.rb, line 178 178: def clear 179: @out.print "\r" 180: @out.print(" " * (get_width - 1)) 181: @out.print "\r" 182: end
# File lib/progressbar.rb, line 194 194: def file_transfer_mode 195: @format_arguments = [:title, :percentage, :bar, :stat_for_file_transfer] 196: end
# File lib/progressbar.rb, line 184 184: def finish 185: @current = @total 186: @finished_p = true 187: show 188: end
# File lib/progressbar.rb, line 190 190: def finished? 191: @finished_p 192: end
# File lib/progressbar.rb, line 198 198: def format= (format) 199: @format = format 200: end
# File lib/progressbar.rb, line 202 202: def format_arguments= (arguments) 203: @format_arguments = arguments 204: end
# File lib/progressbar.rb, line 206 206: def halt 207: @finished_p = true 208: show 209: end
# File lib/progressbar.rb, line 211 211: def inc (step = 1) 212: @current += step 213: @current = @total if @current > @total 214: show_if_needed 215: @previous = @current 216: end
# File lib/progressbar.rb, line 83 83: def bytes 84: convert_bytes(@current) 85: end
# File lib/progressbar.rb, line 66 66: def convert_bytes (bytes) 67: if bytes < 1024 68: sprintf("%6dB", bytes) 69: elsif bytes < 1024 * 1000 # 1000kb 70: sprintf("%5.1fKB", bytes.to_f / 1024) 71: elsif bytes < 1024 * 1024 * 1000 # 1000mb 72: sprintf("%5.1fMB", bytes.to_f / 1024 / 1024) 73: else 74: sprintf("%5.1fGB", bytes.to_f / 1024 / 1024 / 1024) 75: end 76: end
# File lib/progressbar.rb, line 115 115: def do_percentage 116: if @total.zero? 117: 100 118: else 119: @current * 100 / @total 120: end 121: end
# File lib/progressbar.rb, line 106 106: def elapsed 107: elapsed = Time.now - @start_time 108: sprintf("Time: %s", format_time(elapsed)) 109: end
# File lib/progressbar.rb, line 111 111: def eol 112: if @finished_p then "\n" else "\r" end 113: end
ETA stands for Estimated Time of Arrival.
# File lib/progressbar.rb, line 96 96: def eta 97: if @current == 0 98: "ETA: --:--:--" 99: else 100: elapsed = Time.now - @start_time 101: eta = elapsed * @total / @current - elapsed; 102: sprintf("ETA: %s", format_time(eta)) 103: end 104: end
# File lib/progressbar.rb, line 39 39: def fmt_bar 40: bar_width = do_percentage * @terminal_width / 100 41: sprintf("|%s%s|", 42: @bar_mark * bar_width, 43: " " * (@terminal_width - bar_width)) 44: end
# File lib/progressbar.rb, line 46 46: def fmt_percentage 47: do_percentage 48: end
# File lib/progressbar.rb, line 50 50: def fmt_stat 51: if @finished_p then elapsed else eta end 52: end
# File lib/progressbar.rb, line 54 54: def fmt_stat_for_file_transfer 55: if @finished_p then 56: sprintf("%s %s %s", bytes, transfer_rate, elapsed) 57: else 58: sprintf("%s %s %s", bytes, transfer_rate, eta) 59: end 60: end
# File lib/progressbar.rb, line 62 62: def fmt_title 63: @title[0,(@title_width - 1)] + ":" 64: end
# File lib/progressbar.rb, line 87 87: def format_time (t) 88: t = t.to_i 89: sec = t % 60 90: min = (t / 60) % 60 91: hour = t / 3600 92: sprintf("%02d:%02d:%02d", hour, min, sec); 93: end
# File lib/progressbar.rb, line 123 123: def get_width 124: # FIXME: I don't know how portable it is. 125: default_width = 80 126: begin 127: tiocgwinsz = 0x5413 128: data = [0, 0, 0, 0].pack("SSSS") 129: if @out.ioctl(tiocgwinsz, data) >= 0 then 130: rows, cols, xpixels, ypixels = data.unpack("SSSS") 131: if cols >= 0 then cols else default_width end 132: else 133: default_width 134: end 135: rescue Exception 136: default_width 137: end 138: end
# File lib/progressbar.rb, line 140 140: def show 141: arguments = @format_arguments.map {|method| 142: method = sprintf("fmt_%s", method) 143: send(method) 144: } 145: line = sprintf(@format, *arguments) 146: 147: width = get_width 148: if line.length == width - 1 149: @out.print(line + eol) 150: @out.flush 151: elsif line.length >= width 152: @terminal_width = [@terminal_width - (line.length - width + 1), 0].max 153: if @terminal_width == 0 then @out.print(line + eol) else show end 154: else # line.length < width - 1 155: @terminal_width += width - line.length + 1 156: show 157: end 158: @previous_time = Time.now 159: end
# File lib/progressbar.rb, line 161 161: def show_if_needed 162: if @total.zero? 163: cur_percentage = 100 164: prev_percentage = 0 165: else 166: cur_percentage = (@current * 100 / @total).to_i 167: prev_percentage = (@previous * 100 / @total).to_i 168: end 169: 170: # Use "!=" instead of ">" to support negative changes 171: if cur_percentage != prev_percentage || 172: Time.now - @previous_time >= 1 || @finished_p 173: show 174: end 175: end
Disabled; run with --debug to generate this.
Generated with the Darkfish Rdoc Generator 1.1.6.