Sha256: a575ea79133d467286801c74968a93acf6852ff3f0e358a27ae077e5768f5f5c
Contents?: true
Size: 1.07 KB
Versions: 12
Compression:
Stored size: 1.07 KB
Contents
class FileReverseReader attr_reader :io, :step def initialize(io, step = 1024 * 1024 * 1) @io = io @step = step end def each_line(&block) io.seek(0, IO::SEEK_END) buf = "" loop do if reach_start_of_file? last_pos = io.pos io.seek(0, IO::SEEK_SET) buf.insert(0, io.read(last_pos)) split_each_line(buf, &block) break end io.seek(-1 * step, IO::SEEK_CUR) buf.insert(0, io.read(step)) io.seek(-1 * step, IO::SEEK_CUR) next if buf[$/].nil? gap = buf.index($/) buf.gsub!(/\A.*?\n/, "") split_each_line(buf, &block) buf = "" io.seek(gap, IO::SEEK_CUR) end end def tail(limit = 10) enum_for(:each_line).first(limit).reverse end def binary_file? sample = io.read(1024) || "" !sample.force_encoding('us-ascii').valid_encoding? ensure io.rewind end private def split_each_line(buf, &block) buf.split($/).reverse.each do |line| block.call(line) end end def reach_start_of_file? step >= io.pos end end
Version data entries
12 entries across 12 versions & 1 rubygems