lib/axlsx/util/zip_command.rb in caxlsx-3.1.1 vs lib/axlsx/util/zip_command.rb in caxlsx-3.2.0

- old
+ new

@@ -1,73 +1,73 @@ -# encoding: UTF-8 -require 'open3' -require 'shellwords' - -module Axlsx - - # The ZipCommand class supports zipping the Excel file contents using - # a binary zip program instead of RubyZip's `Zip::OutputStream`. - # - # The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can - # be used as a drop-in replacement. Note that method signatures are not - # identical to `Zip::OutputStream`, they are only sufficiently close so that - # `ZipCommand` and `Zip::OutputStream` can be interchangeably used within - # `caxlsx`. - class ZipCommand - # Raised when the zip command exits with a non-zero status. - class ZipError < StandardError; end - - def initialize(zip_command) - @current_file = nil - @files = [] - @zip_command = zip_command - end - - # Create a temporary directory for writing files to. - # - # The directory and its contents are removed at the end of the block. - def open(output, &block) - Dir.mktmpdir do |dir| - @dir = dir - block.call(self) - write_file - zip_parts(output) - end - end - - # Closes the current entry and opens a new for writing. - def put_next_entry(entry) - write_file - @current_file = "#{@dir}/#{entry.name}" - @files << entry.name - FileUtils.mkdir_p(File.dirname(@current_file)) - end - - # Write to a buffer that will be written to the current entry - def write(content) - @buffer << content - end - alias << write - - private - - def write_file - if @current_file - @buffer.rewind - File.open(@current_file, "wb") { |f| f.write @buffer.read } - end - @current_file = nil - @buffer = StringIO.new - end - - def zip_parts(output) - output = Shellwords.shellescape(File.absolute_path(output)) - inputs = Shellwords.shelljoin(@files) - escaped_dir = Shellwords.shellescape(@dir) - command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}" - stdout_and_stderr, status = Open3.capture2e(command) - if !status.success? - raise(ZipError.new(stdout_and_stderr)) - end - end - end -end +# encoding: UTF-8 +require 'open3' +require 'shellwords' + +module Axlsx + + # The ZipCommand class supports zipping the Excel file contents using + # a binary zip program instead of RubyZip's `Zip::OutputStream`. + # + # The methods provided here mimic `Zip::OutputStream` so that `ZipCommand` can + # be used as a drop-in replacement. Note that method signatures are not + # identical to `Zip::OutputStream`, they are only sufficiently close so that + # `ZipCommand` and `Zip::OutputStream` can be interchangeably used within + # `caxlsx`. + class ZipCommand + # Raised when the zip command exits with a non-zero status. + class ZipError < StandardError; end + + def initialize(zip_command) + @current_file = nil + @files = [] + @zip_command = zip_command + end + + # Create a temporary directory for writing files to. + # + # The directory and its contents are removed at the end of the block. + def open(output, &block) + Dir.mktmpdir do |dir| + @dir = dir + block.call(self) + write_file + zip_parts(output) + end + end + + # Closes the current entry and opens a new for writing. + def put_next_entry(entry) + write_file + @current_file = "#{@dir}/#{entry.name}" + @files << entry.name + FileUtils.mkdir_p(File.dirname(@current_file)) + end + + # Write to a buffer that will be written to the current entry + def write(content) + @buffer << content + end + alias << write + + private + + def write_file + if @current_file + @buffer.rewind + File.open(@current_file, "wb") { |f| f.write @buffer.read } + end + @current_file = nil + @buffer = StringIO.new + end + + def zip_parts(output) + output = Shellwords.shellescape(File.absolute_path(output)) + inputs = Shellwords.shelljoin(@files) + escaped_dir = Shellwords.shellescape(@dir) + command = "cd #{escaped_dir} && #{@zip_command} #{output} #{inputs}" + stdout_and_stderr, status = Open3.capture2e(command) + if !status.success? + raise(ZipError.new(stdout_and_stderr)) + end + end + end +end