lib/progress.rb in progress-0.0.7.1 vs lib/progress.rb in progress-0.0.8

- old
+ new

@@ -2,11 +2,11 @@ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__))) require 'singleton' class Progress - VERSION = '0.0.7.1' + VERSION = '0.0.8' include Singleton # start progress indication # ==== Procedural example @@ -27,38 +27,29 @@ # [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 = 1) - levels << new(name, total, levels.length) + # ==== To output progress as lines (not trying to stay on line) + # Progress.start('Test', 1000, :lines => true) do + # 1000.times{ Progress.step } + # end + def self.start(name, total = 1, options = {}) + levels << new(name, total, levels.length, options) print_message if block_given? result = yield stop result end end - def self.step(steps = 1) - levels[-1].step(steps) - 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: + def initialize(name, total, level, options) # :nodoc: @name = name + ': %s' @total = total @level = level + @options = options @current = 0 start end def start # :nodoc: @@ -76,31 +67,58 @@ def message # :nodoc: @message end -protected - - def self.print_message - message = levels.map{ |level| level.message } * ' > ' - @io ||= $stderr - @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 + def options # :nodoc: + @options end - def self.levels - @levels ||= [] - end +protected def percent '%5.1f%%' % (@current * 100.0 / @total) end def message=(s) formatted = s.ljust(6)[0, 6] @message = @name % formatted end + + module ClassMethods + def step(steps = 1) + levels[-1].step(steps) + print_message + end + + def stop + levels.pop.stop + @io.puts if levels.empty? + end + + def io=(io) # :nodoc: + @io = io + end + + protected + + def print_message + message = levels.map{ |level| level.message } * ' > ' + @io ||= $stderr + @io.sync = true + if @io.tty? && !levels.any?{ |level| level.options[:lines] } + @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 + else + @io.puts message + end + end + + def levels + @levels ||= [] + end + end + extend ClassMethods end require 'progress/enumerable' require 'progress/integer'