Sha256: 0ce038185804ea014c88a6bfb050e9bdc5c2ff97158ff75295747963a91cc60e

Contents?: true

Size: 1.72 KB

Versions: 3

Compression:

Stored size: 1.72 KB

Contents

# Used for IO objects that need to report the current offset at each operation that changes the said offset
# (useful for building progress bars that report on a file read operation)
class Tracksperanto::ProgressiveIO < DelegateClass(IO)
  
  # Should contain a block that accepts the current offset in bytes and the total size
  attr_accessor :progress_block
  
  # Get or set the total size of the contained IO. If the passed IO is a File object 
  # the size will be preset automatically
  attr_accessor :total_size
  
  def initialize(with_file)
    __setobj__(with_file)
    @total_size = with_file.stat.size if with_file.respond_to?(:stat)
  end
  
  def each(sep_string = $/, &blk)
    # Report offset at each call of the iterator
    result = super(sep_string) do | line |
      yield(line)
      notify_read
    end
  end
  alias_method :each_line, :each
  
  def each_byte(&blk)
    # Report offset at each call of the iterator
    super { |b| yield(b); notify_read }
  end
  
  def getc
    returning(super) { notify_read }
  end
  
  def gets
    returning(super) { notify_read }
  end
  
  def read(*a)
    returning(super) { notify_read }
  end
  
  def readbytes(*a)
    returning(super) { notify_read }
  end
  
  def readchar
    returning(super) { notify_read }
  end
  
  def readline(*a)
    returning(super) { notify_read }
  end
  
  def readlines(*a)
    returning(super) { notify_read }
  end
  
  def seek(*a)
    returning(super) { notify_read }
  end
  
  def ungetc(*a)
    returning(super) { notify_read }
  end 
  
  def pos=(p)
    returning(super) { notify_read }
  end
  
  private
    def returning(r)
      yield; r
    end
    
    def notify_read
      @progress_block.call(pos, @total_size) if @progress_block
    end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tracksperanto-1.8.1 lib/tracksperanto/progressive_io.rb
tracksperanto-1.8.0 lib/tracksperanto/progressive_io.rb
tracksperanto-1.7.5 lib/tracksperanto/progressive_io.rb