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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e037e0584d0dbee2e4ab4d934567d04564a26e4f30348f538bda6f7697f8d700
4
- data.tar.gz: e069300aae55e54c3d88ed1a6c1e23803bdffbc92a7764de3f58a38a892f2b82
3
+ metadata.gz: f513e5300c8daa205994e7aa5a957c2270ea7378fab0dd13f57effd8f431d1ea
4
+ data.tar.gz: 9873a993a94a45339e9a1f383862ed1cc942db2fd23f4d09f6da70705afcf123
5
5
  SHA512:
6
- metadata.gz: d35e87fc08da2212b9238e4f39df44091454ff77ef41e9810785aaa6855b46c017b285672b1fd0c0bb36df3255a24219331185ce1fc5f7dcf49584c46cce92f0
7
- data.tar.gz: b50c429db7b8bbfe7b62d6b14be6cd0827cf1937f6065078b28a6d19b5e016e90e3ac2af0a3567b645ce14f44e4767ac42a5f5c20bb0e0d65ba207b310c02fc0
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 = StringIO.new.binmode
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.size > BYTES_WRITTEN_THRESHOLD
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.size.to_f
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.rewind
73
- IO.copy_stream(@buf, @winner)
74
- @buf.truncate(0)
72
+ @winner << @buf
73
+ @buf.clear
75
74
  ensure
76
75
  @deflater.close
77
76
  end
@@ -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
- filler_size_bytes = @out.tell - @offset_before_last_local_file_header
514
- @files << Filler.new(filler_size_bytes)
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ZipKit
4
- VERSION = "6.3.3"
4
+ VERSION = "6.3.4"
5
5
  end
data/rbi/zip_kit.rbi CHANGED
@@ -1,6 +1,6 @@
1
1
  # typed: strong
2
2
  module ZipKit
3
- VERSION = T.let("6.3.3", T.untyped)
3
+ VERSION = T.let("6.3.4", T.untyped)
4
4
 
5
5
  class Railtie < Rails::Railtie
6
6
  end
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.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-04-18 00:00:00.000000000 Z
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: mutex_m
205
+ name: rails
220
206
  requirement: !ruby/object:Gem::Requirement
221
207
  requirements:
222
- - - ">="
208
+ - - "~>"
223
209
  - !ruby/object:Gem::Version
224
- version: '0'
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: '0'
217
+ version: '5'
232
218
  - !ruby/object:Gem::Dependency
233
- name: bigdecimal
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: rails
247
+ name: nokogiri
248
248
  requirement: !ruby/object:Gem::Requirement
249
249
  requirements:
250
250
  - - "~>"
251
251
  - !ruby/object:Gem::Version
252
- version: '5'
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: '5'
262
+ version: '1'
263
+ - - ">="
264
+ - !ruby/object:Gem::Version
265
+ version: '1.13'
260
266
  - !ruby/object:Gem::Dependency
261
- name: actionpack
267
+ name: sord
262
268
  requirement: !ruby/object:Gem::Requirement
263
269
  requirements:
264
- - - "~>"
270
+ - - ">="
265
271
  - !ruby/object:Gem::Version
266
- version: '5'
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: '5'
279
+ version: '0'
274
280
  - !ruby/object:Gem::Dependency
275
- name: nokogiri
281
+ name: mutex_m
276
282
  requirement: !ruby/object:Gem::Requirement
277
283
  requirements:
278
- - - "~>"
284
+ - - ">="
279
285
  - !ruby/object:Gem::Version
280
- version: '1'
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: '1.13'
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: '1'
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: '1.13'
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: sinatra
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: sord
337
+ name: benchmark
310
338
  requirement: !ruby/object:Gem::Requirement
311
339
  requirements:
312
340
  - - ">="