rubyzip 1.1.7 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +143 -54
  3. data/Rakefile +3 -4
  4. data/lib/zip/central_directory.rb +8 -8
  5. data/lib/zip/compressor.rb +1 -2
  6. data/lib/zip/constants.rb +5 -5
  7. data/lib/zip/crypto/null_encryption.rb +4 -6
  8. data/lib/zip/crypto/traditional_encryption.rb +5 -5
  9. data/lib/zip/decompressor.rb +3 -3
  10. data/lib/zip/deflater.rb +8 -6
  11. data/lib/zip/dos_time.rb +5 -6
  12. data/lib/zip/entry.rb +132 -128
  13. data/lib/zip/entry_set.rb +14 -14
  14. data/lib/zip/errors.rb +2 -0
  15. data/lib/zip/extra_field/generic.rb +8 -8
  16. data/lib/zip/extra_field/ntfs.rb +14 -16
  17. data/lib/zip/extra_field/old_unix.rb +9 -10
  18. data/lib/zip/extra_field/universal_time.rb +14 -14
  19. data/lib/zip/extra_field/unix.rb +8 -9
  20. data/lib/zip/extra_field/zip64.rb +12 -11
  21. data/lib/zip/extra_field/zip64_placeholder.rb +1 -2
  22. data/lib/zip/extra_field.rb +8 -8
  23. data/lib/zip/file.rb +88 -81
  24. data/lib/zip/filesystem.rb +144 -143
  25. data/lib/zip/inflater.rb +5 -5
  26. data/lib/zip/input_stream.rb +22 -13
  27. data/lib/zip/ioextras/abstract_input_stream.rb +6 -10
  28. data/lib/zip/ioextras/abstract_output_stream.rb +3 -5
  29. data/lib/zip/ioextras.rb +1 -3
  30. data/lib/zip/null_compressor.rb +2 -2
  31. data/lib/zip/null_decompressor.rb +3 -3
  32. data/lib/zip/null_input_stream.rb +0 -0
  33. data/lib/zip/output_stream.rb +13 -14
  34. data/lib/zip/pass_thru_compressor.rb +4 -4
  35. data/lib/zip/pass_thru_decompressor.rb +3 -4
  36. data/lib/zip/streamable_directory.rb +2 -2
  37. data/lib/zip/streamable_stream.rb +3 -3
  38. data/lib/zip/version.rb +1 -1
  39. data/lib/zip.rb +13 -5
  40. data/samples/example.rb +29 -39
  41. data/samples/example_filesystem.rb +16 -18
  42. data/samples/example_recursive.rb +31 -25
  43. data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +23 -25
  44. data/samples/qtzip.rb +18 -27
  45. data/samples/write_simple.rb +12 -13
  46. data/samples/zipfind.rb +26 -34
  47. data/test/basic_zip_file_test.rb +11 -15
  48. data/test/case_sensitivity_test.rb +69 -0
  49. data/test/central_directory_entry_test.rb +32 -36
  50. data/test/central_directory_test.rb +46 -50
  51. data/test/crypto/null_encryption_test.rb +8 -4
  52. data/test/crypto/traditional_encryption_test.rb +5 -5
  53. data/test/data/gpbit3stored.zip +0 -0
  54. data/test/data/notzippedruby.rb +1 -1
  55. data/test/data/oddExtraField.zip +0 -0
  56. data/test/data/path_traversal/Makefile +10 -0
  57. data/test/data/path_traversal/jwilk/README.md +5 -0
  58. data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
  59. data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
  60. data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
  61. data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
  62. data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
  63. data/test/data/path_traversal/jwilk/relative0.zip +0 -0
  64. data/test/data/path_traversal/jwilk/relative2.zip +0 -0
  65. data/test/data/path_traversal/jwilk/symlink.zip +0 -0
  66. data/test/data/path_traversal/relative1.zip +0 -0
  67. data/test/data/path_traversal/tilde.zip +0 -0
  68. data/test/data/path_traversal/tuzovakaoff/README.md +3 -0
  69. data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
  70. data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
  71. data/test/data/rubycode.zip +0 -0
  72. data/test/data/test.xls +0 -0
  73. data/test/deflater_test.rb +10 -12
  74. data/test/encryption_test.rb +2 -2
  75. data/test/entry_set_test.rb +50 -25
  76. data/test/entry_test.rb +76 -87
  77. data/test/errors_test.rb +1 -2
  78. data/test/extra_field_test.rb +19 -21
  79. data/test/file_extract_directory_test.rb +12 -14
  80. data/test/file_extract_test.rb +94 -39
  81. data/test/file_permissions_test.rb +65 -0
  82. data/test/file_split_test.rb +24 -27
  83. data/test/file_test.rb +286 -179
  84. data/test/filesystem/dir_iterator_test.rb +13 -17
  85. data/test/filesystem/directory_test.rb +101 -93
  86. data/test/filesystem/file_mutating_test.rb +52 -65
  87. data/test/filesystem/file_nonmutating_test.rb +223 -229
  88. data/test/filesystem/file_stat_test.rb +17 -19
  89. data/test/gentestfiles.rb +54 -62
  90. data/test/inflater_test.rb +1 -1
  91. data/test/input_stream_test.rb +52 -40
  92. data/test/ioextras/abstract_input_stream_test.rb +22 -23
  93. data/test/ioextras/abstract_output_stream_test.rb +33 -33
  94. data/test/ioextras/fake_io_test.rb +1 -1
  95. data/test/local_entry_test.rb +36 -38
  96. data/test/output_stream_test.rb +20 -21
  97. data/test/pass_thru_compressor_test.rb +5 -6
  98. data/test/pass_thru_decompressor_test.rb +0 -1
  99. data/test/path_traversal_test.rb +141 -0
  100. data/test/samples/example_recursive_test.rb +37 -0
  101. data/test/settings_test.rb +18 -15
  102. data/test/test_helper.rb +52 -46
  103. data/test/unicode_file_names_and_comments_test.rb +17 -7
  104. data/test/zip64_full_test.rb +10 -12
  105. data/test/zip64_support_test.rb +0 -1
  106. metadata +100 -66
data/test/file_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'test_helper'
2
2
 
3
-
4
3
  class ZipFileTest < MiniTest::Test
5
4
  include CommonZipFileFixture
5
+ include ZipEntryData
6
6
 
7
7
  OK_DELETE_FILE = 'test/data/generated/okToDelete.txt'
8
8
  OK_DELETE_MOVED_FILE = 'test/data/generated/okToDeleteMoved.txt'
@@ -11,12 +11,12 @@ class ZipFileTest < MiniTest::Test
11
11
  ::Zip.write_zip64_support = false
12
12
  end
13
13
 
14
- def test_createFromScratchToBuffer
15
- comment = "a short comment"
14
+ def test_create_from_scratch_to_buffer
15
+ comment = 'a short comment'
16
16
 
17
17
  buffer = ::Zip::File.add_buffer do |zf|
18
- zf.get_output_stream("myFile") { |os| os.write "myFile contains just this" }
19
- zf.mkdir("dir1")
18
+ zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
19
+ zf.mkdir('dir1')
20
20
  zf.comment = comment
21
21
  end
22
22
 
@@ -27,12 +27,12 @@ class ZipFileTest < MiniTest::Test
27
27
  assert_equal(2, zfRead.entries.length)
28
28
  end
29
29
 
30
- def test_createFromScratch
31
- comment = "a short comment"
30
+ def test_create_from_scratch
31
+ comment = 'a short comment'
32
32
 
33
33
  zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
34
- zf.get_output_stream("myFile") { |os| os.write "myFile contains just this" }
35
- zf.mkdir("dir1")
34
+ zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
35
+ zf.mkdir('dir1')
36
36
  zf.comment = comment
37
37
  zf.close
38
38
 
@@ -41,31 +41,47 @@ class ZipFileTest < MiniTest::Test
41
41
  assert_equal(2, zfRead.entries.length)
42
42
  end
43
43
 
44
+ def test_create_from_scratch_with_old_create_parameter
45
+ comment = 'a short comment'
46
+
47
+ zf = ::Zip::File.new(EMPTY_FILENAME, 1)
48
+ zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
49
+ zf.mkdir('dir1')
50
+ zf.comment = comment
51
+ zf.close
52
+
53
+ zfRead = ::Zip::File.new(EMPTY_FILENAME)
54
+ assert_equal(comment, zfRead.comment)
55
+ assert_equal(2, zfRead.entries.length)
56
+ end
57
+
58
+ def test_get_input_stream_stored_with_gpflag_bit3
59
+ ::Zip::File.open('test/data/gpbit3stored.zip') do |zf|
60
+ assert_equal("foo\n", zf.read("foo.txt"))
61
+ end
62
+ end
63
+
44
64
  def test_get_output_stream
45
65
  entryCount = nil
46
- ::Zip::File.open(TEST_ZIP.zip_name) {
47
- |zf|
66
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
48
67
  entryCount = zf.size
49
- zf.get_output_stream('newEntry.txt') {
50
- |os|
51
- os.write "Putting stuff in newEntry.txt"
52
- }
53
- assert_equal(entryCount+1, zf.size)
54
- assert_equal("Putting stuff in newEntry.txt", zf.read("newEntry.txt"))
55
-
56
- zf.get_output_stream(zf.get_entry('test/data/generated/empty.txt')) {
57
- |os|
58
- os.write "Putting stuff in data/generated/empty.txt"
59
- }
60
- assert_equal(entryCount+1, zf.size)
61
- assert_equal("Putting stuff in data/generated/empty.txt", zf.read("test/data/generated/empty.txt"))
62
-
63
- custom_entry_args = [ZipEntryTest::TEST_COMMENT, ZipEntryTest::TEST_EXTRA, ZipEntryTest::TEST_COMPRESSED_SIZE, ZipEntryTest::TEST_CRC, ::Zip::Entry::STORED, ZipEntryTest::TEST_SIZE, ZipEntryTest::TEST_TIME]
64
- zf.get_output_stream('entry_with_custom_args.txt', nil, *custom_entry_args) {
65
- |os|
66
- os.write "Some data"
67
- }
68
- assert_equal(entryCount+2, zf.size)
68
+ zf.get_output_stream('newEntry.txt') do |os|
69
+ os.write 'Putting stuff in newEntry.txt'
70
+ end
71
+ assert_equal(entryCount + 1, zf.size)
72
+ assert_equal('Putting stuff in newEntry.txt', zf.read('newEntry.txt'))
73
+
74
+ zf.get_output_stream(zf.get_entry('test/data/generated/empty.txt')) do |os|
75
+ os.write 'Putting stuff in data/generated/empty.txt'
76
+ end
77
+ assert_equal(entryCount + 1, zf.size)
78
+ assert_equal('Putting stuff in data/generated/empty.txt', zf.read('test/data/generated/empty.txt'))
79
+
80
+ custom_entry_args = [TEST_COMMENT, TEST_EXTRA, TEST_COMPRESSED_SIZE, TEST_CRC, ::Zip::Entry::STORED, TEST_SIZE, TEST_TIME]
81
+ zf.get_output_stream('entry_with_custom_args.txt', nil, *custom_entry_args) do |os|
82
+ os.write 'Some data'
83
+ end
84
+ assert_equal(entryCount + 2, zf.size)
69
85
  entry = zf.get_entry('entry_with_custom_args.txt')
70
86
  assert_equal(custom_entry_args[0], entry.comment)
71
87
  assert_equal(custom_entry_args[2], entry.compressed_size)
@@ -74,26 +90,95 @@ class ZipFileTest < MiniTest::Test
74
90
  assert_equal(custom_entry_args[5], entry.size)
75
91
  assert_equal(custom_entry_args[6], entry.time)
76
92
 
77
- zf.get_output_stream('entry.bin') {
78
- |os|
93
+ zf.get_output_stream('entry.bin') do |os|
79
94
  os.write(::File.open('test/data/generated/5entry.zip', 'rb').read)
80
- }
81
- }
95
+ end
96
+ end
97
+
98
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
99
+ assert_equal(entryCount + 3, zf.size)
100
+ assert_equal('Putting stuff in newEntry.txt', zf.read('newEntry.txt'))
101
+ assert_equal('Putting stuff in data/generated/empty.txt', zf.read('test/data/generated/empty.txt'))
102
+ assert_equal(File.open('test/data/generated/5entry.zip', 'rb').read, zf.read('entry.bin'))
103
+ end
104
+ end
105
+
106
+ def test_open_buffer_with_string
107
+ string = File.read('test/data/rubycode.zip')
108
+ ::Zip::File.open_buffer string do |zf|
109
+ assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
110
+ end
111
+ end
112
+
113
+ def test_open_buffer_with_stringio
114
+ string_io = StringIO.new File.read('test/data/rubycode.zip')
115
+ ::Zip::File.open_buffer string_io do |zf|
116
+ assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
117
+ end
118
+ end
119
+
120
+ def test_close_buffer_with_stringio
121
+ string_io = StringIO.new File.read('test/data/rubycode.zip')
122
+ zf = ::Zip::File.open_buffer string_io
123
+ assert_nil zf.close
124
+ end
125
+
126
+ def test_open_buffer_no_op_does_not_change_file
127
+ Dir.mktmpdir do |tmp|
128
+ test_zip = File.join(tmp, 'test.zip')
129
+ FileUtils.cp 'test/data/rubycode.zip', test_zip
130
+
131
+ # Note: this may change the file if it is opened with r+b instead of rb.
132
+ # The 'extra fields' in this particular zip file get reordered.
133
+ File.open(test_zip, 'rb') do |file|
134
+ Zip::File.open_buffer(file) do |zf|
135
+ nil # do nothing
136
+ end
137
+ end
138
+
139
+ assert_equal \
140
+ File.binread('test/data/rubycode.zip'),
141
+ File.binread(test_zip)
142
+ end
143
+ end
144
+
145
+ def test_open_buffer_close_does_not_change_file
146
+ Dir.mktmpdir do |tmp|
147
+ test_zip = File.join(tmp, 'test.zip')
148
+ FileUtils.cp 'test/data/rubycode.zip', test_zip
149
+
150
+ File.open(test_zip, 'rb') do |file|
151
+ zf = Zip::File.open_buffer(file)
152
+ refute zf.commit_required?
153
+ assert_nil zf.close
154
+ end
82
155
 
83
- ::Zip::File.open(TEST_ZIP.zip_name) {
84
- |zf|
85
- assert_equal(entryCount+3, zf.size)
86
- assert_equal("Putting stuff in newEntry.txt", zf.read("newEntry.txt"))
87
- assert_equal("Putting stuff in data/generated/empty.txt", zf.read("test/data/generated/empty.txt"))
88
- assert_equal(File.open('test/data/generated/5entry.zip', 'rb').read, zf.read("entry.bin"))
89
- }
156
+ assert_equal \
157
+ File.binread('test/data/rubycode.zip'),
158
+ File.binread(test_zip)
159
+ end
160
+ end
161
+
162
+ def test_open_buffer_with_io_and_block
163
+ File.open('test/data/rubycode.zip') do |io|
164
+ io.set_encoding(Encoding::BINARY) # not strictly required but can be set
165
+ Zip::File.open_buffer(io) do |zip_io|
166
+ # left empty on purpose
167
+ end
168
+ end
169
+ end
170
+
171
+ def test_open_buffer_without_block
172
+ string_io = StringIO.new File.read('test/data/rubycode.zip')
173
+ zf = ::Zip::File.open_buffer string_io
174
+ assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
90
175
  end
91
176
 
92
177
  def test_cleans_up_tempfiles_after_close
93
178
  zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
94
- zf.get_output_stream("myFile") do |os|
179
+ zf.get_output_stream('myFile') do |os|
95
180
  @tempfile_path = os.path
96
- os.write "myFile contains just this"
181
+ os.write 'myFile contains just this'
97
182
  end
98
183
 
99
184
  assert_equal(true, File.exist?(@tempfile_path))
@@ -104,68 +189,83 @@ class ZipFileTest < MiniTest::Test
104
189
  end
105
190
 
106
191
  def test_add
107
- srcFile = "test/data/file2.txt"
108
- entryName = "newEntryName.rb"
192
+ srcFile = 'test/data/file2.txt'
193
+ entryName = 'newEntryName.rb'
109
194
  assert(::File.exist?(srcFile))
110
195
  zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
111
196
  zf.add(entryName, srcFile)
112
197
  zf.close
113
198
 
114
199
  zfRead = ::Zip::File.new(EMPTY_FILENAME)
115
- assert_equal("", zfRead.comment)
200
+ assert_equal('', zfRead.comment)
116
201
  assert_equal(1, zfRead.entries.length)
117
202
  assert_equal(entryName, zfRead.entries.first.name)
118
203
  AssertEntry.assert_contents(srcFile,
119
204
  zfRead.get_input_stream(entryName) { |zis| zis.read })
120
205
  end
121
206
 
207
+ def test_add_stored
208
+ srcFile = 'test/data/file2.txt'
209
+ entryName = 'newEntryName.rb'
210
+ assert(::File.exist?(srcFile))
211
+ zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
212
+ zf.add_stored(entryName, srcFile)
213
+ zf.close
214
+
215
+ zfRead = ::Zip::File.new(EMPTY_FILENAME)
216
+ entry = zfRead.entries.first
217
+ assert_equal('', zfRead.comment)
218
+ assert_equal(1, zfRead.entries.length)
219
+ assert_equal(entryName, entry.name)
220
+ assert_equal(File.size(srcFile), entry.size)
221
+ assert_equal(entry.size, entry.compressed_size)
222
+ assert_equal(::Zip::Entry::STORED, entry.compression_method)
223
+ AssertEntry.assert_contents(srcFile,
224
+ zfRead.get_input_stream(entryName) { |zis| zis.read })
225
+ end
226
+
122
227
  def test_recover_permissions_after_add_files_to_archive
123
228
  srcZip = TEST_ZIP.zip_name
124
- ::File.chmod(0664, srcZip)
125
- srcFile = "test/data/file2.txt"
126
- entryName = "newEntryName.rb"
127
- assert_equal(::File.stat(srcZip).mode, 0100664)
229
+ ::File.chmod(0o664, srcZip)
230
+ srcFile = 'test/data/file2.txt'
231
+ entryName = 'newEntryName.rb'
232
+ assert_equal(::File.stat(srcZip).mode, 0o100664)
128
233
  assert(::File.exist?(srcZip))
129
234
  zf = ::Zip::File.new(srcZip, ::Zip::File::CREATE)
130
235
  zf.add(entryName, srcFile)
131
236
  zf.close
132
- assert_equal(::File.stat(srcZip).mode, 0100664)
237
+ assert_equal(::File.stat(srcZip).mode, 0o100664)
133
238
  end
134
239
 
135
- def test_addExistingEntryName
136
- assert_raises(::Zip::EntryExistsError) {
137
- ::Zip::File.open(TEST_ZIP.zip_name) {
138
- |zf|
139
- zf.add(zf.entries.first.name, "test/data/file2.txt")
140
- }
141
- }
240
+ def test_add_existing_entry_name
241
+ assert_raises(::Zip::EntryExistsError) do
242
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
243
+ zf.add(zf.entries.first.name, 'test/data/file2.txt')
244
+ end
245
+ end
142
246
  end
143
247
 
144
- def test_addExistingEntryNameReplace
248
+ def test_add_existing_entry_name_replace
145
249
  gotCalled = false
146
250
  replacedEntry = nil
147
- ::Zip::File.open(TEST_ZIP.zip_name) {
148
- |zf|
251
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
149
252
  replacedEntry = zf.entries.first.name
150
- zf.add(replacedEntry, "test/data/file2.txt") { gotCalled = true; true }
151
- }
253
+ zf.add(replacedEntry, 'test/data/file2.txt') { gotCalled = true; true }
254
+ end
152
255
  assert(gotCalled)
153
- ::Zip::File.open(TEST_ZIP.zip_name) {
154
- |zf|
155
- assert_contains(zf, replacedEntry, "test/data/file2.txt")
156
- }
256
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
257
+ assert_contains(zf, replacedEntry, 'test/data/file2.txt')
258
+ end
157
259
  end
158
260
 
159
- def test_addDirectory
160
- ::Zip::File.open(TEST_ZIP.zip_name) {
161
- |zf|
261
+ def test_add_directory
262
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
162
263
  zf.add(TestFiles::EMPTY_TEST_DIR, TestFiles::EMPTY_TEST_DIR)
163
- }
164
- ::Zip::File.open(TEST_ZIP.zip_name) {
165
- |zf|
166
- dirEntry = zf.entries.detect { |e| e.name == TestFiles::EMPTY_TEST_DIR+"/" }
264
+ end
265
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
266
+ dirEntry = zf.entries.detect { |e| e.name == TestFiles::EMPTY_TEST_DIR + '/' }
167
267
  assert(dirEntry.directory?)
168
- }
268
+ end
169
269
  end
170
270
 
171
271
  def test_remove
@@ -193,7 +293,7 @@ class ZipFileTest < MiniTest::Test
193
293
  assert(zf.entries.map { |e| e.name }.include?(entryToRename))
194
294
 
195
295
  contents = zf.read(entryToRename)
196
- newName = "changed entry name"
296
+ newName = 'changed entry name'
197
297
  assert(!zf.entries.map { |e| e.name }.include?(newName))
198
298
 
199
299
  zf.rename(entryToRename, newName)
@@ -211,16 +311,14 @@ class ZipFileTest < MiniTest::Test
211
311
 
212
312
  def test_rename_with_each
213
313
  zf_name = 'test_rename_zip.zip'
214
- if ::File.exist?(zf_name)
215
- ::File.unlink(zf_name)
216
- end
314
+ ::File.unlink(zf_name) if ::File.exist?(zf_name)
217
315
  arr = []
218
316
  arr_renamed = []
219
317
  ::Zip::File.open(zf_name, ::Zip::File::CREATE) do |zf|
220
318
  zf.mkdir('test')
221
319
  arr << 'test/'
222
320
  arr_renamed << 'Ztest/'
223
- %w(a b c d).each do |f|
321
+ %w[a b c d].each do |f|
224
322
  zf.get_output_stream("test/#{f}") { |file| file.puts 'aaaa' }
225
323
  arr << "test/#{f}"
226
324
  arr_renamed << "Ztest/#{f}"
@@ -229,7 +327,7 @@ class ZipFileTest < MiniTest::Test
229
327
  zf = ::Zip::File.open(zf_name)
230
328
  assert_equal(zf.entries.map(&:name), arr)
231
329
  zf.close
232
- Zip::File.open(zf_name, "wb") do |z|
330
+ Zip::File.open(zf_name, 'wb') do |z|
233
331
  z.each do |f|
234
332
  z.rename(f, "Z#{f.name}")
235
333
  end
@@ -237,12 +335,10 @@ class ZipFileTest < MiniTest::Test
237
335
  zf = ::Zip::File.open(zf_name)
238
336
  assert_equal(zf.entries.map(&:name), arr_renamed)
239
337
  zf.close
240
- if ::File.exist?(zf_name)
241
- ::File.unlink(zf_name)
242
- end
338
+ ::File.unlink(zf_name) if ::File.exist?(zf_name)
243
339
  end
244
340
 
245
- def test_renameToExistingEntry
341
+ def test_rename_to_existing_entry
246
342
  oldEntries = nil
247
343
  ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
248
344
 
@@ -257,7 +353,7 @@ class ZipFileTest < MiniTest::Test
257
353
  end
258
354
  end
259
355
 
260
- def test_renameToExistingEntryOverwrite
356
+ def test_rename_to_existing_entry_overwrite
261
357
  oldEntries = nil
262
358
  ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
263
359
 
@@ -276,61 +372,54 @@ class ZipFileTest < MiniTest::Test
276
372
  end
277
373
  end
278
374
 
279
- def test_renameNonEntry
280
- nonEntry = "bogusEntry"
281
- target_entry = "target_entryName"
375
+ def test_rename_non_entry
376
+ nonEntry = 'bogusEntry'
377
+ target_entry = 'target_entryName'
282
378
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
283
379
  assert(!zf.entries.include?(nonEntry))
284
- assert_raises(Errno::ENOENT) {
285
- zf.rename(nonEntry, target_entry)
286
- }
380
+ assert_raises(Errno::ENOENT) { zf.rename(nonEntry, target_entry) }
287
381
  zf.commit
288
382
  assert(!zf.entries.include?(target_entry))
289
383
  ensure
290
384
  zf.close
291
385
  end
292
386
 
293
- def test_renameEntryToExistingEntry
387
+ def test_rename_entry_to_existing_entry
294
388
  entry1, entry2, * = TEST_ZIP.entry_names
295
389
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
296
- assert_raises(::Zip::EntryExistsError) {
297
- zf.rename(entry1, entry2)
298
- }
390
+ assert_raises(::Zip::EntryExistsError) { zf.rename(entry1, entry2) }
299
391
  ensure
300
392
  zf.close
301
393
  end
302
394
 
303
395
  def test_replace
304
396
  entryToReplace = TEST_ZIP.entry_names[2]
305
- newEntrySrcFilename = "test/data/file2.txt"
397
+ newEntrySrcFilename = 'test/data/file2.txt'
306
398
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
307
399
  zf.replace(entryToReplace, newEntrySrcFilename)
308
400
 
309
401
  zf.close
310
402
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
311
- AssertEntry::assert_contents(newEntrySrcFilename,
312
- zfRead.get_input_stream(entryToReplace) { |is| is.read })
313
- AssertEntry::assert_contents(TEST_ZIP.entry_names[0],
314
- zfRead.get_input_stream(TEST_ZIP.entry_names[0]) { |is| is.read })
315
- AssertEntry::assert_contents(TEST_ZIP.entry_names[1],
316
- zfRead.get_input_stream(TEST_ZIP.entry_names[1]) { |is| is.read })
317
- AssertEntry::assert_contents(TEST_ZIP.entry_names[3],
318
- zfRead.get_input_stream(TEST_ZIP.entry_names[3]) { |is| is.read })
403
+ AssertEntry.assert_contents(newEntrySrcFilename,
404
+ zfRead.get_input_stream(entryToReplace) { |is| is.read })
405
+ AssertEntry.assert_contents(TEST_ZIP.entry_names[0],
406
+ zfRead.get_input_stream(TEST_ZIP.entry_names[0]) { |is| is.read })
407
+ AssertEntry.assert_contents(TEST_ZIP.entry_names[1],
408
+ zfRead.get_input_stream(TEST_ZIP.entry_names[1]) { |is| is.read })
409
+ AssertEntry.assert_contents(TEST_ZIP.entry_names[3],
410
+ zfRead.get_input_stream(TEST_ZIP.entry_names[3]) { |is| is.read })
319
411
  zfRead.close
320
412
  end
321
413
 
322
- def test_replaceNonEntry
323
- entryToReplace = "nonExistingEntryname"
324
- ::Zip::File.open(TEST_ZIP.zip_name) {
325
- |zf|
326
- assert_raises(Errno::ENOENT) {
327
- zf.replace(entryToReplace, "test/data/file2.txt")
328
- }
329
- }
414
+ def test_replace_non_entry
415
+ entryToReplace = 'nonExistingEntryname'
416
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
417
+ assert_raises(Errno::ENOENT) { zf.replace(entryToReplace, 'test/data/file2.txt') }
418
+ end
330
419
  end
331
420
 
332
421
  def test_commit
333
- newName = "renamedFirst"
422
+ newName = 'renamedFirst'
334
423
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
335
424
  oldName = zf.entries.first
336
425
  zf.rename(oldName, newName)
@@ -338,11 +427,11 @@ class ZipFileTest < MiniTest::Test
338
427
 
339
428
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
340
429
  assert(zfRead.entries.detect { |e| e.name == newName } != nil)
341
- assert(zfRead.entries.detect { |e| e.name == oldName } == nil)
430
+ assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
342
431
  zfRead.close
343
432
 
344
433
  zf.close
345
- res = system("unzip -t #{TEST_ZIP.zip_name}")
434
+ res = system("unzip -tqq #{TEST_ZIP.zip_name}")
346
435
  assert_equal(res, true)
347
436
  end
348
437
 
@@ -356,9 +445,9 @@ class ZipFileTest < MiniTest::Test
356
445
  zf.commit
357
446
  zf.close
358
447
  zf2 = ::Zip::File.open(filename)
359
- assert(zf2.entries.detect {|e| e.name == 'test1.txt'} != nil )
360
- assert(zf2.entries.detect {|e| e.name == 'test2.txt'} != nil )
361
- res = system("unzip -t #{filename}")
448
+ assert(zf2.entries.detect { |e| e.name == 'test1.txt' } != nil)
449
+ assert(zf2.entries.detect { |e| e.name == 'test2.txt' } != nil)
450
+ res = system("unzip -tqq #{filename}")
362
451
  assert_equal(res, true)
363
452
  end
364
453
 
@@ -368,7 +457,7 @@ class ZipFileTest < MiniTest::Test
368
457
  end
369
458
 
370
459
  def test_write_buffer
371
- newName = "renamedFirst"
460
+ newName = 'renamedFirst'
372
461
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
373
462
  oldName = zf.entries.first
374
463
  zf.rename(oldName, newName)
@@ -377,7 +466,7 @@ class ZipFileTest < MiniTest::Test
377
466
  File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write buffer.string }
378
467
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
379
468
  assert(zfRead.entries.detect { |e| e.name == newName } != nil)
380
- assert(zfRead.entries.detect { |e| e.name == oldName } == nil)
469
+ assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
381
470
  zfRead.close
382
471
 
383
472
  zf.close
@@ -386,27 +475,26 @@ class ZipFileTest < MiniTest::Test
386
475
  # This test tests that after commit, you
387
476
  # can delete the file you used to add the entry to the zip file
388
477
  # with
389
- def test_commitUseZipEntry
478
+ def test_commit_use_zip_entry
390
479
  FileUtils.cp(TestFiles::RANDOM_ASCII_FILE1, OK_DELETE_FILE)
391
480
  zf = ::Zip::File.open(TEST_ZIP.zip_name)
392
- zf.add("okToDelete.txt", OK_DELETE_FILE)
393
- assert_contains(zf, "okToDelete.txt")
481
+ zf.add('okToDelete.txt', OK_DELETE_FILE)
482
+ assert_contains(zf, 'okToDelete.txt')
394
483
  zf.commit
395
484
  File.rename(OK_DELETE_FILE, OK_DELETE_MOVED_FILE)
396
- assert_contains(zf, "okToDelete.txt", OK_DELETE_MOVED_FILE)
485
+ assert_contains(zf, 'okToDelete.txt', OK_DELETE_MOVED_FILE)
397
486
  end
398
487
 
399
- # def test_close
400
- # zf = ZipFile.new(TEST_ZIP.zip_name)
401
- # zf.close
402
- # assert_raises(IOError) {
403
- # zf.extract(TEST_ZIP.entry_names.first, "hullubullu")
404
- # }
405
- # end
488
+ # def test_close
489
+ # zf = ZipFile.new(TEST_ZIP.zip_name)
490
+ # zf.close
491
+ # assert_raises(IOError) {
492
+ # zf.extract(TEST_ZIP.entry_names.first, "hullubullu")
493
+ # }
494
+ # end
406
495
 
407
496
  def test_compound1
408
- renamedName = "renamedName"
409
- originalEntries = []
497
+ renamedName = 'renamedName'
410
498
  filename_to_remove = ''
411
499
  begin
412
500
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
@@ -421,17 +509,15 @@ class ZipFileTest < MiniTest::Test
421
509
  zf.rename(entry_to_rename, renamedName)
422
510
  assert_contains(zf, renamedName)
423
511
 
424
- TestFiles::BINARY_TEST_FILES.each {
425
- |filename|
512
+ TestFiles::BINARY_TEST_FILES.each do |filename|
426
513
  zf.add(filename, filename)
427
514
  assert_contains(zf, filename)
428
- }
515
+ end
429
516
 
430
517
  assert_contains(zf, originalEntries.last.to_s)
431
518
  filename_to_remove = originalEntries.map(&:to_s).find { |name| name.match('longBinary') }
432
519
  zf.remove(filename_to_remove)
433
520
  assert_not_contains(zf, filename_to_remove)
434
-
435
521
  ensure
436
522
  zf.close
437
523
  end
@@ -439,10 +525,9 @@ class ZipFileTest < MiniTest::Test
439
525
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
440
526
  assert_contains(zfRead, TestFiles::RANDOM_ASCII_FILE1)
441
527
  assert_contains(zfRead, renamedName)
442
- TestFiles::BINARY_TEST_FILES.each {
443
- |filename|
528
+ TestFiles::BINARY_TEST_FILES.each do |filename|
444
529
  assert_contains(zfRead, filename)
445
- }
530
+ end
446
531
  assert_not_contains(zfRead, filename_to_remove)
447
532
  ensure
448
533
  zfRead.close
@@ -454,23 +539,21 @@ class ZipFileTest < MiniTest::Test
454
539
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
455
540
  originalEntries = zf.entries.dup
456
541
 
457
- originalEntries.each {
458
- |entry|
542
+ originalEntries.each do |entry|
459
543
  zf.remove(entry)
460
544
  assert_not_contains(zf, entry)
461
- }
545
+ end
462
546
  assert(zf.entries.empty?)
463
547
 
464
- TestFiles::ASCII_TEST_FILES.each {
465
- |filename|
548
+ TestFiles::ASCII_TEST_FILES.each do |filename|
466
549
  zf.add(filename, filename)
467
550
  assert_contains(zf, filename)
468
- }
551
+ end
469
552
  assert_equal(zf.entries.sort.map { |e| e.name }, TestFiles::ASCII_TEST_FILES)
470
553
 
471
- zf.rename(TestFiles::ASCII_TEST_FILES[0], "newName")
554
+ zf.rename(TestFiles::ASCII_TEST_FILES[0], 'newName')
472
555
  assert_not_contains(zf, TestFiles::ASCII_TEST_FILES[0])
473
- assert_contains(zf, "newName")
556
+ assert_contains(zf, 'newName')
474
557
  ensure
475
558
  zf.close
476
559
  end
@@ -478,56 +561,51 @@ class ZipFileTest < MiniTest::Test
478
561
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
479
562
  asciiTestFiles = TestFiles::ASCII_TEST_FILES.dup
480
563
  asciiTestFiles.shift
481
- asciiTestFiles.each {
482
- |filename|
564
+ asciiTestFiles.each do |filename|
483
565
  assert_contains(zf, filename)
484
- }
566
+ end
485
567
 
486
- assert_contains(zf, "newName")
568
+ assert_contains(zf, 'newName')
487
569
  ensure
488
570
  zfRead.close
489
571
  end
490
572
  end
491
573
 
492
- def test_changeComment
574
+ def test_change_comment
493
575
  ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
494
- zf.comment = "my changed comment"
576
+ zf.comment = 'my changed comment'
495
577
  end
496
578
  zfRead = ::Zip::File.open(TEST_ZIP.zip_name)
497
- assert_equal("my changed comment", zfRead.comment)
579
+ assert_equal('my changed comment', zfRead.comment)
498
580
  end
499
581
 
500
582
  def test_preserve_file_order
501
583
  entryNames = nil
502
- ::Zip::File.open(TEST_ZIP.zip_name) {
503
- |zf|
584
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
504
585
  entryNames = zf.entries.map { |e| e.to_s }
505
- zf.get_output_stream("a.txt") { |os| os.write "this is a.txt" }
506
- zf.get_output_stream("z.txt") { |os| os.write "this is z.txt" }
507
- zf.get_output_stream("k.txt") { |os| os.write "this is k.txt" }
508
- entryNames << "a.txt" << "z.txt" << "k.txt"
509
- }
510
-
511
- ::Zip::File.open(TEST_ZIP.zip_name) {
512
- |zf|
586
+ zf.get_output_stream('a.txt') { |os| os.write 'this is a.txt' }
587
+ zf.get_output_stream('z.txt') { |os| os.write 'this is z.txt' }
588
+ zf.get_output_stream('k.txt') { |os| os.write 'this is k.txt' }
589
+ entryNames << 'a.txt' << 'z.txt' << 'k.txt'
590
+ end
591
+
592
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
513
593
  assert_equal(entryNames, zf.entries.map { |e| e.to_s })
514
594
  entries = zf.entries.sort_by { |e| e.name }.reverse
515
- entries.each {
516
- |e|
595
+ entries.each do |e|
517
596
  zf.remove e
518
- zf.get_output_stream(e) { |os| os.write "foo" }
519
- }
597
+ zf.get_output_stream(e) { |os| os.write 'foo' }
598
+ end
520
599
  entryNames = entries.map { |e| e.to_s }
521
- }
522
- ::Zip::File.open(TEST_ZIP.zip_name) {
523
- |zf|
600
+ end
601
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
524
602
  assert_equal(entryNames, zf.entries.map { |e| e.to_s })
525
- }
603
+ end
526
604
  end
527
605
 
528
606
  def test_streaming
529
- fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), "../README.md")
530
- zname = "test/data/generated/README.zip"
607
+ fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), '../README.md')
608
+ zname = 'test/data/generated/README.zip'
531
609
  Zip::File.open(zname, Zip::File::CREATE) do |zipfile|
532
610
  zipfile.get_output_stream(File.basename(fname)) do |f|
533
611
  f.puts File.read(fname)
@@ -547,13 +625,42 @@ class ZipFileTest < MiniTest::Test
547
625
  assert data =~ /Simonov/
548
626
  end
549
627
 
628
+ def test_nonexistant_zip
629
+ assert_raises(::Zip::Error) do
630
+ ::Zip::File.open('fake.zip')
631
+ end
632
+ end
633
+
634
+ def test_empty_zip
635
+ assert_raises(::Zip::Error) do
636
+ ::Zip::File.open(TestFiles::NULL_FILE)
637
+ end
638
+ end
639
+
640
+ def test_odd_extra_field
641
+ entry_count = 0
642
+ File.open 'test/data/oddExtraField.zip', 'rb' do |zip_io|
643
+ Zip::File.open_buffer zip_io.read do |zip|
644
+ zip.each do |_zip_entry|
645
+ entry_count += 1
646
+ end
647
+ end
648
+ end
649
+ assert_equal 13, entry_count
650
+ end
651
+
652
+ def test_open_xls_does_not_raise_type_error
653
+ ::Zip::File.open('test/data/test.xls')
654
+ end
655
+
550
656
  private
657
+
551
658
  def assert_contains(zf, entryName, filename = entryName)
552
659
  assert(zf.entries.detect { |e| e.name == entryName } != nil, "entry #{entryName} not in #{zf.entries.join(', ')} in zip file #{zf}")
553
- assert_entryContents(zf, entryName, filename) if File.exist?(filename)
660
+ assert_entry_contents(zf, entryName, filename) if File.exist?(filename)
554
661
  end
555
662
 
556
663
  def assert_not_contains(zf, entryName)
557
- assert(zf.entries.detect { |e| e.name == entryName } == nil, "entry #{entryName} in #{zf.entries.join(', ')} in zip file #{zf}")
664
+ assert(zf.entries.detect { |e| e.name == entryName }.nil?, "entry #{entryName} in #{zf.entries.join(', ')} in zip file #{zf}")
558
665
  end
559
666
  end