zip_tricks 2.6.0 → 2.6.1
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.
- checksums.yaml +4 -4
- data/lib/zip_tricks/block_deflate.rb +4 -4
- data/lib/zip_tricks/block_write.rb +4 -4
- data/lib/zip_tricks/manifest.rb +13 -13
- data/lib/zip_tricks/rack_body.rb +4 -4
- data/lib/zip_tricks/remote_io.rb +13 -12
- data/lib/zip_tricks/remote_uncap.rb +12 -12
- data/lib/zip_tricks/stored_size_estimator.rb +3 -3
- data/lib/zip_tricks/stream_crc32.rb +4 -4
- data/lib/zip_tricks/streamer.rb +18 -18
- data/lib/zip_tricks/write_and_tell.rb +5 -5
- data/lib/zip_tricks.rb +1 -1
- data/spec/zip_tricks/block_deflate_spec.rb +16 -16
- data/spec/zip_tricks/block_write_spec.rb +16 -16
- data/spec/zip_tricks/manifest_spec.rb +11 -11
- data/spec/zip_tricks/rack_body_spec.rb +6 -6
- data/spec/zip_tricks/remote_io_spec.rb +22 -14
- data/spec/zip_tricks/remote_uncap_spec.rb +20 -20
- data/spec/zip_tricks/stored_size_estimator_spec.rb +4 -4
- data/spec/zip_tricks/stream_crc32_spec.rb +7 -7
- data/spec/zip_tricks/streamer_spec.rb +47 -47
- data/spec/zip_tricks/write_and_tell_spec.rb +6 -6
- data/zip_tricks.gemspec +3 -3
- metadata +2 -2
@@ -6,7 +6,7 @@ describe ZipTricks::Streamer do
|
|
6
6
|
let(:test_text_file_path) {
|
7
7
|
File.join(__dir__, 'war-and-peace.txt')
|
8
8
|
}
|
9
|
-
|
9
|
+
|
10
10
|
# Run each test in a temporady directory, and nuke it afterwards
|
11
11
|
around(:each) do |example|
|
12
12
|
wd = Dir.pwd
|
@@ -16,68 +16,68 @@ describe ZipTricks::Streamer do
|
|
16
16
|
end
|
17
17
|
Dir.chdir(wd)
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
def rewind_after(*ios)
|
21
21
|
yield.tap { ios.map(&:rewind) }
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
it 'raises an InvalidOutput if the given object does not support the methods' do
|
25
25
|
expect {
|
26
26
|
described_class.new(nil)
|
27
27
|
}.to raise_error(ZipTricks::Streamer::InvalidOutput)
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
it 'returns the position in the IO at every call' do
|
31
31
|
io = StringIO.new
|
32
32
|
zip = described_class.new(io)
|
33
33
|
pos = zip.add_compressed_entry('file.jpg', 182919, 8921, 8912)
|
34
34
|
expect(pos).to eq(io.tell)
|
35
35
|
expect(pos).to eq(38)
|
36
|
-
|
36
|
+
|
37
37
|
retval = zip << SecureRandom.random_bytes(8912)
|
38
38
|
expect(retval).to eq(zip)
|
39
39
|
expect(io.tell).to eq(8950)
|
40
|
-
|
40
|
+
|
41
41
|
pos = zip.add_stored_entry('file.jpg', 8921, 182919)
|
42
42
|
expect(pos).to eq(8988)
|
43
43
|
zip << SecureRandom.random_bytes(8921)
|
44
44
|
expect(io.tell).to eq(17909)
|
45
|
-
|
45
|
+
|
46
46
|
pos = zip.write_central_directory!
|
47
47
|
expect(pos).to eq(io.tell)
|
48
48
|
expect(pos).to eq(17985)
|
49
|
-
|
49
|
+
|
50
50
|
pos_after_close = zip.close
|
51
51
|
expect(pos_after_close).to eq(pos)
|
52
52
|
end
|
53
|
-
|
53
|
+
|
54
54
|
it 'can write and then read the block-deflated files' do
|
55
55
|
f = Tempfile.new('raw')
|
56
56
|
f.binmode
|
57
|
-
|
57
|
+
|
58
58
|
rewind_after(f) do
|
59
59
|
f << ('A' * 1024 * 1024)
|
60
60
|
f << SecureRandom.random_bytes(1248)
|
61
61
|
f << ('B' * 1024 * 1024)
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
crc = rewind_after(f) { Zlib.crc32(f.read) }
|
65
|
-
|
65
|
+
|
66
66
|
compressed_blockwise = StringIO.new
|
67
67
|
rewind_after(compressed_blockwise, f) do
|
68
68
|
ZipTricks::BlockDeflate.deflate_in_blocks_and_terminate(f, compressed_blockwise, block_size: 1024)
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
# Perform the zipping
|
72
72
|
zip_file = Tempfile.new('z')
|
73
73
|
zip_file.binmode
|
74
|
-
|
74
|
+
|
75
75
|
described_class.open(zip_file) do |zip|
|
76
76
|
zip.add_compressed_entry("compressed-file.bin", f.size, crc, compressed_blockwise.size)
|
77
77
|
zip << compressed_blockwise.read
|
78
78
|
end
|
79
79
|
zip_file.flush
|
80
|
-
|
80
|
+
|
81
81
|
per_filename = {}
|
82
82
|
Zip::File.open(zip_file.path) do |zip_file|
|
83
83
|
# Handle entries one by one
|
@@ -86,82 +86,82 @@ describe ZipTricks::Streamer do
|
|
86
86
|
per_filename[entry.name] = entry.get_input_stream.read
|
87
87
|
end
|
88
88
|
end
|
89
|
-
|
89
|
+
|
90
90
|
expect(per_filename['compressed-file.bin'].bytesize).to eq(f.size)
|
91
91
|
expect(Digest::SHA1.hexdigest(per_filename['compressed-file.bin'])).to eq(Digest::SHA1.hexdigest(f.read))
|
92
|
-
|
92
|
+
|
93
93
|
output = `unzip -v #{zip_file.path}`
|
94
94
|
puts output.inspect
|
95
95
|
end
|
96
96
|
|
97
|
-
|
97
|
+
|
98
98
|
it 'creates an archive that OSX ArchiveUtility can handle' do
|
99
99
|
au_path = '/System/Library/CoreServices/Applications/Archive Utility.app/Contents/MacOS/Archive Utility'
|
100
100
|
unless File.exist?(au_path)
|
101
101
|
skip "This system does not have ArchiveUtility"
|
102
102
|
end
|
103
|
-
|
103
|
+
|
104
104
|
outbuf = Tempfile.new('zip')
|
105
105
|
outbuf.binmode
|
106
|
-
|
106
|
+
|
107
107
|
zip = ZipTricks::Streamer.new(outbuf)
|
108
|
-
|
108
|
+
|
109
109
|
File.open(test_text_file_path, 'rb') do | source_f |
|
110
110
|
crc32 = rewind_after(source_f) { Zlib.crc32(source_f.read) }
|
111
|
-
|
111
|
+
|
112
112
|
compressed_buffer = StringIO.new
|
113
|
-
|
113
|
+
|
114
114
|
expect(ZipTricks::BlockDeflate).to receive(:deflate_chunk).at_least(:twice).and_call_original
|
115
|
-
|
115
|
+
|
116
116
|
# Compress in blocks of 4 Kb
|
117
117
|
rewind_after(source_f, compressed_buffer) do
|
118
118
|
ZipTricks::BlockDeflate.deflate_in_blocks_and_terminate(source_f, compressed_buffer, block_size: 1024 * 4)
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
# Add this file compressed...
|
122
122
|
zip.add_compressed_entry('war-and-peace.txt', source_f.size, crc32, compressed_buffer.size)
|
123
123
|
zip << compressed_buffer.string
|
124
|
-
|
124
|
+
|
125
125
|
# ...and stored.
|
126
126
|
zip.add_stored_entry('war-and-peace-raw.txt', source_f.size, crc32)
|
127
127
|
zip << source_f.read
|
128
|
-
|
128
|
+
|
129
129
|
zip.close
|
130
|
-
|
130
|
+
|
131
131
|
outbuf.flush
|
132
132
|
File.unlink('test.zip') rescue nil
|
133
133
|
File.rename(outbuf.path, 'osx-archive-test.zip')
|
134
|
-
|
134
|
+
|
135
135
|
# ArchiveUtility sometimes puts the stuff it unarchives in ~/Downloads etc. so do
|
136
136
|
# not perform any checks on the files since we do not really know where they are on disk.
|
137
137
|
# Visual inspection should show whether the unarchiving is handled correctly.
|
138
138
|
`#{Shellwords.join([au_path, 'osx-archive-test.zip'])}`
|
139
139
|
end
|
140
|
-
|
140
|
+
|
141
141
|
FileUtils.rm_rf('osx-archive-test')
|
142
142
|
FileUtils.rm_rf('osx-archive-test.zip')
|
143
143
|
end
|
144
|
-
|
144
|
+
|
145
145
|
it 'archives files which can then be read using the usual means with Rubyzip' do
|
146
146
|
zip_buf = Tempfile.new('zipp')
|
147
147
|
zip_buf.binmode
|
148
148
|
output_io = double('IO')
|
149
|
-
|
149
|
+
|
150
150
|
# Only allow the methods we provide in BlockWrite.
|
151
151
|
# Will raise an error if other methods are triggered (the ones that
|
152
152
|
# might try to rewind the IO).
|
153
153
|
allow(output_io).to receive(:<<) {|data|
|
154
154
|
zip_buf << data.to_s.force_encoding(Encoding::BINARY)
|
155
155
|
}
|
156
|
-
|
156
|
+
|
157
157
|
allow(output_io).to receive(:tell) { zip_buf.tell }
|
158
158
|
allow(output_io).to receive(:pos) { zip_buf.pos }
|
159
159
|
allow(output_io).to receive(:close)
|
160
|
-
|
160
|
+
|
161
161
|
# Generate a couple of random files
|
162
162
|
raw_file_1 = SecureRandom.random_bytes(1024 * 20)
|
163
163
|
raw_file_2 = SecureRandom.random_bytes(1024 * 128)
|
164
|
-
|
164
|
+
|
165
165
|
# Perform the zipping
|
166
166
|
zip = described_class.new(output_io)
|
167
167
|
zip.add_stored_entry("first-file.bin", raw_file_1.size, Zlib.crc32(raw_file_1))
|
@@ -169,9 +169,9 @@ describe ZipTricks::Streamer do
|
|
169
169
|
zip.add_stored_entry("second-file.bin", raw_file_2.size, Zlib.crc32(raw_file_2))
|
170
170
|
zip << raw_file_2
|
171
171
|
zip.close
|
172
|
-
|
172
|
+
|
173
173
|
zip_buf.flush
|
174
|
-
|
174
|
+
|
175
175
|
per_filename = {}
|
176
176
|
Zip::File.open(zip_buf.path) do |zip_file|
|
177
177
|
# Handle entries one by one
|
@@ -181,10 +181,10 @@ describe ZipTricks::Streamer do
|
|
181
181
|
per_filename[entry.name] = entry.get_input_stream.read
|
182
182
|
end
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
expect(per_filename['first-file.bin'].unpack("C*")).to eq(raw_file_1.unpack("C*"))
|
186
186
|
expect(per_filename['second-file.bin'].unpack("C*")).to eq(raw_file_2.unpack("C*"))
|
187
|
-
|
187
|
+
|
188
188
|
wd = Dir.pwd
|
189
189
|
Dir.mktmpdir do | td |
|
190
190
|
Dir.chdir(td)
|
@@ -193,15 +193,15 @@ describe ZipTricks::Streamer do
|
|
193
193
|
end
|
194
194
|
Dir.chdir(wd)
|
195
195
|
end
|
196
|
-
|
196
|
+
|
197
197
|
it 'sets the general-purpose flag for entries with UTF8 names' do
|
198
198
|
zip_buf = Tempfile.new('zipp')
|
199
199
|
zip_buf.binmode
|
200
|
-
|
200
|
+
|
201
201
|
# Generate a couple of random files
|
202
202
|
raw_file_1 = SecureRandom.random_bytes(1024 * 20)
|
203
203
|
raw_file_2 = SecureRandom.random_bytes(1024 * 128)
|
204
|
-
|
204
|
+
|
205
205
|
# Perform the zipping
|
206
206
|
zip = described_class.new(zip_buf)
|
207
207
|
zip.add_stored_entry("first-file.bin", raw_file_1.size, Zlib.crc32(raw_file_1))
|
@@ -209,24 +209,24 @@ describe ZipTricks::Streamer do
|
|
209
209
|
zip.add_stored_entry("второй-файл.bin", raw_file_2.size, Zlib.crc32(raw_file_2))
|
210
210
|
zip << raw_file_2
|
211
211
|
zip.close
|
212
|
-
|
212
|
+
|
213
213
|
zip_buf.flush
|
214
|
-
|
214
|
+
|
215
215
|
entries = []
|
216
216
|
Zip::File.open(zip_buf.path) do |zip_file|
|
217
217
|
# Handle entries one by one
|
218
218
|
zip_file.each {|entry| entries << entry }
|
219
219
|
first_entry, second_entry = entries
|
220
|
-
|
220
|
+
|
221
221
|
expect(first_entry.gp_flags).to eq(0)
|
222
222
|
expect(first_entry.name).to eq('first-file.bin')
|
223
|
-
|
223
|
+
|
224
224
|
# Rubyzip does not properly set the encoding of the entries it reads
|
225
225
|
expect(second_entry.gp_flags).to eq(2048)
|
226
226
|
expect(second_entry.name).to eq("второй-файл.bin".force_encoding(Encoding::BINARY))
|
227
227
|
end
|
228
228
|
end
|
229
|
-
|
229
|
+
|
230
230
|
it 'raises when the actual bytes written for a stored entry does not match the entry header' do
|
231
231
|
expect {
|
232
232
|
ZipTricks::Streamer.open(StringIO.new) do | zip |
|
@@ -4,13 +4,13 @@ describe ZipTricks::WriteAndTell do
|
|
4
4
|
it 'maintains the count of bytes written' do
|
5
5
|
adapter = described_class.new('')
|
6
6
|
expect(adapter.tell).to be_zero
|
7
|
-
|
7
|
+
|
8
8
|
adapter << 'hello'
|
9
9
|
adapter << ''
|
10
10
|
adapter << '!'
|
11
11
|
expect(adapter.tell).to eq(6)
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it 'is able to write frozen String objects in different encodings, converting them to binary' do
|
15
15
|
strs = [
|
16
16
|
[12, 123, 0, 3].pack("C*"),
|
@@ -18,20 +18,20 @@ describe ZipTricks::WriteAndTell do
|
|
18
18
|
"текста замороженный кусок".freeze,
|
19
19
|
[12, 123, 0, 3].pack("C*"),
|
20
20
|
]
|
21
|
-
|
21
|
+
|
22
22
|
buf = 'превед'.force_encoding(Encoding::BINARY)
|
23
23
|
writer = described_class.new(buf)
|
24
24
|
strs.each {|s| writer << s }
|
25
25
|
expect(writer.tell).to eq(79)
|
26
26
|
expect(buf.bytesize).to eq(91) # It already contained some bytes
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
it 'advances the internal pointer using advance_position_by' do
|
30
30
|
str = ''
|
31
|
-
|
31
|
+
|
32
32
|
adapter = described_class.new(str)
|
33
33
|
expect(adapter.tell).to be_zero
|
34
|
-
|
34
|
+
|
35
35
|
adapter << 'hello'
|
36
36
|
adapter << ''
|
37
37
|
adapter << '!'
|
data/zip_tricks.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: zip_tricks 2.6.
|
5
|
+
# stub: zip_tricks 2.6.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "zip_tricks"
|
9
|
-
s.version = "2.6.
|
9
|
+
s.version = "2.6.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Julik Tarkhanov"]
|
14
|
-
s.date = "2016-07-
|
14
|
+
s.date = "2016-07-14"
|
15
15
|
s.description = "Makes rubyzip stream, for real"
|
16
16
|
s.email = "me@julik.nl"
|
17
17
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zip_tricks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.
|
4
|
+
version: 2.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julik Tarkhanov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|