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'