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)