diff --git a/lib/zip/entry.rb b/lib/zip/entry.rb index d1241e56..9764d91d 100644 --- a/lib/zip/entry.rb +++ b/lib/zip/entry.rb @@ -83,14 +83,21 @@ def initialize( @ftype = name_is_directory? ? :directory : :file @zipfile = zipfile - @comment = comment - @compression_method = compression_method - @compression_level = compression_level - - @compressed_size = compressed_size - @crc = crc - @size = size - @time = time + @comment = comment || '' + @compression_method = compression_method || DEFLATED + @compression_level = compression_level || ::Zip.default_compression + + @compressed_size = compressed_size || 0 + @crc = crc || 0 + @size = size || 0 + @time = case time + when ::Zip::DOSTime + time + when Time + ::Zip::DOSTime.from_time(time) + else + ::Zip::DOSTime.now + end @extra = extra.kind_of?(ExtraField) ? extra : ExtraField.new(extra.to_s) diff --git a/lib/zip/output_stream.rb b/lib/zip/output_stream.rb index 58d2772c..a2290c5d 100644 --- a/lib/zip/output_stream.rb +++ b/lib/zip/output_stream.rb @@ -100,15 +100,15 @@ def put_next_entry( ) raise Error, 'zip stream is closed' if @closed - new_entry = if entry_name.kind_of?(Entry) - entry_name - else - Entry.new( - @file_name, entry_name.to_s, comment: comment, - extra: extra, compression_method: compression_method, - compression_level: level - ) - end + new_entry = + if entry_name.kind_of?(Entry) || entry_name.kind_of?(StreamableStream) + entry_name + else + Entry.new( + @file_name, entry_name.to_s, comment: comment, extra: extra, + compression_method: compression_method, compression_level: level + ) + end init_next_entry(new_entry) @current_entry = new_entry diff --git a/test/entry_test.rb b/test/entry_test.rb index 13d42963..f0e423f4 100644 --- a/test/entry_test.rb +++ b/test/entry_test.rb @@ -26,7 +26,10 @@ def test_constructor_and_getters assert_equal(TEST_COMPRESSIONMETHOD, entry.compression_method) assert_equal(TEST_NAME, entry.name) assert_equal(TEST_SIZE, entry.size) - assert_equal(TEST_TIME, entry.time) + + # Reverse times when testing because we need to use DOSTime#== for the + # comparison, not Time#==. + assert_equal(entry.time, TEST_TIME) end def test_is_directory_and_is_file diff --git a/test/file_test.rb b/test/file_test.rb index b93c4e0d..6476e798 100644 --- a/test/file_test.rb +++ b/test/file_test.rb @@ -95,7 +95,10 @@ def test_get_output_stream custom_entry_args[:compression_level], entry.compression_level ) assert_equal(custom_entry_args[:size], entry.size) - assert_equal(custom_entry_args[:time], entry.time) + + # Reverse times when testing because we need to use DOSTime#== for the + # comparison, not Time#==. + assert_equal(entry.time, custom_entry_args[:time]) zf.get_output_stream('entry.bin') do |os| os.write(::File.open('test/data/generated/5entry.zip', 'rb').read) @@ -110,6 +113,24 @@ def test_get_output_stream end end + def test_get_output_stream_with_entry + Dir.mktmpdir do |tmp| + test_zip = File.join(tmp, 'test.zip') + time = Time.new(1999, 12, 31) + + ::Zip::File.open(test_zip, create: true) do |zip| + entry = ::Zip::Entry.new(zip.name, 'entry.txt', time: time) + zip.get_output_stream(entry) { |out| out.puts 'CONTENT!' } + end + + ::Zip::File.open(test_zip) do |zip| + # Reverse times when testing because we need to use DOSTime#== for the + # comparison, not Time#==. + assert_equal(zip.get_entry('entry.txt').time, time) + end + end + end + def test_open_buffer_with_string data = File.read('test/data/rubycode.zip', mode: 'rb') string = data.dup