rubyzip 1.3.0 → 3.0.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +368 -0
  3. data/README.md +123 -46
  4. data/Rakefile +13 -6
  5. data/lib/zip/central_directory.rb +166 -116
  6. data/lib/zip/compressor.rb +3 -1
  7. data/lib/zip/constants.rb +77 -21
  8. data/lib/zip/crypto/decrypted_io.rb +42 -0
  9. data/lib/zip/crypto/encryption.rb +4 -2
  10. data/lib/zip/crypto/null_encryption.rb +5 -3
  11. data/lib/zip/crypto/traditional_encryption.rb +14 -12
  12. data/lib/zip/decompressor.rb +21 -2
  13. data/lib/zip/deflater.rb +10 -8
  14. data/lib/zip/dirtyable.rb +32 -0
  15. data/lib/zip/dos_time.rb +53 -12
  16. data/lib/zip/entry.rb +306 -184
  17. data/lib/zip/entry_set.rb +11 -7
  18. data/lib/zip/errors.rb +115 -15
  19. data/lib/zip/extra_field/generic.rb +11 -17
  20. data/lib/zip/extra_field/ntfs.rb +8 -2
  21. data/lib/zip/extra_field/old_unix.rb +6 -2
  22. data/lib/zip/extra_field/universal_time.rb +45 -13
  23. data/lib/zip/extra_field/unix.rb +7 -3
  24. data/lib/zip/extra_field/unknown.rb +33 -0
  25. data/lib/zip/extra_field/zip64.rb +16 -7
  26. data/lib/zip/extra_field.rb +22 -26
  27. data/lib/zip/file.rb +196 -240
  28. data/lib/zip/file_split.rb +97 -0
  29. data/lib/zip/filesystem/dir.rb +86 -0
  30. data/lib/zip/filesystem/directory_iterator.rb +48 -0
  31. data/lib/zip/filesystem/file.rb +262 -0
  32. data/lib/zip/filesystem/file_stat.rb +110 -0
  33. data/lib/zip/filesystem/zip_file_name_mapper.rb +81 -0
  34. data/lib/zip/filesystem.rb +31 -584
  35. data/lib/zip/inflater.rb +27 -37
  36. data/lib/zip/input_stream.rb +67 -42
  37. data/lib/zip/ioextras/abstract_input_stream.rb +32 -16
  38. data/lib/zip/ioextras/abstract_output_stream.rb +5 -3
  39. data/lib/zip/ioextras.rb +7 -7
  40. data/lib/zip/null_compressor.rb +3 -1
  41. data/lib/zip/null_decompressor.rb +4 -10
  42. data/lib/zip/null_input_stream.rb +3 -1
  43. data/lib/zip/output_stream.rb +58 -43
  44. data/lib/zip/pass_thru_compressor.rb +5 -3
  45. data/lib/zip/pass_thru_decompressor.rb +16 -23
  46. data/lib/zip/streamable_directory.rb +6 -4
  47. data/lib/zip/streamable_stream.rb +9 -10
  48. data/lib/zip/version.rb +3 -1
  49. data/lib/zip.rb +19 -4
  50. data/rubyzip.gemspec +38 -0
  51. data/samples/example.rb +9 -4
  52. data/samples/example_filesystem.rb +3 -2
  53. data/samples/example_recursive.rb +3 -1
  54. data/samples/gtk_ruby_zip.rb +22 -20
  55. data/samples/qtzip.rb +12 -11
  56. data/samples/write_simple.rb +3 -4
  57. data/samples/zipfind.rb +24 -22
  58. metadata +86 -179
  59. data/TODO +0 -15
  60. data/lib/zip/extra_field/zip64_placeholder.rb +0 -15
  61. data/test/basic_zip_file_test.rb +0 -60
  62. data/test/case_sensitivity_test.rb +0 -69
  63. data/test/central_directory_entry_test.rb +0 -69
  64. data/test/central_directory_test.rb +0 -100
  65. data/test/crypto/null_encryption_test.rb +0 -57
  66. data/test/crypto/traditional_encryption_test.rb +0 -80
  67. data/test/data/WarnInvalidDate.zip +0 -0
  68. data/test/data/file1.txt +0 -46
  69. data/test/data/file1.txt.deflatedData +0 -0
  70. data/test/data/file2.txt +0 -1504
  71. data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
  72. data/test/data/globTest/foo.txt +0 -0
  73. data/test/data/globTest/food.txt +0 -0
  74. data/test/data/globTest.zip +0 -0
  75. data/test/data/gpbit3stored.zip +0 -0
  76. data/test/data/mimetype +0 -1
  77. data/test/data/notzippedruby.rb +0 -7
  78. data/test/data/ntfs.zip +0 -0
  79. data/test/data/oddExtraField.zip +0 -0
  80. data/test/data/path_traversal/Makefile +0 -10
  81. data/test/data/path_traversal/jwilk/README.md +0 -5
  82. data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
  83. data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
  84. data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
  85. data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
  86. data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
  87. data/test/data/path_traversal/jwilk/relative0.zip +0 -0
  88. data/test/data/path_traversal/jwilk/relative2.zip +0 -0
  89. data/test/data/path_traversal/jwilk/symlink.zip +0 -0
  90. data/test/data/path_traversal/relative1.zip +0 -0
  91. data/test/data/path_traversal/tilde.zip +0 -0
  92. data/test/data/path_traversal/tuzovakaoff/README.md +0 -3
  93. data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
  94. data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
  95. data/test/data/rubycode.zip +0 -0
  96. data/test/data/rubycode2.zip +0 -0
  97. data/test/data/test.xls +0 -0
  98. data/test/data/testDirectory.bin +0 -0
  99. data/test/data/zip64-sample.zip +0 -0
  100. data/test/data/zipWithDirs.zip +0 -0
  101. data/test/data/zipWithEncryption.zip +0 -0
  102. data/test/deflater_test.rb +0 -65
  103. data/test/encryption_test.rb +0 -42
  104. data/test/entry_set_test.rb +0 -163
  105. data/test/entry_test.rb +0 -154
  106. data/test/errors_test.rb +0 -35
  107. data/test/extra_field_test.rb +0 -76
  108. data/test/file_extract_directory_test.rb +0 -54
  109. data/test/file_extract_test.rb +0 -145
  110. data/test/file_permissions_test.rb +0 -65
  111. data/test/file_split_test.rb +0 -57
  112. data/test/file_test.rb +0 -666
  113. data/test/filesystem/dir_iterator_test.rb +0 -58
  114. data/test/filesystem/directory_test.rb +0 -139
  115. data/test/filesystem/file_mutating_test.rb +0 -87
  116. data/test/filesystem/file_nonmutating_test.rb +0 -508
  117. data/test/filesystem/file_stat_test.rb +0 -64
  118. data/test/gentestfiles.rb +0 -126
  119. data/test/inflater_test.rb +0 -14
  120. data/test/input_stream_test.rb +0 -182
  121. data/test/ioextras/abstract_input_stream_test.rb +0 -102
  122. data/test/ioextras/abstract_output_stream_test.rb +0 -106
  123. data/test/ioextras/fake_io_test.rb +0 -18
  124. data/test/local_entry_test.rb +0 -154
  125. data/test/output_stream_test.rb +0 -128
  126. data/test/pass_thru_compressor_test.rb +0 -30
  127. data/test/pass_thru_decompressor_test.rb +0 -14
  128. data/test/path_traversal_test.rb +0 -141
  129. data/test/samples/example_recursive_test.rb +0 -37
  130. data/test/settings_test.rb +0 -95
  131. data/test/test_helper.rb +0 -234
  132. data/test/unicode_file_names_and_comments_test.rb +0 -62
  133. data/test/zip64_full_test.rb +0 -51
  134. data/test/zip64_support_test.rb +0 -14
@@ -1,58 +0,0 @@
1
- require 'test_helper'
2
- require 'zip/filesystem'
3
-
4
- class ZipFsDirIteratorTest < MiniTest::Test
5
- FILENAME_ARRAY = %w[f1 f2 f3 f4 f5 f6]
6
-
7
- def setup
8
- @dirIt = ::Zip::FileSystem::ZipFsDirIterator.new(FILENAME_ARRAY)
9
- end
10
-
11
- def test_close
12
- @dirIt.close
13
- assert_raises(IOError, 'closed directory') do
14
- @dirIt.each { |e| p e }
15
- end
16
- assert_raises(IOError, 'closed directory') do
17
- @dirIt.read
18
- end
19
- assert_raises(IOError, 'closed directory') do
20
- @dirIt.rewind
21
- end
22
- assert_raises(IOError, 'closed directory') do
23
- @dirIt.seek(0)
24
- end
25
- assert_raises(IOError, 'closed directory') do
26
- @dirIt.tell
27
- end
28
- end
29
-
30
- def test_each
31
- # Tested through Enumerable.entries
32
- assert_equal(FILENAME_ARRAY, @dirIt.entries)
33
- end
34
-
35
- def test_read
36
- FILENAME_ARRAY.size.times do |i|
37
- assert_equal(FILENAME_ARRAY[i], @dirIt.read)
38
- end
39
- end
40
-
41
- def test_rewind
42
- @dirIt.read
43
- @dirIt.read
44
- assert_equal(FILENAME_ARRAY[2], @dirIt.read)
45
- @dirIt.rewind
46
- assert_equal(FILENAME_ARRAY[0], @dirIt.read)
47
- end
48
-
49
- def test_tell_seek
50
- @dirIt.read
51
- @dirIt.read
52
- pos = @dirIt.tell
53
- valAtPos = @dirIt.read
54
- @dirIt.read
55
- @dirIt.seek(pos)
56
- assert_equal(valAtPos, @dirIt.read)
57
- end
58
- end
@@ -1,139 +0,0 @@
1
- require 'test_helper'
2
- require 'zip/filesystem'
3
-
4
- class ZipFsDirectoryTest < MiniTest::Test
5
- TEST_ZIP = 'test/data/generated/zipWithDirs_copy.zip'
6
- GLOB_TEST_ZIP = 'test/data/globTest.zip'
7
-
8
- def setup
9
- FileUtils.cp('test/data/zipWithDirs.zip', TEST_ZIP)
10
- end
11
-
12
- def test_delete
13
- ::Zip::File.open(TEST_ZIP) do |zf|
14
- assert_raises(Errno::ENOENT, 'No such file or directory - NoSuchFile.txt') do
15
- zf.dir.delete('NoSuchFile.txt')
16
- end
17
- assert_raises(Errno::EINVAL, 'Invalid argument - file1') do
18
- zf.dir.delete('file1')
19
- end
20
- assert(zf.file.exists?('dir1'))
21
- zf.dir.delete('dir1')
22
- assert(!zf.file.exists?('dir1'))
23
- end
24
- end
25
-
26
- def test_mkdir
27
- ::Zip::File.open(TEST_ZIP) do |zf|
28
- assert_raises(Errno::EEXIST, 'File exists - dir1') do
29
- zf.dir.mkdir('file1')
30
- end
31
- assert_raises(Errno::EEXIST, 'File exists - dir1') do
32
- zf.dir.mkdir('dir1')
33
- end
34
- assert(!zf.file.exists?('newDir'))
35
- zf.dir.mkdir('newDir')
36
- assert(zf.file.directory?('newDir'))
37
- assert(!zf.file.exists?('newDir2'))
38
- zf.dir.mkdir('newDir2', 3485)
39
- assert(zf.file.directory?('newDir2'))
40
- end
41
- end
42
-
43
- def test_pwd_chdir_entries
44
- ::Zip::File.open(TEST_ZIP) do |zf|
45
- assert_equal('/', zf.dir.pwd)
46
-
47
- assert_raises(Errno::ENOENT, 'No such file or directory - no such dir') do
48
- zf.dir.chdir 'no such dir'
49
- end
50
-
51
- assert_raises(Errno::EINVAL, 'Invalid argument - file1') do
52
- zf.dir.chdir 'file1'
53
- end
54
-
55
- assert_equal(%w[dir1 dir2 file1].sort, zf.dir.entries('.').sort)
56
- zf.dir.chdir 'dir1'
57
- assert_equal('/dir1', zf.dir.pwd)
58
- assert_equal(%w[dir11 file11 file12], zf.dir.entries('.').sort)
59
-
60
- zf.dir.chdir '../dir2/dir21'
61
- assert_equal('/dir2/dir21', zf.dir.pwd)
62
- assert_equal(['dir221'].sort, zf.dir.entries('.').sort)
63
- end
64
- end
65
-
66
- def test_foreach
67
- ::Zip::File.open(TEST_ZIP) do |zf|
68
- blockCalled = false
69
- assert_raises(Errno::ENOENT, 'No such file or directory - noSuchDir') do
70
- zf.dir.foreach('noSuchDir') { |_e| blockCalled = true }
71
- end
72
- assert(!blockCalled)
73
-
74
- assert_raises(Errno::ENOTDIR, 'Not a directory - file1') do
75
- zf.dir.foreach('file1') { |_e| blockCalled = true }
76
- end
77
- assert(!blockCalled)
78
-
79
- entries = []
80
- zf.dir.foreach('.') { |e| entries << e }
81
- assert_equal(%w[dir1 dir2 file1].sort, entries.sort)
82
-
83
- entries = []
84
- zf.dir.foreach('dir1') { |e| entries << e }
85
- assert_equal(%w[dir11 file11 file12], entries.sort)
86
- end
87
- end
88
-
89
- def test_chroot
90
- ::Zip::File.open(TEST_ZIP) do |zf|
91
- assert_raises(NotImplementedError) do
92
- zf.dir.chroot
93
- end
94
- end
95
- end
96
-
97
- def test_glob
98
- globbed_files = [
99
- 'globTest/foo/bar/baz/foo.txt',
100
- 'globTest/foo.txt',
101
- 'globTest/food.txt'
102
- ]
103
-
104
- ::Zip::File.open(GLOB_TEST_ZIP) do |zf|
105
- zf.dir.glob('**/*.txt') do |f|
106
- assert globbed_files.include?(f.name)
107
- end
108
-
109
- zf.dir.glob('globTest/foo/**/*.txt') do |f|
110
- assert_equal globbed_files[0], f.name
111
- end
112
-
113
- zf.dir.chdir('globTest/foo')
114
- zf.dir.glob('**/*.txt') do |f|
115
- assert_equal globbed_files[0], f.name
116
- end
117
- end
118
- end
119
-
120
- def test_open_new
121
- ::Zip::File.open(TEST_ZIP) do |zf|
122
- assert_raises(Errno::ENOTDIR, 'Not a directory - file1') do
123
- zf.dir.new('file1')
124
- end
125
-
126
- assert_raises(Errno::ENOENT, 'No such file or directory - noSuchFile') do
127
- zf.dir.new('noSuchFile')
128
- end
129
-
130
- d = zf.dir.new('.')
131
- assert_equal(%w[file1 dir1 dir2].sort, d.entries.sort)
132
- d.close
133
-
134
- zf.dir.open('dir1') do |dir|
135
- assert_equal(%w[dir11 file11 file12].sort, dir.entries.sort)
136
- end
137
- end
138
- end
139
- end
@@ -1,87 +0,0 @@
1
- require 'test_helper'
2
- require 'zip/filesystem'
3
-
4
- class ZipFsFileMutatingTest < MiniTest::Test
5
- TEST_ZIP = 'test/data/generated/zipWithDirs_copy.zip'
6
- def setup
7
- FileUtils.cp('test/data/zipWithDirs.zip', TEST_ZIP)
8
- end
9
-
10
- def teardown; end
11
-
12
- def test_delete
13
- do_test_delete_or_unlink(:delete)
14
- end
15
-
16
- def test_unlink
17
- do_test_delete_or_unlink(:unlink)
18
- end
19
-
20
- def test_open_write
21
- ::Zip::File.open(TEST_ZIP) do |zf|
22
- zf.file.open('test_open_write_entry', 'w') do |f|
23
- f.write "This is what I'm writing"
24
- end
25
- assert_equal("This is what I'm writing",
26
- zf.file.read('test_open_write_entry'))
27
-
28
- # Test with existing entry
29
- zf.file.open('file1', 'wb') do |f| # also check that 'b' option is ignored
30
- f.write "This is what I'm writing too"
31
- end
32
- assert_equal("This is what I'm writing too",
33
- zf.file.read('file1'))
34
- end
35
- end
36
-
37
- def test_rename
38
- ::Zip::File.open(TEST_ZIP) do |zf|
39
- assert_raises(Errno::ENOENT, '') do
40
- zf.file.rename('NoSuchFile', 'bimse')
41
- end
42
- zf.file.rename('file1', 'newNameForFile1')
43
- end
44
-
45
- ::Zip::File.open(TEST_ZIP) do |zf|
46
- assert(!zf.file.exists?('file1'))
47
- assert(zf.file.exists?('newNameForFile1'))
48
- end
49
- end
50
-
51
- def test_chmod
52
- ::Zip::File.open(TEST_ZIP) do |zf|
53
- zf.file.chmod(0o765, 'file1')
54
- end
55
-
56
- ::Zip::File.open(TEST_ZIP) do |zf|
57
- assert_equal(0o100765, zf.file.stat('file1').mode)
58
- end
59
- end
60
-
61
- def do_test_delete_or_unlink(symbol)
62
- ::Zip::File.open(TEST_ZIP) do |zf|
63
- assert(zf.file.exists?('dir2/dir21/dir221/file2221'))
64
- zf.file.send(symbol, 'dir2/dir21/dir221/file2221')
65
- assert(!zf.file.exists?('dir2/dir21/dir221/file2221'))
66
-
67
- assert(zf.file.exists?('dir1/file11'))
68
- assert(zf.file.exists?('dir1/file12'))
69
- zf.file.send(symbol, 'dir1/file11', 'dir1/file12')
70
- assert(!zf.file.exists?('dir1/file11'))
71
- assert(!zf.file.exists?('dir1/file12'))
72
-
73
- assert_raises(Errno::ENOENT) { zf.file.send(symbol, 'noSuchFile') }
74
- assert_raises(Errno::EISDIR) { zf.file.send(symbol, 'dir1/dir11') }
75
- assert_raises(Errno::EISDIR) { zf.file.send(symbol, 'dir1/dir11/') }
76
- end
77
-
78
- ::Zip::File.open(TEST_ZIP) do |zf|
79
- assert(!zf.file.exists?('dir2/dir21/dir221/file2221'))
80
- assert(!zf.file.exists?('dir1/file11'))
81
- assert(!zf.file.exists?('dir1/file12'))
82
-
83
- assert(zf.file.exists?('dir1/dir11'))
84
- assert(zf.file.exists?('dir1/dir11/'))
85
- end
86
- end
87
- end