class Roku::Zip

Public Class Methods

generate(input, output) click to toggle source
# File lib/roku/zip.rb, line 14
def self.generate(input, output); new(input, output).write; end
new(inputDir, outputFile) click to toggle source

Initialize with the directory to zip and the location of the output archive.

# File lib/roku/zip.rb, line 25
def initialize(inputDir, outputFile)
  @inputDir = inputDir
  @outputFile = outputFile
end

Public Instance Methods

files_in(dir) click to toggle source
# File lib/roku/zip.rb, line 16
def files_in(dir)
  Dir.entries(dir).select {|file| file =~ /^[^\.]/ && !is_build_directory?(dir, file) }
end
is_build_directory?(current_directory, file) click to toggle source
# File lib/roku/zip.rb, line 20
def is_build_directory?(current_directory, file)
  !!(@outputFile =~ Regexp.new(current_directory + "/#{file}/(?:[^\/]*)\.zip"))
end
write() click to toggle source

Zip the input directory.

# File lib/roku/zip.rb, line 31
def write
  entries = files_in(@inputDir)
  io = ::Zip::File.open(@outputFile, ::Zip::File::CREATE);

  writeEntries(entries, "", io)
  io.close;
end

Private Instance Methods

writeEntries(entries, path, io) click to toggle source

A helper method to make the recursion work.

# File lib/roku/zip.rb, line 41
def writeEntries(entries, path, io)

  entries.each { |e|
    zipFilePath = path == "" ? e : ::File.join(path, e)
    diskFilePath = ::File.join(@inputDir, zipFilePath)
    puts "Deflating " + diskFilePath
    if  File.directory?(diskFilePath)
      io.mkdir(zipFilePath)
      subdir = files_in(diskFilePath)
      writeEntries(subdir, zipFilePath, io)
    else
      io.get_output_stream(zipFilePath) { |f| f.puts(File.open(diskFilePath, "rb").read())}
    end
  }
end