Sha256: 0e714eb5a8b235d40dcb6021c48c88255f69cf7017d36e00f1d7b2e38426f289

Contents?: true

Size: 1.2 KB

Versions: 2

Compression:

Stored size: 1.2 KB

Contents

require 'progress'

class Progress
  class WithProgress
    include Enumerable

    attr_reader :enumerable, :title

    # initialize with object responding to each, title and optional length
    # if block is provided, it is passed to each
    def initialize(enumerable, title, length = nil, &block)
      @enumerable, @title, @length = enumerable, title, length
      each(&block) if block
    end

    # each object with progress
    def each
      enumerable, length = case
      when @length
        [@enumerable, @length]
      when !@enumerable.respond_to?(:length) || @enumerable.is_a?(String) || (defined?(StringIO) && @enumerable.is_a?(StringIO)) || (defined?(TempFile) && @enumerable.is_a?(TempFile))
        elements = @enumerable.each.to_a
        [elements, elements.length]
      else
        [@enumerable, @enumerable.length]
      end

      Progress.start(@title, length) do
        enumerable.each do |object|
          Progress.step do
            yield object
          end
        end
        @enumerable
      end
    end

    # returns self but changes title
    def with_progress(title = nil, length = nil, &block)
      self.class.new(@enumerable, title, length || @length, &block)
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
progress-2.4.0 lib/progress/with_progress.rb
progress-2.3.0 lib/progress/with_progress.rb