Sha256: 56b32ee66d6dad509032297ad1dea781778f2c2a21365d4f581843104bb02314

Contents?: true

Size: 1.6 KB

Versions: 4

Compression:

Stored size: 1.6 KB

Contents

require "metacrunch/fs"
require "rubygems/package"

module Metacrunch
  class Fs::Reader
    include Metacrunch::ParallelProcessableReader

    def initialize(filenames = nil)
      @filenames = [*filenames].map{|f| f.presence}.compact
    end

    def each(&block)
      return enum_for(__method__) unless block_given?

      offset = 0 + process_index

      while offset < @filenames.count do
        _filename = @filenames[offset]

        if is_archive?(_filename)
         read_archive(_filename, &block)
        else
         read_regular_file(_filename, &block)
        end

        offset += number_of_processes
      end
    end

  private

    def is_archive?(filename)
      filename.ends_with?(".tar") || filename.ends_with?(".tar.gz") || filename.ends_with?(".tgz")
    end

    def is_gzip_file?(filename)
      filename.ends_with?(".gz") || filename.ends_with?(".tgz")
    end

    def read_regular_file(filename, &block)
      if File.file?(filename)
        io = is_gzip_file?(filename) ? Zlib::GzipReader.open(filename) : File.open(filename, "r")
        yield Fs::Entry.new(filename: filename, archive_filename: nil, contents: io.read)
      end
    end

    def read_archive(filename, &block)
      io        = is_gzip_file?(filename) ? Zlib::GzipReader.open(filename) : File.open(filename, "r")
      tarReader = Gem::Package::TarReader.new(io)

      tarReader.each do |_tar_entry|
        if _tar_entry.file?
          yield Fs::Entry.new(
            filename: filename,
            archive_filename: _tar_entry.full_name,
            contents: _tar_entry.read
          )
        end
      end
    end

  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
metacrunch-3.1.4 lib/metacrunch/fs/reader.rb
metacrunch-3.1.3 lib/metacrunch/fs/reader.rb
metacrunch-3.1.2 lib/metacrunch/fs/reader.rb
metacrunch-3.1.1 lib/metacrunch/fs/reader.rb