lib/progress.rb in progress-0.0.1 vs lib/progress.rb in progress-0.0.3

- old
+ new

@@ -1,42 +1,99 @@ +$:.unshift(File.dirname(__FILE__)) unless + $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) + +require 'singleton' + class Progress + VERSION = '0.0.3' + + include Singleton + + # start progress indication + # ==== Procedural example + # Progress.start('Test', 1000) + # 1000.times{ Progress.step } + # Progress.stop + # ==== Block example + # Progress.start('Test', 1000) do + # 1000.times{ Progress.step } + # end + # ==== Enclosed block example + # [1, 2, 3].each_with_progress('1 2 3') do |one_of_1_2_3| + # 10.times_with_progress('10') do |one_of_10| + # sleep(0.001) + # end + # end def self.start(name, total = 100) - @io ||= $stdout - @io.sync = true - - @each = total / 1000 - @count = 0 + levels << new(name, total, levels.length) + print_message + if block_given? + yield + stop + end + end - @current = 0 - @total = total + def self.step + levels[-1].step + print_message + end + + def self.stop + levels.pop.stop + @io.puts if levels.empty? + end + + def self.io=(io) # :nodoc: + @io = io + end + + def initialize(name, total, level) # :nodoc: @name = name + ': %s' - message highight('...') - yield - message percent - @io.puts + @total = total + @level = level + @current = 0 + start end - def self.step + def start # :nodoc: + self.message = '.' * 6 + end + + def step # :nodoc: @current += 1 - if (@count += 1) >= @each - message highight(percent) - @count = 0 - end + self.message = percent end -private + def stop # :nodoc: + self.message = percent + end - def self.percent - '%5.1f%%' % (@current * 100.0 / @total) + def message # :nodoc: + @message end - - def self.message(s) - @io.print "\r\e[0K#{@name % s}" + +protected + + def self.print_message + message = levels.map{ |level| level.message } * ' > ' + @io ||= $stdout + @io.sync = true + @io.print "\r" + message.ljust(@previous_length || 0).gsub(/\d+\.\d+/){ |s| s == '100.0' ? s : "\e[1m#{s}\e[0m" } + @previous_length = message.length end - def self.highight(s) - "\e[1m#{s}\e[0m" + def self.levels + @levels ||= [] end + + def percent + '%5.1f%%' % (@current * 100.0 / @total) + end + + def message=(s) + formatted = s.ljust(6)[0, 6] + @message = @name % formatted + end end -require 'enumerable' -require 'integer' +require 'progress/enumerable' +require 'progress/integer'