zip_kit 6.3.3 → 6.3.4
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/CHANGELOG.md +4 -0
- data/lib/zip_kit/streamer/heuristic.rb +5 -6
- data/lib/zip_kit/streamer.rb +12 -2
- data/lib/zip_kit/version.rb +1 -1
- data/rbi/zip_kit.rbi +1 -1
- data/zip_kit.gemspec +8 -4
- metadata +67 -39
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: f513e5300c8daa205994e7aa5a957c2270ea7378fab0dd13f57effd8f431d1ea
|
|
4
|
+
data.tar.gz: 9873a993a94a45339e9a1f383862ed1cc942db2fd23f4d09f6da70705afcf123
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4e3ace1ea348f7232d04932981bb5a3d4fb2f1f5e32f01523d5420bff97cc119b7a54bc9bd0f2269f92785167fa2acfdf1e013551def137d69f02e559deae244
|
|
7
|
+
data.tar.gz: 41c9791db83d11845dfff560526bf4d32cfaf7a0be99933a20ef2677d2027064bd7dd8f1071ac6a7b1864362c6cefa439728b422dcdb9c7529394233ad1dd85b
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
## 6.3.4
|
|
2
|
+
|
|
3
|
+
* Fix a bug whereby `rollback!` would cause an exception without any entries having been written yet (rollback on first entry).
|
|
4
|
+
|
|
1
5
|
## 6.3.3
|
|
2
6
|
|
|
3
7
|
* Make sure `Writable#<<` converts the strings it is given into binary if they are not already in binary. This fixes an issue where `Heuristic` would suddenly start forwarding strings as-is to downstream callees. There is a lot of spots where the string-to-write gets forwarded and converting in every single one will be quite wasteful, but it can be handy to do in a few key places.
|
|
@@ -23,7 +23,7 @@ class ZipKit::Streamer::Heuristic < ZipKit::Streamer::Writable
|
|
|
23
23
|
@filename = filename
|
|
24
24
|
@write_file_options = write_file_options
|
|
25
25
|
|
|
26
|
-
@buf =
|
|
26
|
+
@buf = +"".b # Just use a mutable String
|
|
27
27
|
@deflater = ::Zlib::Deflate.new(Zlib::DEFAULT_COMPRESSION, -::Zlib::MAX_WBITS)
|
|
28
28
|
@bytes_deflated = 0
|
|
29
29
|
|
|
@@ -37,7 +37,7 @@ class ZipKit::Streamer::Heuristic < ZipKit::Streamer::Writable
|
|
|
37
37
|
else
|
|
38
38
|
@buf << bytes
|
|
39
39
|
@deflater.deflate(bytes) { |chunk| @bytes_deflated += chunk.bytesize }
|
|
40
|
-
decide if @buf.
|
|
40
|
+
decide if @buf.bytesize > BYTES_WRITTEN_THRESHOLD
|
|
41
41
|
end
|
|
42
42
|
self
|
|
43
43
|
end
|
|
@@ -61,7 +61,7 @@ class ZipKit::Streamer::Heuristic < ZipKit::Streamer::Writable
|
|
|
61
61
|
|
|
62
62
|
# If the deflated version is smaller than the stored one
|
|
63
63
|
# - use deflate, otherwise stored
|
|
64
|
-
ratio = @bytes_deflated / @buf.
|
|
64
|
+
ratio = @bytes_deflated / @buf.bytesize.to_f
|
|
65
65
|
@winner = if ratio <= MINIMUM_VIABLE_COMPRESSION
|
|
66
66
|
@streamer.write_deflated_file(@filename, **@write_file_options)
|
|
67
67
|
else
|
|
@@ -69,9 +69,8 @@ class ZipKit::Streamer::Heuristic < ZipKit::Streamer::Writable
|
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
# Copy the buffered uncompressed data into the newly initialized writable
|
|
72
|
-
@buf
|
|
73
|
-
|
|
74
|
-
@buf.truncate(0)
|
|
72
|
+
@winner << @buf
|
|
73
|
+
@buf.clear
|
|
75
74
|
ensure
|
|
76
75
|
@deflater.close
|
|
77
76
|
end
|
data/lib/zip_kit/streamer.rb
CHANGED
|
@@ -273,6 +273,11 @@ class ZipKit::Streamer
|
|
|
273
273
|
# output (using `IO.copy_stream` is a good approach).
|
|
274
274
|
# @return [ZipKit::Streamer::Writable] without a block - the Writable sink which has to be closed manually
|
|
275
275
|
def write_file(filename, modification_time: Time.now.utc, unix_permissions: nil, &blk)
|
|
276
|
+
# Reset rollback state when starting a new entry attempt, so that if this entry
|
|
277
|
+
# fails before writing a header, rollback! won't use stale values from a previous entry
|
|
278
|
+
@offset_before_last_local_file_header = nil
|
|
279
|
+
@remove_last_file_at_rollback = false
|
|
280
|
+
|
|
276
281
|
writable = ZipKit::Streamer::Heuristic.new(self, filename, modification_time: modification_time, unix_permissions: unix_permissions)
|
|
277
282
|
yield_or_return_writable(writable, &blk)
|
|
278
283
|
end
|
|
@@ -510,8 +515,13 @@ class ZipKit::Streamer
|
|
|
510
515
|
end
|
|
511
516
|
|
|
512
517
|
# Create filler for the truncated or unusable local file entry that did get written into the output
|
|
513
|
-
|
|
514
|
-
@
|
|
518
|
+
# Only create a filler if a local file header was actually written (indicated by
|
|
519
|
+
# @offset_before_last_local_file_header being set). If it's nil, no header was written,
|
|
520
|
+
# so there's nothing to create a filler for.
|
|
521
|
+
if @offset_before_last_local_file_header
|
|
522
|
+
filler_size_bytes = @out.tell - @offset_before_last_local_file_header
|
|
523
|
+
@files << Filler.new(filler_size_bytes)
|
|
524
|
+
end
|
|
515
525
|
|
|
516
526
|
@out.tell
|
|
517
527
|
end
|
data/lib/zip_kit/version.rb
CHANGED
data/rbi/zip_kit.rbi
CHANGED
data/zip_kit.gemspec
CHANGED
|
@@ -39,18 +39,22 @@ Gem::Specification.new do |spec|
|
|
|
39
39
|
spec.add_development_dependency "rspec", "~> 3"
|
|
40
40
|
spec.add_development_dependency "rspec-mocks", "~> 3.10", ">= 3.10.2" # ruby 3 compatibility
|
|
41
41
|
spec.add_development_dependency "complexity_assert"
|
|
42
|
-
spec.add_development_dependency "coderay"
|
|
43
42
|
spec.add_development_dependency "benchmark-ips"
|
|
44
43
|
spec.add_development_dependency "allocation_stats", "~> 0.1.5"
|
|
45
44
|
spec.add_development_dependency "yard", "~> 0.9"
|
|
46
45
|
spec.add_development_dependency "standard"
|
|
47
46
|
spec.add_development_dependency "magic_frozen_string_literal"
|
|
48
47
|
spec.add_development_dependency "puma"
|
|
49
|
-
spec.add_development_dependency "mutex_m" # Some deps use it but it is no longer in stdlib since 3.4
|
|
50
|
-
spec.add_development_dependency "bigdecimal" # Some deps use it but it is no longer in stdlib since 3.4
|
|
51
48
|
spec.add_development_dependency "rails", "~> 5" # For testing RailsStreaming against an actual Rails controller
|
|
52
49
|
spec.add_development_dependency "actionpack", "~> 5" # For testing RailsStreaming against an actual Rails controller
|
|
50
|
+
spec.add_development_dependency "sinatra" # We test streaming a ZIP out of an actual Sinatra app too
|
|
53
51
|
spec.add_development_dependency "nokogiri", "~> 1", ">= 1.13" # Rails 5 does by mistake use an older Nokogiri otherwise
|
|
54
|
-
spec.add_development_dependency "sinatra"
|
|
55
52
|
spec.add_development_dependency "sord"
|
|
53
|
+
|
|
54
|
+
# Some deps use stdlib gems which are no longer available in stdlib
|
|
55
|
+
spec.add_development_dependency "mutex_m"
|
|
56
|
+
spec.add_development_dependency "abbrev"
|
|
57
|
+
spec.add_development_dependency "ostruct"
|
|
58
|
+
spec.add_development_dependency "bigdecimal"
|
|
59
|
+
spec.add_development_dependency "benchmark"
|
|
56
60
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: zip_kit
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 6.3.
|
|
4
|
+
version: 6.3.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Julik Tarkhanov
|
|
@@ -11,7 +11,7 @@ authors:
|
|
|
11
11
|
- Felix Bünemann
|
|
12
12
|
bindir: exe
|
|
13
13
|
cert_chain: []
|
|
14
|
-
date: 2025-
|
|
14
|
+
date: 2025-11-17 00:00:00.000000000 Z
|
|
15
15
|
dependencies:
|
|
16
16
|
- !ruby/object:Gem::Dependency
|
|
17
17
|
name: bundler
|
|
@@ -117,20 +117,6 @@ dependencies:
|
|
|
117
117
|
- - ">="
|
|
118
118
|
- !ruby/object:Gem::Version
|
|
119
119
|
version: '0'
|
|
120
|
-
- !ruby/object:Gem::Dependency
|
|
121
|
-
name: coderay
|
|
122
|
-
requirement: !ruby/object:Gem::Requirement
|
|
123
|
-
requirements:
|
|
124
|
-
- - ">="
|
|
125
|
-
- !ruby/object:Gem::Version
|
|
126
|
-
version: '0'
|
|
127
|
-
type: :development
|
|
128
|
-
prerelease: false
|
|
129
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
130
|
-
requirements:
|
|
131
|
-
- - ">="
|
|
132
|
-
- !ruby/object:Gem::Version
|
|
133
|
-
version: '0'
|
|
134
120
|
- !ruby/object:Gem::Dependency
|
|
135
121
|
name: benchmark-ips
|
|
136
122
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -216,21 +202,35 @@ dependencies:
|
|
|
216
202
|
- !ruby/object:Gem::Version
|
|
217
203
|
version: '0'
|
|
218
204
|
- !ruby/object:Gem::Dependency
|
|
219
|
-
name:
|
|
205
|
+
name: rails
|
|
220
206
|
requirement: !ruby/object:Gem::Requirement
|
|
221
207
|
requirements:
|
|
222
|
-
- - "
|
|
208
|
+
- - "~>"
|
|
223
209
|
- !ruby/object:Gem::Version
|
|
224
|
-
version: '
|
|
210
|
+
version: '5'
|
|
225
211
|
type: :development
|
|
226
212
|
prerelease: false
|
|
227
213
|
version_requirements: !ruby/object:Gem::Requirement
|
|
228
214
|
requirements:
|
|
229
|
-
- - "
|
|
215
|
+
- - "~>"
|
|
230
216
|
- !ruby/object:Gem::Version
|
|
231
|
-
version: '
|
|
217
|
+
version: '5'
|
|
232
218
|
- !ruby/object:Gem::Dependency
|
|
233
|
-
name:
|
|
219
|
+
name: actionpack
|
|
220
|
+
requirement: !ruby/object:Gem::Requirement
|
|
221
|
+
requirements:
|
|
222
|
+
- - "~>"
|
|
223
|
+
- !ruby/object:Gem::Version
|
|
224
|
+
version: '5'
|
|
225
|
+
type: :development
|
|
226
|
+
prerelease: false
|
|
227
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
228
|
+
requirements:
|
|
229
|
+
- - "~>"
|
|
230
|
+
- !ruby/object:Gem::Version
|
|
231
|
+
version: '5'
|
|
232
|
+
- !ruby/object:Gem::Dependency
|
|
233
|
+
name: sinatra
|
|
234
234
|
requirement: !ruby/object:Gem::Requirement
|
|
235
235
|
requirements:
|
|
236
236
|
- - ">="
|
|
@@ -244,55 +244,83 @@ dependencies:
|
|
|
244
244
|
- !ruby/object:Gem::Version
|
|
245
245
|
version: '0'
|
|
246
246
|
- !ruby/object:Gem::Dependency
|
|
247
|
-
name:
|
|
247
|
+
name: nokogiri
|
|
248
248
|
requirement: !ruby/object:Gem::Requirement
|
|
249
249
|
requirements:
|
|
250
250
|
- - "~>"
|
|
251
251
|
- !ruby/object:Gem::Version
|
|
252
|
-
version: '
|
|
252
|
+
version: '1'
|
|
253
|
+
- - ">="
|
|
254
|
+
- !ruby/object:Gem::Version
|
|
255
|
+
version: '1.13'
|
|
253
256
|
type: :development
|
|
254
257
|
prerelease: false
|
|
255
258
|
version_requirements: !ruby/object:Gem::Requirement
|
|
256
259
|
requirements:
|
|
257
260
|
- - "~>"
|
|
258
261
|
- !ruby/object:Gem::Version
|
|
259
|
-
version: '
|
|
262
|
+
version: '1'
|
|
263
|
+
- - ">="
|
|
264
|
+
- !ruby/object:Gem::Version
|
|
265
|
+
version: '1.13'
|
|
260
266
|
- !ruby/object:Gem::Dependency
|
|
261
|
-
name:
|
|
267
|
+
name: sord
|
|
262
268
|
requirement: !ruby/object:Gem::Requirement
|
|
263
269
|
requirements:
|
|
264
|
-
- - "
|
|
270
|
+
- - ">="
|
|
265
271
|
- !ruby/object:Gem::Version
|
|
266
|
-
version: '
|
|
272
|
+
version: '0'
|
|
267
273
|
type: :development
|
|
268
274
|
prerelease: false
|
|
269
275
|
version_requirements: !ruby/object:Gem::Requirement
|
|
270
276
|
requirements:
|
|
271
|
-
- - "
|
|
277
|
+
- - ">="
|
|
272
278
|
- !ruby/object:Gem::Version
|
|
273
|
-
version: '
|
|
279
|
+
version: '0'
|
|
274
280
|
- !ruby/object:Gem::Dependency
|
|
275
|
-
name:
|
|
281
|
+
name: mutex_m
|
|
276
282
|
requirement: !ruby/object:Gem::Requirement
|
|
277
283
|
requirements:
|
|
278
|
-
- - "
|
|
284
|
+
- - ">="
|
|
279
285
|
- !ruby/object:Gem::Version
|
|
280
|
-
version: '
|
|
286
|
+
version: '0'
|
|
287
|
+
type: :development
|
|
288
|
+
prerelease: false
|
|
289
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
290
|
+
requirements:
|
|
281
291
|
- - ">="
|
|
282
292
|
- !ruby/object:Gem::Version
|
|
283
|
-
version: '
|
|
293
|
+
version: '0'
|
|
294
|
+
- !ruby/object:Gem::Dependency
|
|
295
|
+
name: abbrev
|
|
296
|
+
requirement: !ruby/object:Gem::Requirement
|
|
297
|
+
requirements:
|
|
298
|
+
- - ">="
|
|
299
|
+
- !ruby/object:Gem::Version
|
|
300
|
+
version: '0'
|
|
284
301
|
type: :development
|
|
285
302
|
prerelease: false
|
|
286
303
|
version_requirements: !ruby/object:Gem::Requirement
|
|
287
304
|
requirements:
|
|
288
|
-
- - "
|
|
305
|
+
- - ">="
|
|
289
306
|
- !ruby/object:Gem::Version
|
|
290
|
-
version: '
|
|
307
|
+
version: '0'
|
|
308
|
+
- !ruby/object:Gem::Dependency
|
|
309
|
+
name: ostruct
|
|
310
|
+
requirement: !ruby/object:Gem::Requirement
|
|
311
|
+
requirements:
|
|
291
312
|
- - ">="
|
|
292
313
|
- !ruby/object:Gem::Version
|
|
293
|
-
version: '
|
|
314
|
+
version: '0'
|
|
315
|
+
type: :development
|
|
316
|
+
prerelease: false
|
|
317
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
318
|
+
requirements:
|
|
319
|
+
- - ">="
|
|
320
|
+
- !ruby/object:Gem::Version
|
|
321
|
+
version: '0'
|
|
294
322
|
- !ruby/object:Gem::Dependency
|
|
295
|
-
name:
|
|
323
|
+
name: bigdecimal
|
|
296
324
|
requirement: !ruby/object:Gem::Requirement
|
|
297
325
|
requirements:
|
|
298
326
|
- - ">="
|
|
@@ -306,7 +334,7 @@ dependencies:
|
|
|
306
334
|
- !ruby/object:Gem::Version
|
|
307
335
|
version: '0'
|
|
308
336
|
- !ruby/object:Gem::Dependency
|
|
309
|
-
name:
|
|
337
|
+
name: benchmark
|
|
310
338
|
requirement: !ruby/object:Gem::Requirement
|
|
311
339
|
requirements:
|
|
312
340
|
- - ">="
|