lib/io_streams/zip/reader.rb in iostreams-0.20.3 vs lib/io_streams/zip/reader.rb in iostreams-1.0.0.beta

- old
+ new

@@ -1,8 +1,8 @@ module IOStreams module Zip - class Reader + class Reader < IOStreams::Reader # Read from a zip file or stream, decompressing the contents as it is read # The input stream from the first file found in the zip file is passed # to the supplied block. # # Parameters: @@ -15,49 +15,30 @@ # # Read 256 bytes at a time # while data = io_stream.read(256) # puts data # end # end - def self.open(file_name_or_io, entry_file_name: nil, &block) - # File name supplied - return read_file(file_name_or_io, entry_file_name, &block) unless IOStreams.reader_stream?(file_name_or_io) - - # Ruby ZIP gem uses `#seek` so can only work against a file, not a stream, so create temp file. - # JRuby ZIP requires an InputStream. - IOStreams::File::Path.temp_file_name('iostreams_zip') do |temp_file_name| - IOStreams.copy(file_name_or_io, temp_file_name, target_options: {streams: []}) - read_file(temp_file_name, entry_file_name, &block) - end - end - if defined?(JRuby) # Java has built-in support for Zip files - def self.read_file(file_name, entry_file_name) + def self.file(file_name, entry_file_name: nil) fin = Java::JavaIo::FileInputStream.new(file_name) zin = Java::JavaUtilZip::ZipInputStream.new(fin) get_entry(zin, entry_file_name) || - raise(Java::JavaUtilZip::ZipException.new("File #{entry_file_name} not found within zip file.")) + raise(Java::JavaUtilZip::ZipException, "File #{entry_file_name} not found within zip file.") yield(zin.to_io) ensure - zin.close if zin - fin.close if fin + zin&.close + fin&.close end else # Read from a zip file or stream, decompressing the contents as it is read # The input stream from the first file found in the zip file is passed # to the supplied block - def self.read_file(file_name, entry_file_name) - if !defined?(::Zip) - # MRI needs Ruby Zip, since it only has native support for GZip - begin - require 'zip' - rescue LoadError => exc - raise(LoadError, "Install gem 'rubyzip' to read and write Zip files: #{exc.message}") - end - end + def self.file(file_name, entry_file_name: nil) + Utils.load_dependency('rubyzip', 'Zip', 'zip') unless defined?(::Zip) ::Zip::InputStream.open(file_name) do |zin| get_entry(zin, entry_file_name) || raise(::Zip::EntryNameError, "File #{entry_file_name} not found within zip file.") yield(zin)