rubyzip 0.9.5 → 1.3.0

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 (135) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +334 -45
  3. data/Rakefile +11 -6
  4. data/TODO +0 -1
  5. data/lib/zip/central_directory.rb +208 -0
  6. data/lib/zip/compressor.rb +1 -2
  7. data/lib/zip/constants.rb +61 -8
  8. data/lib/zip/crypto/encryption.rb +11 -0
  9. data/lib/zip/crypto/null_encryption.rb +43 -0
  10. data/lib/zip/crypto/traditional_encryption.rb +99 -0
  11. data/lib/zip/decompressor.rb +4 -4
  12. data/lib/zip/deflater.rb +18 -14
  13. data/lib/zip/dos_time.rb +48 -0
  14. data/lib/zip/entry.rb +700 -0
  15. data/lib/zip/entry_set.rb +86 -0
  16. data/lib/zip/errors.rb +18 -0
  17. data/lib/zip/extra_field/generic.rb +43 -0
  18. data/lib/zip/extra_field/ntfs.rb +90 -0
  19. data/lib/zip/extra_field/old_unix.rb +44 -0
  20. data/lib/zip/extra_field/universal_time.rb +47 -0
  21. data/lib/zip/extra_field/unix.rb +37 -0
  22. data/lib/zip/extra_field/zip64.rb +68 -0
  23. data/lib/zip/extra_field/zip64_placeholder.rb +15 -0
  24. data/lib/zip/extra_field.rb +101 -0
  25. data/lib/zip/file.rb +443 -0
  26. data/lib/zip/{zipfilesystem.rb → filesystem.rb} +179 -164
  27. data/lib/zip/inflater.rb +29 -28
  28. data/lib/zip/input_stream.rb +173 -0
  29. data/lib/zip/ioextras/abstract_input_stream.rb +111 -0
  30. data/lib/zip/ioextras/abstract_output_stream.rb +43 -0
  31. data/lib/zip/ioextras.rb +21 -149
  32. data/lib/zip/null_compressor.rb +2 -2
  33. data/lib/zip/null_decompressor.rb +8 -6
  34. data/lib/zip/null_input_stream.rb +3 -2
  35. data/lib/zip/output_stream.rb +189 -0
  36. data/lib/zip/pass_thru_compressor.rb +7 -7
  37. data/lib/zip/pass_thru_decompressor.rb +19 -19
  38. data/lib/zip/{zip_streamable_directory.rb → streamable_directory.rb} +3 -3
  39. data/lib/zip/streamable_stream.rb +56 -0
  40. data/lib/zip/version.rb +3 -0
  41. data/lib/zip.rb +71 -0
  42. data/samples/example.rb +44 -32
  43. data/samples/example_filesystem.rb +16 -18
  44. data/samples/example_recursive.rb +33 -28
  45. data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +26 -28
  46. data/samples/qtzip.rb +22 -31
  47. data/samples/write_simple.rb +12 -13
  48. data/samples/zipfind.rb +31 -39
  49. data/test/basic_zip_file_test.rb +60 -0
  50. data/test/case_sensitivity_test.rb +69 -0
  51. data/test/central_directory_entry_test.rb +69 -0
  52. data/test/central_directory_test.rb +100 -0
  53. data/test/crypto/null_encryption_test.rb +57 -0
  54. data/test/crypto/traditional_encryption_test.rb +80 -0
  55. data/test/data/WarnInvalidDate.zip +0 -0
  56. data/test/data/file1.txt +46 -0
  57. data/test/data/file1.txt.deflatedData +0 -0
  58. data/test/data/file2.txt +1504 -0
  59. data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
  60. data/test/data/globTest/foo.txt +0 -0
  61. data/test/data/globTest/food.txt +0 -0
  62. data/test/data/globTest.zip +0 -0
  63. data/test/data/gpbit3stored.zip +0 -0
  64. data/test/data/mimetype +1 -0
  65. data/test/data/notzippedruby.rb +7 -0
  66. data/test/data/ntfs.zip +0 -0
  67. data/test/data/oddExtraField.zip +0 -0
  68. data/test/data/path_traversal/Makefile +10 -0
  69. data/test/data/path_traversal/jwilk/README.md +5 -0
  70. data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
  71. data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
  72. data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
  73. data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
  74. data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
  75. data/test/data/path_traversal/jwilk/relative0.zip +0 -0
  76. data/test/data/path_traversal/jwilk/relative2.zip +0 -0
  77. data/test/data/path_traversal/jwilk/symlink.zip +0 -0
  78. data/test/data/path_traversal/relative1.zip +0 -0
  79. data/test/data/path_traversal/tilde.zip +0 -0
  80. data/test/data/path_traversal/tuzovakaoff/README.md +3 -0
  81. data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
  82. data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
  83. data/test/data/rubycode.zip +0 -0
  84. data/test/data/rubycode2.zip +0 -0
  85. data/test/data/test.xls +0 -0
  86. data/test/data/testDirectory.bin +0 -0
  87. data/test/data/zip64-sample.zip +0 -0
  88. data/test/data/zipWithDirs.zip +0 -0
  89. data/test/data/zipWithEncryption.zip +0 -0
  90. data/test/deflater_test.rb +65 -0
  91. data/test/encryption_test.rb +42 -0
  92. data/test/entry_set_test.rb +163 -0
  93. data/test/entry_test.rb +154 -0
  94. data/test/errors_test.rb +35 -0
  95. data/test/extra_field_test.rb +76 -0
  96. data/test/file_extract_directory_test.rb +54 -0
  97. data/test/file_extract_test.rb +145 -0
  98. data/test/file_permissions_test.rb +65 -0
  99. data/test/file_split_test.rb +57 -0
  100. data/test/file_test.rb +666 -0
  101. data/test/filesystem/dir_iterator_test.rb +58 -0
  102. data/test/filesystem/directory_test.rb +139 -0
  103. data/test/filesystem/file_mutating_test.rb +87 -0
  104. data/test/filesystem/file_nonmutating_test.rb +508 -0
  105. data/test/filesystem/file_stat_test.rb +64 -0
  106. data/test/gentestfiles.rb +126 -0
  107. data/test/inflater_test.rb +14 -0
  108. data/test/input_stream_test.rb +182 -0
  109. data/test/ioextras/abstract_input_stream_test.rb +102 -0
  110. data/test/ioextras/abstract_output_stream_test.rb +106 -0
  111. data/test/ioextras/fake_io_test.rb +18 -0
  112. data/test/local_entry_test.rb +154 -0
  113. data/test/output_stream_test.rb +128 -0
  114. data/test/pass_thru_compressor_test.rb +30 -0
  115. data/test/pass_thru_decompressor_test.rb +14 -0
  116. data/test/path_traversal_test.rb +141 -0
  117. data/test/samples/example_recursive_test.rb +37 -0
  118. data/test/settings_test.rb +95 -0
  119. data/test/test_helper.rb +234 -0
  120. data/test/unicode_file_names_and_comments_test.rb +62 -0
  121. data/test/zip64_full_test.rb +51 -0
  122. data/test/zip64_support_test.rb +14 -0
  123. metadata +275 -41
  124. data/NEWS +0 -162
  125. data/lib/zip/stdrubyext.rb +0 -77
  126. data/lib/zip/tempfile_bugfixed.rb +0 -195
  127. data/lib/zip/zip.rb +0 -54
  128. data/lib/zip/zip_central_directory.rb +0 -139
  129. data/lib/zip/zip_entry.rb +0 -639
  130. data/lib/zip/zip_entry_set.rb +0 -66
  131. data/lib/zip/zip_extra_field.rb +0 -213
  132. data/lib/zip/zip_file.rb +0 -318
  133. data/lib/zip/zip_input_stream.rb +0 -134
  134. data/lib/zip/zip_output_stream.rb +0 -172
  135. data/lib/zip/zip_streamable_stream.rb +0 -47
@@ -1,172 +0,0 @@
1
- module Zip
2
- # ZipOutputStream is the basic class for writing zip files. It is
3
- # possible to create a ZipOutputStream object directly, passing
4
- # the zip file name to the constructor, but more often than not
5
- # the ZipOutputStream will be obtained from a ZipFile (perhaps using the
6
- # ZipFileSystem interface) object for a particular entry in the zip
7
- # archive.
8
- #
9
- # A ZipOutputStream inherits IOExtras::AbstractOutputStream in order
10
- # to provide an IO-like interface for writing to a single zip
11
- # entry. Beyond methods for mimicking an IO-object it contains
12
- # the method put_next_entry that closes the current entry
13
- # and creates a new.
14
- #
15
- # Please refer to ZipInputStream for example code.
16
- #
17
- # java.util.zip.ZipOutputStream is the original inspiration for this
18
- # class.
19
-
20
- class ZipOutputStream
21
- include IOExtras::AbstractOutputStream
22
-
23
- attr_accessor :comment
24
-
25
- # Opens the indicated zip file. If a file with that name already
26
- # exists it will be overwritten.
27
- def initialize(fileName, stream=false)
28
- super()
29
- @fileName = fileName
30
- if stream
31
- @outputStream = StringIO.new
32
- else
33
- @outputStream = File.new(@fileName, "wb")
34
- end
35
- @entrySet = ZipEntrySet.new
36
- @compressor = NullCompressor.instance
37
- @closed = false
38
- @currentEntry = nil
39
- @comment = nil
40
- end
41
-
42
- # Same as #initialize but if a block is passed the opened
43
- # stream is passed to the block and closed when the block
44
- # returns.
45
- def ZipOutputStream.open(fileName)
46
- return new(fileName) unless block_given?
47
- zos = new(fileName)
48
- yield zos
49
- ensure
50
- zos.close if zos
51
- end
52
-
53
- # Same as #open but writes to a filestream instead
54
- def ZipOutputStream.write_buffer
55
- zos = new('', true)
56
- yield zos
57
- return zos.close_buffer
58
- end
59
-
60
- # Closes the stream and writes the central directory to the zip file
61
- def close
62
- return if @closed
63
- finalize_current_entry
64
- update_local_headers
65
- write_central_directory
66
- @outputStream.close
67
- @closed = true
68
- end
69
-
70
- # Closes the stream and writes the central directory to the zip file
71
- def close_buffer
72
- return @outputStream if @closed
73
- finalize_current_entry
74
- update_local_headers
75
- write_central_directory
76
- @closed = true
77
- return @outputStream
78
- end
79
-
80
- # Closes the current entry and opens a new for writing.
81
- # +entry+ can be a ZipEntry object or a string.
82
- def put_next_entry(entryname, comment = nil, extra = nil, compression_method = ZipEntry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION)
83
- raise ZipError, "zip stream is closed" if @closed
84
- new_entry = ZipEntry.new(@fileName, entryname.to_s)
85
- new_entry.unix_perms = entryname.unix_perms if entryname.respond_to? :unix_perms
86
- new_entry.comment = comment if !comment.nil?
87
- if (!extra.nil?)
88
- new_entry.extra = ZipExtraField === extra ? extra : ZipExtraField.new(extra.to_s)
89
- end
90
- new_entry.compression_method = compression_method
91
- init_next_entry(new_entry, level)
92
- @currentEntry = new_entry
93
- end
94
-
95
- def copy_raw_entry(entry)
96
- entry = entry.dup
97
- raise ZipError, "zip stream is closed" if @closed
98
- raise ZipError, "entry is not a ZipEntry" if !entry.kind_of?(ZipEntry)
99
- finalize_current_entry
100
- @entrySet << entry
101
- src_pos = entry.local_entry_offset
102
- entry.write_local_entry(@outputStream)
103
- @compressor = NullCompressor.instance
104
- entry.get_raw_input_stream {
105
- |is|
106
- is.seek(src_pos, IO::SEEK_SET)
107
- IOExtras.copy_stream_n(@outputStream, is, entry.compressed_size)
108
- }
109
- @compressor = NullCompressor.instance
110
- @currentEntry = nil
111
- end
112
-
113
- private
114
- def finalize_current_entry
115
- return unless @currentEntry
116
- finish
117
- @currentEntry.compressed_size = @outputStream.tell - @currentEntry.localHeaderOffset -
118
- @currentEntry.calculate_local_header_size
119
- @currentEntry.size = @compressor.size
120
- @currentEntry.crc = @compressor.crc
121
- @currentEntry = nil
122
- @compressor = NullCompressor.instance
123
- end
124
-
125
- def init_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION)
126
- finalize_current_entry
127
- @entrySet << entry
128
- entry.write_local_entry(@outputStream)
129
- @compressor = get_compressor(entry, level)
130
- end
131
-
132
- def get_compressor(entry, level)
133
- case entry.compression_method
134
- when ZipEntry::DEFLATED then Deflater.new(@outputStream, level)
135
- when ZipEntry::STORED then PassThruCompressor.new(@outputStream)
136
- else raise ZipCompressionMethodError,
137
- "Invalid compression method: '#{entry.compression_method}'"
138
- end
139
- end
140
-
141
- def update_local_headers
142
- pos = @outputStream.tell
143
- @entrySet.each {
144
- |entry|
145
- @outputStream.pos = entry.localHeaderOffset
146
- entry.write_local_entry(@outputStream)
147
- }
148
- @outputStream.pos = pos
149
- end
150
-
151
- def write_central_directory
152
- cdir = ZipCentralDirectory.new(@entrySet, @comment)
153
- cdir.write_to_stream(@outputStream)
154
- end
155
-
156
- protected
157
-
158
- def finish
159
- @compressor.finish
160
- end
161
-
162
- public
163
- # Modeled after IO.<<
164
- def << (data)
165
- @compressor << data
166
- end
167
- end
168
- end
169
-
170
- # Copyright (C) 2002, 2003 Thomas Sondergaard
171
- # rubyzip is free software; you can redistribute it and/or
172
- # modify it under the terms of the ruby license.
@@ -1,47 +0,0 @@
1
- module Zip
2
- class ZipStreamableStream < DelegateClass(ZipEntry) #nodoc:all
3
- def initialize(entry)
4
- super(entry)
5
- @tempFile = Tempfile.new(File.basename(name), File.dirname(zipfile))
6
- @tempFile.binmode
7
- end
8
-
9
- def get_output_stream
10
- if block_given?
11
- begin
12
- yield(@tempFile)
13
- ensure
14
- @tempFile.close
15
- end
16
- else
17
- @tempFile
18
- end
19
- end
20
-
21
- def get_input_stream
22
- if ! @tempFile.closed?
23
- raise StandardError, "cannot open entry for reading while its open for writing - #{name}"
24
- end
25
- @tempFile.open # reopens tempfile from top
26
- @tempFile.binmode
27
- if block_given?
28
- begin
29
- yield(@tempFile)
30
- ensure
31
- @tempFile.close
32
- end
33
- else
34
- @tempFile
35
- end
36
- end
37
-
38
- def write_to_zip_output_stream(aZipOutputStream)
39
- aZipOutputStream.put_next_entry(self)
40
- get_input_stream { |is| IOExtras.copy_stream(aZipOutputStream, is) }
41
- end
42
- end
43
- end
44
-
45
- # Copyright (C) 2002, 2003 Thomas Sondergaard
46
- # rubyzip is free software; you can redistribute it and/or
47
- # modify it under the terms of the ruby license.