class FileComposer::Documents::Zip

Can compress documents together into a zip file.

Attributes

blueprint[R]

Public Class Methods

new(filename:, blueprint: {}) click to toggle source
Calls superclass method FileComposer::Documents::Base::new
# File lib/file_composer/documents/zip.rb, line 18
def initialize(filename:, blueprint: {})
  super(filename: filename)

  @blueprint = Blueprint.make(blueprint)
end

Public Instance Methods

write!(temp_root = '', store = Stores::Null.new) click to toggle source
# File lib/file_composer/documents/zip.rb, line 24
def write!(temp_root = '', store = Stores::Null.new)
  results               = blueprint.write!(temp_root)
  write_time_in_seconds = results.sum(&:time_in_seconds)
  physical_filename     = nil

  zip_time_in_seconds = Benchmark.measure do
    physical_filename = zip!(temp_root, results)
  end.real

  total_time_in_seconds = write_time_in_seconds + zip_time_in_seconds

  cleanup(results)

  final_filename = store.move!(physical_filename)
  file_result = FileResult.new(filename, final_filename)

  Result.new(file_result, total_time_in_seconds)
end

Private Instance Methods

cleanup(results) click to toggle source
# File lib/file_composer/documents/zip.rb, line 57
def cleanup(results)
  results.each do |result|
    result.file_results.each do |file_result|
      FileUtils.rm(file_result.physical_filename, force: true)
    end
  end
end
zip!(temp_root, results) click to toggle source
# File lib/file_composer/documents/zip.rb, line 45
def zip!(temp_root, results)
  make_temp_filename(temp_root).tap do |physical_filename|
    ::Zip::File.open(physical_filename, ::Zip::File::CREATE) do |zipfile|
      results.each do |result|
        result.file_results.each do |file_result|
          zipfile.add(file_result.logical_filename, file_result.physical_filename)
        end
      end
    end
  end
end