rubyzip 1.1.7 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubyzip might be problematic. Click here for more details.

Files changed (87) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +69 -32
  3. data/Rakefile +3 -4
  4. data/lib/zip.rb +3 -5
  5. data/lib/zip/central_directory.rb +7 -7
  6. data/lib/zip/compressor.rb +0 -0
  7. data/lib/zip/constants.rb +2 -2
  8. data/lib/zip/crypto/null_encryption.rb +3 -3
  9. data/lib/zip/crypto/traditional_encryption.rb +5 -5
  10. data/lib/zip/decompressor.rb +2 -2
  11. data/lib/zip/deflater.rb +8 -6
  12. data/lib/zip/dos_time.rb +4 -5
  13. data/lib/zip/entry.rb +68 -80
  14. data/lib/zip/entry_set.rb +11 -11
  15. data/lib/zip/errors.rb +1 -0
  16. data/lib/zip/extra_field.rb +6 -6
  17. data/lib/zip/extra_field/generic.rb +7 -7
  18. data/lib/zip/extra_field/ntfs.rb +14 -16
  19. data/lib/zip/extra_field/old_unix.rb +9 -10
  20. data/lib/zip/extra_field/universal_time.rb +14 -14
  21. data/lib/zip/extra_field/unix.rb +8 -9
  22. data/lib/zip/extra_field/zip64.rb +12 -11
  23. data/lib/zip/extra_field/zip64_placeholder.rb +1 -1
  24. data/lib/zip/file.rb +45 -49
  25. data/lib/zip/filesystem.rb +132 -135
  26. data/lib/zip/inflater.rb +3 -3
  27. data/lib/zip/input_stream.rb +13 -7
  28. data/lib/zip/ioextras.rb +1 -3
  29. data/lib/zip/ioextras/abstract_input_stream.rb +5 -9
  30. data/lib/zip/ioextras/abstract_output_stream.rb +0 -2
  31. data/lib/zip/null_compressor.rb +2 -2
  32. data/lib/zip/null_decompressor.rb +3 -3
  33. data/lib/zip/null_input_stream.rb +0 -0
  34. data/lib/zip/output_stream.rb +8 -9
  35. data/lib/zip/pass_thru_compressor.rb +4 -4
  36. data/lib/zip/pass_thru_decompressor.rb +2 -3
  37. data/lib/zip/streamable_directory.rb +2 -2
  38. data/lib/zip/streamable_stream.rb +2 -2
  39. data/lib/zip/version.rb +1 -1
  40. data/samples/example.rb +29 -39
  41. data/samples/example_filesystem.rb +16 -18
  42. data/samples/example_recursive.rb +33 -24
  43. data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +23 -25
  44. data/samples/qtzip.rb +17 -26
  45. data/samples/write_simple.rb +12 -13
  46. data/samples/zipfind.rb +24 -32
  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 +31 -35
  50. data/test/central_directory_test.rb +46 -50
  51. data/test/crypto/null_encryption_test.rb +2 -2
  52. data/test/crypto/traditional_encryption_test.rb +5 -5
  53. data/test/data/notzippedruby.rb +1 -1
  54. data/test/data/oddExtraField.zip +0 -0
  55. data/test/data/test.xls +0 -0
  56. data/test/deflater_test.rb +10 -12
  57. data/test/encryption_test.rb +2 -2
  58. data/test/entry_set_test.rb +38 -24
  59. data/test/entry_test.rb +76 -78
  60. data/test/errors_test.rb +0 -2
  61. data/test/extra_field_test.rb +19 -21
  62. data/test/file_extract_directory_test.rb +12 -14
  63. data/test/file_extract_test.rb +33 -40
  64. data/test/file_permissions_test.rb +69 -0
  65. data/test/file_split_test.rb +24 -27
  66. data/test/file_test.rb +174 -170
  67. data/test/filesystem/dir_iterator_test.rb +13 -17
  68. data/test/filesystem/directory_test.rb +80 -90
  69. data/test/filesystem/file_mutating_test.rb +51 -63
  70. data/test/filesystem/file_nonmutating_test.rb +222 -228
  71. data/test/filesystem/file_stat_test.rb +17 -19
  72. data/test/gentestfiles.rb +43 -55
  73. data/test/inflater_test.rb +1 -1
  74. data/test/input_stream_test.rb +42 -30
  75. data/test/ioextras/abstract_input_stream_test.rb +21 -22
  76. data/test/ioextras/abstract_output_stream_test.rb +32 -32
  77. data/test/local_entry_test.rb +35 -37
  78. data/test/output_stream_test.rb +20 -21
  79. data/test/pass_thru_compressor_test.rb +5 -6
  80. data/test/pass_thru_decompressor_test.rb +0 -1
  81. data/test/samples/example_recursive_test.rb +37 -0
  82. data/test/settings_test.rb +18 -15
  83. data/test/test_helper.rb +37 -44
  84. data/test/unicode_file_names_and_comments_test.rb +5 -7
  85. data/test/zip64_full_test.rb +9 -11
  86. data/test/zip64_support_test.rb +0 -1
  87. metadata +14 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 21b11d72a619a00f577f3ac15a65d309d07ab57b
4
- data.tar.gz: d2c28c4157e692118e26478c34205094eb2ca055
3
+ metadata.gz: 4af5fd26173e16759a74f190b293f84cc02d605b
4
+ data.tar.gz: 05666235e929fdb9bd6abe6807d3bf9583e65244
5
5
  SHA512:
6
- metadata.gz: 935e9064b3fc98693e8e0eef68f147b9a62ba4dcf25c9f42cf9828a544665d749fd8ff5866b52183a569171fd3aecddb09613d526da1bc43bf34c0b556bcea02
7
- data.tar.gz: b9e36842ed0830befe3ca556b954757975291f8c523be419213c5974015742e41c4bb4a4b44c88a746ad22f7656f23162cf5e5d5e7591d917927ae9830ad8dae
6
+ metadata.gz: 2f4b82040f81e517ddb65660bea4a3368ec5e150bd094051d0ae3a515184c2eef55e32bcf5f49877bd432b3331a809402977e1c4b2a045695c8d2f45ab86f43c
7
+ data.tar.gz: 31fdb0e8c66d737d341161d02faf343786d0a0d1beca058cff4532886a2cfe268b738c6307b042c22a3186909953cd6879656a7660ef607eea906f407f1aada1
data/README.md CHANGED
@@ -4,11 +4,11 @@
4
4
  [![Code Climate](https://codeclimate.com/github/rubyzip/rubyzip.svg)](https://codeclimate.com/github/rubyzip/rubyzip)
5
5
  [![Coverage Status](https://img.shields.io/coveralls/rubyzip/rubyzip.svg)](https://coveralls.io/r/rubyzip/rubyzip?branch=master)
6
6
 
7
- rubyzip is a ruby library for reading and writing zip files.
7
+ Rubyzip is a ruby library for reading and writing zip files.
8
8
 
9
9
  ## Important note
10
10
 
11
- Rubyzip interface changed!!! No need to do `require "zip/zip"` and `Zip` prefix in class names removed.
11
+ The Rubyzip interface has changed!!! No need to do `require "zip/zip"` and `Zip` prefix in class names removed.
12
12
 
13
13
  If you have issues with any third-party gems that require an old version of rubyzip, you can use this workaround:
14
14
 
@@ -22,7 +22,7 @@ gem 'zip-zip' # will load compatibility for old rubyzip API.
22
22
  * Ruby 1.9.2 or greater
23
23
 
24
24
  ## Installation
25
- rubyzip is available on RubyGems, so:
25
+ Rubyzip is available on RubyGems:
26
26
 
27
27
  ```
28
28
  gem install rubyzip
@@ -78,39 +78,54 @@ require 'zip'
78
78
 
79
79
  class ZipFileGenerator
80
80
  # Initialize with the directory to zip and the location of the output archive.
81
- def initialize(inputDir, outputFile)
82
- @inputDir = inputDir
83
- @outputFile = outputFile
81
+ def initialize(input_dir, output_file)
82
+ @input_dir = input_dir
83
+ @output_file = output_file
84
84
  end
85
+
85
86
  # Zip the input directory.
86
- def write()
87
- entries = Dir.entries(@inputDir); entries.delete("."); entries.delete("..")
88
- io = Zip::File.open(@outputFile, Zip::File::CREATE);
89
- writeEntries(entries, "", io)
90
- io.close();
87
+ def write
88
+ entries = Dir.entries(@input_dir) - %w(. ..)
89
+
90
+ ::Zip::File.open(@output_file, ::Zip::File::CREATE) do |io|
91
+ write_entries entries, '', io
92
+ end
91
93
  end
92
- # A helper method to make the recursion work.
94
+
93
95
  private
94
- def writeEntries(entries, path, io)
95
- entries.each { |e|
96
- zipFilePath = path == "" ? e : File.join(path, e)
97
- diskFilePath = File.join(@inputDir, zipFilePath)
98
- puts "Deflating " + diskFilePath
99
- if File.directory?(diskFilePath)
100
- io.mkdir(zipFilePath)
101
- subdir =Dir.entries(diskFilePath); subdir.delete("."); subdir.delete("..")
102
- writeEntries(subdir, zipFilePath, io)
96
+
97
+ # A helper method to make the recursion work.
98
+ def write_entries(entries, path, io)
99
+ entries.each do |e|
100
+ zip_file_path = path == '' ? e : File.join(path, e)
101
+ disk_file_path = File.join(@input_dir, zip_file_path)
102
+ puts "Deflating #{disk_file_path}"
103
+
104
+ if File.directory? disk_file_path
105
+ recursively_deflate_directory(disk_file_path, io, zip_file_path)
103
106
  else
104
- io.get_output_stream(zipFilePath) { |f| f.print(File.open(diskFilePath, "rb").read())}
107
+ put_into_archive(disk_file_path, io, zip_file_path)
105
108
  end
106
- }
109
+ end
110
+ end
111
+
112
+ def recursively_deflate_directory(disk_file_path, io, zip_file_path)
113
+ io.mkdir zip_file_path
114
+ subdir = Dir.entries(disk_file_path) - %w(. ..)
115
+ write_entries subdir, zip_file_path, io
116
+ end
117
+
118
+ def put_into_archive(disk_file_path, io, zip_file_path)
119
+ io.get_output_stream(zip_file_path) do |f|
120
+ f.puts(File.open(disk_file_path, 'rb').read)
121
+ end
107
122
  end
108
123
  end
109
124
  ```
110
125
 
111
126
  ### Save zip archive entries in sorted by name state
112
127
 
113
- To saving zip archives in sorted order like below you need to set `::Zip.sort_entries` to `true`
128
+ To save zip archives in sorted order like below, you need to set `::Zip.sort_entries` to `true`
114
129
 
115
130
  ```
116
131
  Vegetable/
@@ -124,7 +139,17 @@ fruit/mango
124
139
  fruit/orange
125
140
  ```
126
141
 
127
- After this entries in zip archive will be saved in ordered state.
142
+ After this, entries in the zip archive will be saved in ordered state.
143
+
144
+ ### Default permissions of zip archives
145
+
146
+ On Posix file systems the default file permissions applied to a new archive
147
+ are (0666 - umask), which mimics the behavior of standard tools such as `touch`.
148
+
149
+ On Windows the default file permissions are set to 0644 as suggested by the
150
+ [Ruby File documentation](http://ruby-doc.org/core-2.2.2/File.html).
151
+
152
+ When modifying a zip archive the file permissions of the archive are preserved.
128
153
 
129
154
  ### Reading a Zip file
130
155
 
@@ -146,9 +171,21 @@ Zip::File.open('foo.zip') do |zip_file|
146
171
  end
147
172
  ```
148
173
 
174
+ #### Notice about ::Zip::InputStream
175
+
176
+ `::Zip::InputStream` usable for fast reading zip file content because it not read Central directory.
177
+
178
+ But there is one exception when it is not working - General Purpose Flag Bit 3.
179
+
180
+ ```
181
+ If bit 3 (0x08) of the general-purpose flags field is set, then the CRC-32 and file sizes are not known when the header is written. The fields in the local header are filled with zero, and the CRC-32 and size are appended in a 12-byte structure (optionally preceded by a 4-byte signature) immediately after the compressed data
182
+ ```
183
+
184
+ If `::Zip::InputStream` finds such entry in the zip archive it will raise an exception.
185
+
149
186
  ### Password Protection (Experimental)
150
187
 
151
- RubyZip supports reading/writing zip files with traditional zip encryption (a.k.a. "ZipCrypto"). AES encryption is not yet supported. It can be used with buffer streams, e.g.:
188
+ Rubyzip supports reading/writing zip files with traditional zip encryption (a.k.a. "ZipCrypto"). AES encryption is not yet supported. It can be used with buffer streams, e.g.:
152
189
 
153
190
  ```ruby
154
191
  Zip::OutputStream.write_buffer(::StringIO.new(''), Zip::TraditionalEncrypter.new('password')) do |out|
@@ -200,13 +237,13 @@ Additionally, if you want to configure rubyzip to overwrite existing files while
200
237
  Zip.continue_on_exists_proc = true
201
238
  ```
202
239
 
203
- If you want to store non english names and want to open properly file on Windows(pre 7) you need to set next option:
240
+ If you want to store non-english names and want to open them on Windows(pre 7) you need to set this option:
204
241
 
205
242
  ```ruby
206
243
  Zip.unicode_names = true
207
244
  ```
208
245
 
209
- In some zip date of files stored in incorrect format. You can hide warning about it by using:
246
+ Some zip files might have an invalid date format, which will raise a warning. You can hide this warning with the following setting:
210
247
 
211
248
  ```ruby
212
249
  Zip.warn_invalid_date = false
@@ -219,7 +256,7 @@ Zip.default_compression = Zlib::DEFAULT_COMPRESSION
219
256
  ```
220
257
  It defaults to `Zlib::DEFAULT_COMPRESSION`. Possible values are `Zlib::BEST_COMPRESSION`, `Zlib::DEFAULT_COMPRESSION` and `Zlib::NO_COMPRESSION`
221
258
 
222
- All settings in same time
259
+ You can set multiple settings at the same time by using a block:
223
260
 
224
261
  ```ruby
225
262
  Zip.setup do |c|
@@ -230,7 +267,7 @@ All settings in same time
230
267
  end
231
268
  ```
232
269
 
233
- By default Zip64 support is disabled for writing. To enable it do next:
270
+ By default, Zip64 support is disabled for writing. To enable it do this:
234
271
 
235
272
  ```ruby
236
273
  Zip.write_zip64_support = true
@@ -240,7 +277,7 @@ _NOTE_: If you will enable Zip64 writing then you will need zip extractor with Z
240
277
 
241
278
  ## Developing
242
279
 
243
- To run tests you need run next commands:
280
+ To run the test you need to do this:
244
281
 
245
282
  ```
246
283
  bundle install
@@ -267,5 +304,5 @@ extra-field support contributed by Tatsuki Sugiura (sugi at nemui.org)
267
304
 
268
305
  ## License
269
306
 
270
- rubyzip is distributed under the same license as ruby. See
307
+ Rubyzip is distributed under the same license as ruby. See
271
308
  http://www.ruby-lang.org/en/LICENSE.txt
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rake/testtask'
3
3
 
4
- task :default => :test
4
+ task default: :test
5
5
 
6
6
  Rake::TestTask.new(:test) do |test|
7
7
  test.libs << 'lib'
@@ -10,10 +10,9 @@ Rake::TestTask.new(:test) do |test|
10
10
  test.verbose = true
11
11
  end
12
12
 
13
- #Rake::TestTask.new(:zip64_full_test) do |test|
13
+ # Rake::TestTask.new(:zip64_full_test) do |test|
14
14
  # test.libs << File.join(File.dirname(__FILE__), 'lib')
15
15
  # test.libs << File.join(File.dirname(__FILE__), 'test')
16
16
  # test.pattern = File.join(File.dirname(__FILE__), 'test/zip64_full_test.rb')
17
17
  # test.verbose = true
18
- #end
19
-
18
+ # end
data/lib/zip.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'delegate'
2
2
  require 'singleton'
3
3
  require 'tempfile'
4
+ require 'tmpdir'
4
5
  require 'fileutils'
5
6
  require 'stringio'
6
7
  require 'zlib'
@@ -30,14 +31,10 @@ require 'zip/streamable_stream'
30
31
  require 'zip/streamable_directory'
31
32
  require 'zip/constants'
32
33
  require 'zip/errors'
33
- if defined? JRUBY_VERSION
34
- require 'jruby'
35
- JRuby.objectspace = true
36
- end
37
34
 
38
35
  module Zip
39
36
  extend self
40
- attr_accessor :unicode_names, :on_exists_proc, :continue_on_exists_proc, :sort_entries, :default_compression, :write_zip64_support, :warn_invalid_date
37
+ attr_accessor :unicode_names, :on_exists_proc, :continue_on_exists_proc, :sort_entries, :default_compression, :write_zip64_support, :warn_invalid_date, :case_insensitive_match
41
38
 
42
39
  def reset!
43
40
  @_ran_once = false
@@ -48,6 +45,7 @@ module Zip
48
45
  @default_compression = ::Zlib::DEFAULT_COMPRESSION
49
46
  @write_zip64_support = false
50
47
  @warn_invalid_date = true
48
+ @case_insensitive_match = false
51
49
  end
52
50
 
53
51
  def setup
@@ -5,7 +5,7 @@ module Zip
5
5
  END_OF_CDS = 0x06054b50
6
6
  ZIP64_END_OF_CDS = 0x06064b50
7
7
  ZIP64_EOCD_LOCATOR = 0x07064b50
8
- MAX_END_OF_CDS_SIZE = 65536 + 18
8
+ MAX_END_OF_CDS_SIZE = 65_536 + 18
9
9
  STATIC_EOCD_SIZE = 22
10
10
 
11
11
  attr_reader :comment
@@ -96,7 +96,7 @@ module Zip
96
96
  @size_in_bytes = Entry.read_zip_64_long(buf)
97
97
  @cdir_offset = Entry.read_zip_64_long(buf)
98
98
  @zip_64_extensible = buf.slice!(0, buf.bytesize)
99
- raise Error, "Zip consistency problem while reading eocd structure" unless buf.size == 0
99
+ raise Error, 'Zip consistency problem while reading eocd structure' unless buf.size == 0
100
100
  end
101
101
 
102
102
  def read_e_o_c_d(buf) #:nodoc:
@@ -113,14 +113,14 @@ module Zip
113
113
  else
114
114
  buf.read(comment_length)
115
115
  end
116
- raise Error, "Zip consistency problem while reading eocd structure" unless buf.size == 0
116
+ raise Error, 'Zip consistency problem while reading eocd structure' unless buf.size == 0
117
117
  end
118
118
 
119
119
  def read_central_directory_entries(io) #:nodoc:
120
120
  begin
121
121
  io.seek(@cdir_offset, IO::SEEK_SET)
122
122
  rescue Errno::EINVAL
123
- raise Error, "Zip consistency problem while reading central directory entry"
123
+ raise Error, 'Zip consistency problem while reading central directory entry'
124
124
  end
125
125
  @entry_set = EntrySet.new
126
126
  @size.times do
@@ -140,7 +140,7 @@ module Zip
140
140
 
141
141
  def get_e_o_c_d(buf) #:nodoc:
142
142
  sig_index = buf.rindex([END_OF_CDS].pack('V'))
143
- raise Error, "Zip end of central directory signature not found" unless sig_index
143
+ raise Error, 'Zip end of central directory signature not found' unless sig_index
144
144
  buf = buf.slice!((sig_index + 4)..(buf.bytesize))
145
145
 
146
146
  def buf.read(count)
@@ -165,9 +165,9 @@ module Zip
165
165
 
166
166
  def get_64_e_o_c_d(buf) #:nodoc:
167
167
  zip_64_start = buf.rindex([ZIP64_END_OF_CDS].pack('V'))
168
- raise Error, "Zip64 end of central directory signature not found" unless zip_64_start
168
+ raise Error, 'Zip64 end of central directory signature not found' unless zip_64_start
169
169
  zip_64_locator = buf.rindex([ZIP64_EOCD_LOCATOR].pack('V'))
170
- raise Error, "Zip64 end of central directory signature locator not found" unless zip_64_locator
170
+ raise Error, 'Zip64 end of central directory signature locator not found' unless zip_64_locator
171
171
  buf = buf.slice!((zip_64_start + 4)..zip_64_locator)
172
172
 
173
173
  def buf.read(count)
File without changes
@@ -6,7 +6,7 @@ module Zip
6
6
 
7
7
  LOCAL_ENTRY_SIGNATURE = 0x04034b50
8
8
  LOCAL_ENTRY_STATIC_HEADER_LENGTH = 30
9
- LOCAL_ENTRY_TRAILING_DESCRIPTOR_LENGTH = 4+4+4
9
+ LOCAL_ENTRY_TRAILING_DESCRIPTOR_LENGTH = 4 + 4 + 4
10
10
  VERSION_MADE_BY = 52 # this library's version
11
11
  VERSION_NEEDED_TO_EXTRACT = 20
12
12
  VERSION_NEEDED_TO_EXTRACT_ZIP64 = 45
@@ -58,6 +58,6 @@ module Zip
58
58
  FSTYPE_TANDEM => 'Tandem NSK'.freeze,
59
59
  FSTYPE_THEOS => 'Theos'.freeze,
60
60
  FSTYPE_MAC_OSX => 'Mac OS/X (Darwin)'.freeze,
61
- FSTYPE_ATHEOS => 'AtheOS'.freeze,
61
+ FSTYPE_ATHEOS => 'AtheOS'.freeze
62
62
  }.freeze
63
63
  end
@@ -12,7 +12,7 @@ module Zip
12
12
  class NullEncrypter < Encrypter
13
13
  include NullEncryption
14
14
 
15
- def header(mtime)
15
+ def header(_mtime)
16
16
  ''
17
17
  end
18
18
 
@@ -20,7 +20,7 @@ module Zip
20
20
  data
21
21
  end
22
22
 
23
- def data_descriptor(crc32, compressed_size, uncomprssed_size)
23
+ def data_descriptor(_crc32, _compressed_size, _uncomprssed_size)
24
24
  ''
25
25
  end
26
26
 
@@ -35,7 +35,7 @@ module Zip
35
35
  data
36
36
  end
37
37
 
38
- def reset!(header)
38
+ def reset!(_header)
39
39
  end
40
40
  end
41
41
  end
@@ -26,7 +26,7 @@ module Zip
26
26
 
27
27
  def update_keys(n)
28
28
  @key0 = ~Zlib.crc32(n, ~@key0)
29
- @key1 = ((@key1 + (@key0 & 0xff)) * 134775813 + 1) & 0xffffffff
29
+ @key1 = ((@key1 + (@key0 & 0xff)) * 134_775_813 + 1) & 0xffffffff
30
30
  @key2 = ~Zlib.crc32((@key1 >> 24).chr, ~@key2)
31
31
  end
32
32
 
@@ -46,15 +46,15 @@ module Zip
46
46
  end
47
47
  header << (mtime.to_binary_dos_time & 0xff)
48
48
  header << (mtime.to_binary_dos_time >> 8)
49
- end.map{|x| encode x}.pack("C*")
49
+ end.map { |x| encode x }.pack('C*')
50
50
  end
51
51
 
52
52
  def encrypt(data)
53
- data.unpack("C*").map{|x| encode x}.pack("C*")
53
+ data.unpack('C*').map { |x| encode x }.pack('C*')
54
54
  end
55
55
 
56
56
  def data_descriptor(crc32, compressed_size, uncomprssed_size)
57
- [0x08074b50, crc32, compressed_size, uncomprssed_size].pack("VVVV")
57
+ [0x08074b50, crc32, compressed_size, uncomprssed_size].pack('VVVV')
58
58
  end
59
59
 
60
60
  def reset!
@@ -74,7 +74,7 @@ module Zip
74
74
  include TraditionalEncryption
75
75
 
76
76
  def decrypt(data)
77
- data.unpack("C*").map{|x| decode x}.pack("C*")
77
+ data.unpack('C*').map { |x| decode x }.pack('C*')
78
78
  end
79
79
 
80
80
  def reset!(header)
@@ -1,9 +1,9 @@
1
1
  module Zip
2
2
  class Decompressor #:nodoc:all
3
- CHUNK_SIZE = 32768
3
+ CHUNK_SIZE = 32_768
4
4
  def initialize(input_stream)
5
5
  super()
6
- @input_stream=input_stream
6
+ @input_stream = input_stream
7
7
  end
8
8
  end
9
9
  end
@@ -1,6 +1,5 @@
1
1
  module Zip
2
2
  class Deflater < Compressor #:nodoc:all
3
-
4
3
  def initialize(output_stream, level = Zip.default_compression, encrypter = NullEncrypter.new)
5
4
  super()
6
5
  @output_stream = output_stream
@@ -8,18 +7,21 @@ module Zip
8
7
  @size = 0
9
8
  @crc = ::Zlib.crc32
10
9
  @encrypter = encrypter
11
- @buffer_stream = ::StringIO.new('')
12
10
  end
13
11
 
14
- def << (data)
12
+ def <<(data)
15
13
  val = data.to_s
16
- @crc = Zlib::crc32(val, @crc)
14
+ @crc = Zlib.crc32(val, @crc)
17
15
  @size += val.bytesize
18
- @buffer_stream << @zlib_deflater.deflate(data)
16
+ buffer = @zlib_deflater.deflate(data)
17
+ if buffer.empty?
18
+ @output_stream
19
+ else
20
+ @output_stream << @encrypter.encrypt(buffer)
21
+ end
19
22
  end
20
23
 
21
24
  def finish
22
- @output_stream << @encrypter.encrypt(@buffer_stream.string)
23
25
  @output_stream << @encrypter.encrypt(@zlib_deflater.finish) until @zlib_deflater.finished?
24
26
  end
25
27
 
@@ -1,7 +1,6 @@
1
1
  module Zip
2
2
  class DOSTime < Time #:nodoc:all
3
-
4
- #MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
3
+ # MS-DOS File Date and Time format as used in Interrupt 21H Function 57H:
5
4
 
6
5
  # Register CX, the Time:
7
6
  # Bits 0-4 2 second increments (0-29)
@@ -14,7 +13,7 @@ module Zip
14
13
  # bits 9-15 year (four digit year minus 1980)
15
14
 
16
15
  def to_binary_dos_time
17
- (sec/2) +
16
+ (sec / 2) +
18
17
  (min << 5) +
19
18
  (hour << 11)
20
19
  end
@@ -27,7 +26,7 @@ module Zip
27
26
 
28
27
  # Dos time is only stored with two seconds accuracy
29
28
  def dos_equals(other)
30
- to_i/2 == other.to_i/2
29
+ to_i / 2 == other.to_i / 2
31
30
  end
32
31
 
33
32
  def self.parse_binary_dos_format(binaryDosDate, binaryDosTime)
@@ -38,7 +37,7 @@ module Zip
38
37
  month = (0b111100000 & binaryDosDate) >> 5
39
38
  year = ((0b1111111000000000 & binaryDosDate) >> 9) + 1980
40
39
  begin
41
- self.local(year, month, day, hour, minute, second)
40
+ local(year, month, day, hour, minute, second)
42
41
  end
43
42
  end
44
43
  end