zip_tricks 4.4.2 → 4.5.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c690345707197b65846cdbda6096a94321edd088
4
- data.tar.gz: 23fb11b83016deacb2d94f6fb7ac8a5a2f8a6821
3
+ metadata.gz: dd1865613940a7038642206baf6cd58457b87ff5
4
+ data.tar.gz: 3ebda3c665c9671d9f033d6f768ccdc800d7f2f9
5
5
  SHA512:
6
- metadata.gz: 854c3bd1a6d7d52f83187f925736f610fcc564a3fa892007b27ca4dc8ace5548d56fc872cf6acec2e6395dc70638b97beda07f29877bbe4562d736839ddea0b6
7
- data.tar.gz: 475035d3ec2229b154b264bf1b0e7dc8ada36b008cbfea64323bf8e251d54c553957dadac5fa16b0f322ba8c35bc88ca933243325b72a34d2c9533d9d853dffa
6
+ metadata.gz: c16f15ab10788d90fe96e61e8ecf20a20eee6a7e94d2d22538c34964d51eb9ee4cc64459dd46997f2b994212944e34e8162d7880ff4d79343c86a5d1ed09fd77
7
+ data.tar.gz: da1d6e24031365ea67fc2fa0fbf3096f57b007c6ac35449b57b1783eecfa703d530c1c695429335bee252a841da6722f3bca341bd6fc8c5e9e24bf6379edee76
@@ -0,0 +1,7 @@
1
+ engines:
2
+ rubocop:
3
+ enabled: true
4
+
5
+ ratings:
6
+ paths:
7
+ - "**.rb"
data/.gitignore CHANGED
@@ -9,6 +9,9 @@ rdoc
9
9
  doc
10
10
  .yardoc
11
11
 
12
+ # Rubocop
13
+ rubocop.html
14
+
12
15
  # bundler
13
16
  .bundle
14
17
  Gemfile.lock
@@ -51,3 +54,6 @@ testing/*.zip
51
54
 
52
55
  # For rubinius:
53
56
  #*.rbc
57
+
58
+ # Rubocop report
59
+ rubocop.html
@@ -0,0 +1,79 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ Metrics/LineLength:
4
+ Max: 120
5
+
6
+ AllCops:
7
+ Exclude:
8
+ - spec/**/*.rb
9
+ - zip_tricks.gemspec
10
+ - Gemfile
11
+ - Rakefile
12
+ - vendor/**/*
13
+ - julik_scratchpad/**/*
14
+
15
+ Style/ClassAndModuleChildren:
16
+ Enabled:
17
+ false
18
+
19
+ # "begin; ... rescue; end " without saying that we only rescue StandardError and below.
20
+ # Can be debated, but I think it is reasonable to expect any Rubyist to know what errors
21
+ # the standard rescue clause covers.
22
+ Lint/RescueWithoutErrorClass:
23
+ Enabled: false
24
+
25
+ Lint/AssignmentInCondition:
26
+ Enabled: false
27
+
28
+ # We use % all over and nothing ever came out of it
29
+ Style/FormatString:
30
+ Enabled: false
31
+
32
+ # We have classes with methods having long bodies. We apply a lot of literal small
33
+ # operations which have to be applied in one locality specifically. Additionally,
34
+ # class length is a bit of a boilerplate metric
35
+ Metrics/ClassLength:
36
+ Enabled: false
37
+
38
+ # Idem. We have quite some methods that do a lot of small writes/reads in rapid
39
+ # succession - not because those methods have high cyclomatic complexity, but
40
+ # because they perform a single operation consisting of many sequential small
41
+ # ones.
42
+ Metrics/MethodLength:
43
+ Enabled: false
44
+
45
+ Metrics/AbcSize:
46
+ Exclude:
47
+ - examples/rack_application.rb
48
+ - lib/zip_tricks/file_reader.rb
49
+ - lib/zip_tricks/remote_io.rb
50
+ - lib/zip_tricks/streamer.rb
51
+ - testing/support.rb
52
+
53
+ Metrics/BlockLength:
54
+ Exclude:
55
+ - lib/zip_tricks/file_reader.rb
56
+
57
+ Layout/MultilineOperationIndentation:
58
+ Exclude:
59
+ - lib/zip_tricks/file_reader.rb
60
+
61
+ Metrics/ParameterLists:
62
+ Exclude:
63
+ - lib/zip_tricks/streamer.rb
64
+
65
+ Style/GlobalVars:
66
+ Exclude:
67
+ - testing/generate_test_files.rb
68
+ - testing/support.rb
69
+
70
+ # The advice this cop gives varies depending on the Ruby version,
71
+ # so no - I will not be following two conflicting recommendations.
72
+ Style/MutableConstant:
73
+ Enabled: false
74
+
75
+ Layout/SpaceInsideHashLiteralBraces:
76
+ EnforcedStyle: no_space
77
+
78
+ Style/Alias:
79
+ EnforcedStyle: prefer_alias_method
@@ -0,0 +1,43 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-09-11 13:38:55 +0200 using RuboCop version 0.49.1.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 6
10
+ Lint/UselessAssignment:
11
+ Exclude:
12
+ - 'lib/zip_tricks/streamer.rb'
13
+ - 'spec/zip_tricks/block_deflate_spec.rb'
14
+ - 'spec/zip_tricks/file_reader_spec.rb'
15
+ - 'spec/zip_tricks/remote_uncap_spec.rb'
16
+ - 'spec/zip_tricks/stream_crc32_spec.rb'
17
+ - 'spec/zip_tricks/streamer_spec.rb'
18
+
19
+ # Offense count: 1
20
+ Metrics/PerceivedComplexity:
21
+ Max: 8
22
+
23
+ # Offense count: 4
24
+ Style/Documentation:
25
+ Exclude:
26
+ - 'spec/**/*'
27
+ - 'test/**/*'
28
+ - 'lib/zip_tricks/block_deflate.rb'
29
+ - 'lib/zip_tricks/block_write.rb'
30
+ - 'lib/zip_tricks/file_reader.rb'
31
+ - 'lib/zip_tricks/streamer/deflated_writer.rb'
32
+
33
+ # Offense count: 1
34
+ # Configuration parameters: MinBodyLength.
35
+ Style/GuardClause:
36
+ Exclude:
37
+ - 'lib/zip_tricks/file_reader.rb'
38
+
39
+ # Offense count: 2
40
+ Style/StructInheritance:
41
+ Exclude:
42
+ - 'lib/zip_tricks/streamer/entry.rb'
43
+ - 'spec/zip_tricks/zip_writer_spec.rb'
@@ -9,4 +9,6 @@ cache: bundler
9
9
  matrix:
10
10
  allow_failures:
11
11
  - rvm: jruby-9.0
12
- script: bundle exec rspec
12
+ script:
13
+ - bundle exec rubocop -c .rubocop.yml --force-exclusion
14
+ - bundle exec rspec
@@ -1,3 +1,12 @@
1
+ ## 4.5.0
2
+
3
+ * Rename `Streamer#add_compressed_entry` and `SizeEstimator#add_compressed_entry` to `add_deflated_entry`
4
+ to indicate the type of compression that is going to get used.
5
+ * Make `Streamer#write_(deflated|stored)_file` return a writable object that can be `.close`d, to
6
+ permit usage of those methods in situations where suspending a block is inconvenient (make deferred writing possible).
7
+ * Fix CRC32 checksums in `Streamer#write_deflated_file`
8
+ * Add `Streamer#update_last_entry_and_write_data_descriptor` to permit externally-driven flows that use data descriptors
9
+
1
10
  ## 4.4.2
2
11
 
3
12
  * Add 2.4 to Travis rubies
data/Rakefile CHANGED
@@ -1,12 +1,15 @@
1
- require "bundler/gem_tasks"
2
- require "rspec/core/rake_task"
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
3
  require 'yard'
4
+ require 'rubocop/rake_task'
4
5
 
5
6
  YARD::Rake::YardocTask.new(:doc) do |t|
6
- # The dash has to be between the two to "divide" the source files and
7
+ # The dash has to be between the two to "divide" the source files and
7
8
  # miscellaneous documentation files that contain no code
8
9
  t.files = ['lib/**/*.rb', '-', 'LICENSE.txt', 'IMPLEMENTATION_DETAILS.md']
9
10
  end
10
11
 
11
12
  RSpec::Core::RakeTask.new(:spec)
12
- task :default => :spec
13
+ task default: :spec
14
+
15
+ RuboCop::RakeTask.new
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../lib/zip_tricks'
2
4
 
3
- # Predict how large a ZIP file is going to be without having access to the actual
4
- # file contents, but using just the filenames (influences the file size) and the size
5
- # of the files
5
+ # Predict how large a ZIP file is going to be without having access to
6
+ # the actual file contents, but using just the filenames (influences the
7
+ # file size) and the size of the files
6
8
  zip_archive_size_in_bytes = ZipTricks::SizeEstimator.estimate do |zip|
7
9
  # Pretend we are going to make a ZIP file which contains a few
8
10
  # MP4 files (those do not compress all too well)
9
- zip.add_stored_entry(filename: "MOV_1234.MP4", size: 898090)
10
- zip.add_stored_entry(filename: "MOV_1235.MP4", size: 7855126)
11
+ zip.add_stored_entry(filename: 'MOV_1234.MP4', size: 898_090)
12
+ zip.add_stored_entry(filename: 'MOV_1235.MP4', size: 7_855_126)
11
13
  end
12
14
 
13
- puts zip_archive_size_in_bytes #=> 8753467
15
+ puts zip_archive_size_in_bytes #=> 8_753_467
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require File.dirname(__FILE__) + '/rack_application.rb'
2
4
 
3
5
  # Demonstrates a Rack app that can offer a ZIP download composed
4
6
  # at runtime (see rack_application.rb)
5
- run ZipDownload.new
7
+ run ZipDownload.new
@@ -1,50 +1,58 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../lib/zip_tricks'
2
4
  require 'tempfile'
3
5
 
4
6
  # This shows how to perform compression in parallel (a-la pigz, but in a less
5
- # advanced fashion since the compression tables are not shared - to minimize shared state).
7
+ # advanced fashion since the compression tables are not shared - to
8
+ # minimize shared state).
6
9
  #
7
- # When using this approach, compressing a large file can be performed as a map-reduce operation.
8
- # First you prepare all the data per part of your (potentially very large) file, and then you use
9
- # the reduce task to combine that data into one linear zip. In this example we will generate threads
10
- # and collect their return values in the order the threads were launched, which guarantees a consistent
11
- # reduce.
10
+ # When using this approach, compressing a large file can be performed as a
11
+ # map-reduce operation.
12
+ # First you prepare all the data per part of your (potentially very large) file,
13
+ # and then you use the reduce task to combine that data into one linear zip.
14
+ # In this example we will generate threads and collect their return values in
15
+ # the order the threads were launched, which guarantees a consistent reduce.
12
16
  #
13
17
  # So, let each thread generate a part of the file, and also
14
18
  # compute the CRC32 of it. The thread will compress it's own part
15
- # as well, in an independent deflate segment - the threads do not share anything. You could also
16
- # multiplex this over multiple processes or even machines.
19
+ # as well, in an independent deflate segment - the threads do not share
20
+ # anything. You could also multiplex this over multiple processes or
21
+ # even machines.
17
22
  threads = (0..12).map do
18
23
  Thread.new do
19
24
  source_tempfile = Tempfile.new 't'
20
25
  source_tempfile.binmode
21
-
26
+
22
27
  # Fill the part with random content
23
28
  12.times { source_tempfile << Random.new.bytes(1 * 1024 * 1024) }
24
29
  source_tempfile.rewind
25
-
30
+
26
31
  # Compute the CRC32 of the source file
27
32
  part_crc = ZipTricks::StreamCRC32.from_io(source_tempfile)
28
33
  source_tempfile.rewind
29
-
34
+
30
35
  # Create a compressed part
31
36
  compressed_tempfile = Tempfile.new('tc')
32
37
  compressed_tempfile.binmode
33
- ZipTricks::BlockDeflate.deflate_in_blocks(source_tempfile, compressed_tempfile)
34
-
38
+ ZipTricks::BlockDeflate.deflate_in_blocks(source_tempfile,
39
+ compressed_tempfile)
40
+
35
41
  source_tempfile.close!
36
42
  # The data that the splicing process needs.
37
43
  [compressed_tempfile, part_crc, source_tempfile.size]
38
44
  end
39
45
  end
40
46
 
41
- # Threads return us a tuple with [compressed_tempfile, source_part_size, source_part_crc]
47
+ # Threads return us a tuple with [compressed_tempfile, source_part_size,
48
+ # source_part_crc]
42
49
  compressed_tempfiles_and_crc_of_parts = threads.map(&:join).map(&:value)
43
50
 
44
- # Now we need to compute the CRC32 of the _entire_ file, and it has to be the CRC32
45
- # of the _source_ file (uncompressed), not of the compressed variant. Handily we know
51
+ # Now we need to compute the CRC32 of the _entire_ file, and it has to be
52
+ # the CRC32 of the _source_ file (uncompressed), not of the compressed variant.
53
+ # Handily we know
46
54
  entire_file_crc = ZipTricks::StreamCRC32.new
47
- compressed_tempfiles_and_crc_of_parts.each do | _, source_part_crc, source_part_size|
55
+ compressed_tempfiles_and_crc_of_parts.each do |_, source_part_crc, source_part_size|
48
56
  entire_file_crc.append(source_part_crc, source_part_size)
49
57
  end
50
58
 
@@ -56,7 +64,7 @@ ZipTricks::BlockDeflate.write_terminator(last_compressed_part)
56
64
  # To figure that out we just sum the sizes of the files
57
65
  compressed_part_files = compressed_tempfiles_and_crc_of_parts.map(&:first)
58
66
  size_of_deflated_segment = compressed_part_files.map(&:size).inject(&:+)
59
- size_of_uncompressed_file = compressed_tempfiles_and_crc_of_parts.map{|e| e[2]}.inject(&:+)
67
+ size_of_uncompressed_file = compressed_tempfiles_and_crc_of_parts.map { |e| e[2] }.inject(&:+)
60
68
 
61
69
  # And now we can create a ZIP with our compressed file in it's entirety.
62
70
  # We use a File as a destination here, but you can also use a socket or a
@@ -64,8 +72,11 @@ size_of_uncompressed_file = compressed_tempfiles_and_crc_of_parts.map{|e| e[2]}.
64
72
  # made for streaming.
65
73
  output = File.open('zip_created_in_parallel.zip', 'wb')
66
74
 
67
- ZipTricks::Streamer.open(output) do | zip |
68
- zip.add_compressed_entry("parallel.bin", size_of_uncompressed_file, entire_file_crc.to_i, size_of_deflated_segment)
75
+ ZipTricks::Streamer.open(output) do |zip|
76
+ zip.add_deflated_entry('parallel.bin',
77
+ size_of_uncompressed_file,
78
+ entire_file_crc.to_i,
79
+ size_of_deflated_segment)
69
80
  compressed_part_files.each do |part_file|
70
81
  part_file.rewind
71
82
  while blob = part_file.read(2048)
@@ -1,26 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../lib/zip_tricks'
2
4
 
3
5
  # An example of how you can create a Rack endpoint for your ZIP downloads.
4
6
  # NEVER run this in production - it is a huge security risk.
5
7
  # What this app will do is pick PATH_INFO (your request URL path)
6
8
  # and grab a file located at this path on your filesystem. The file will then
7
- # be added to a ZIP archive created completely programmatically. No data will be cached
8
- # on disk and the contents of the ZIP file will _not_ be buffered in it's entirety
9
- # before sending. Unless you use a buffering Rack server of course (WEBrick or Thin).
9
+ # be added to a ZIP archive created completely programmatically. No data will
10
+ # be cached on disk and the contents of the ZIP file will _not_ be buffered in
11
+ # it's entirety before sending. Unless you use a buffering Rack server of
12
+ # course (WEBrick or Thin).
10
13
  class ZipDownload
11
14
  def call(env)
12
15
  file_path = env['PATH_INFO'] # Should be the absolute path on the filesystem
13
-
16
+
14
17
  # Open the file for binary reading
15
18
  f = File.open(file_path, 'rb')
16
19
  filename = File.basename(file_path)
17
-
18
- # Compute the CRC32 upfront. We do not use local footers for post-computing the CRC32,
19
- # so you _do_ have to precompute it beforehand. Ideally, you would do that before
20
- # storing the files you will be sending out later on.
20
+
21
+ # Compute the CRC32 upfront. We do not use local footers for post-computing
22
+ # the CRC32, so you _do_ have to precompute it beforehand. Ideally, you
23
+ # would do that before storing the files you will be sending out later on.
21
24
  crc32 = ZipTricks::StreamCRC32.from_io(f)
22
25
  f.rewind
23
-
26
+
24
27
  # Compute the size of the download, so that a
25
28
  # real Content-Length header can be sent. Also, if your download
26
29
  # stops at some point, the downloading browser will be able to tell
@@ -30,7 +33,7 @@ class ZipDownload
30
33
  size = ZipTricks::SizeEstimator.estimate do |ar|
31
34
  ar.add_stored_entry(filename, f.size)
32
35
  end
33
-
36
+
34
37
  # Create a suitable Rack response body, that will support each(),
35
38
  # close() and all the other methods. We can then return it up the stack.
36
39
  zip_response_body = ZipTricks::RackBody.new do |zip|
@@ -38,20 +41,25 @@ class ZipDownload
38
41
  # We are adding only one file to the ZIP here, but you could do that
39
42
  # with an arbitrary number of files of course.
40
43
  zip.add_stored_entry(filename: filename, size: f.size, crc32: crc32)
41
- # Write the contents of the file. It is stored, so the writes go directly
42
- # to the Rack output, bypassing any RubyZip deflaters/compressors. In fact you
43
- # are yielding the "blob" string here directly to the Rack server handler.
44
+ # Write the contents of the file. It is stored, so the writes go
45
+ # directly to the Rack output, bypassing any RubyZip
46
+ # deflaters/compressors. In fact you are yielding the "blob" string
47
+ # here directly to the Rack server handler.
44
48
  IO.copy_stream(f, zip)
45
49
  ensure
46
50
  f.close # Make sure the opened file we read from gets closed
47
51
  end
48
52
  end
49
-
53
+
50
54
  # Add a Content-Disposition so that the download has a .zip extension
51
55
  # (this will not work well with UTF-8 filenames on Windows, but hey!)
52
- content_disposition = 'attachment; filename=%s.zip' % filename
53
-
56
+ content_disposition = format('attachment; filename=%s.zip', filename)
57
+
54
58
  # and return the response, adding the Content-Length we have computed earlier
55
- [200, {'Content-Length' => size.to_s, 'Content-Disposition' => content_disposition}, zip_response_body]
59
+ [
60
+ 200,
61
+ {'Content-Length' => size.to_s, 'Content-Disposition' => content_disposition},
62
+ zip_response_body
63
+ ]
56
64
  end
57
65
  end
@@ -1,4 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Require all the sub-components except myself
1
4
  module ZipTricks
2
- # Require all the sub-components except myself
3
- Dir.glob(__dir__ + '/**/*.rb').sort.each {|p| require p unless p == __FILE__ }
5
+ Dir.glob(__dir__ + '/**/*.rb').sort.each { |p| require p unless p == __FILE__ }
4
6
  end
@@ -1,45 +1,57 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'zlib'
2
4
 
3
5
  # Permits Deflate compression in independent blocks. The workflow is as follows:
4
6
  #
5
- # * Run every block to compress through deflate_chunk, remove the header, footer and adler32 from the result
6
- # * Write out the compressed block bodies (the ones deflate_chunk returns)to your output, in sequence
7
+ # * Run every block to compress through deflate_chunk, remove the header,
8
+ # footer and adler32 from the result
9
+ # * Write out the compressed block bodies (the ones deflate_chunk returns)
10
+ # to your output, in sequence
7
11
  # * Write out the footer (\03\00)
8
12
  #
9
- # The resulting stream is guaranteed to be handled properly by all zip unarchiving tools, including the
10
- # BOMArchiveHelper/ArchiveUtility on OSX.
13
+ # The resulting stream is guaranteed to be handled properly by all zip
14
+ # unarchiving tools, including the BOMArchiveHelper/ArchiveUtility on OSX.
11
15
  #
12
16
  # You could also build a compressor for Rubyzip using this module quite easily,
13
17
  # even though this is outside the scope of the library.
14
18
  #
15
- # When you deflate the chunks separately, you need to write the end marker yourself (using `write_terminator`).
16
- # If you just want to deflate a large IO's contents, use `deflate_in_blocks_and_terminate` to have the end marker
17
- # written out for you.
19
+ # When you deflate the chunks separately, you need to write the end marker
20
+ # yourself (using `write_terminator`).
21
+ # If you just want to deflate a large IO's contents, use
22
+ # `deflate_in_blocks_and_terminate` to have the end marker written out for you.
18
23
  #
19
24
  # Basic usage to compress a file in parts:
20
- #
25
+ #
21
26
  # source_file = File.open('12_gigs.bin', 'rb')
22
27
  # compressed = Tempfile.new
23
- # # Will not compress everything in memory, but do it per chunk to spare memory. `compressed`
28
+ # # Will not compress everything in memory, but do it per chunk to spare
29
+ # memory. `compressed`
24
30
  # # will be written to at the end of each chunk.
25
- # ZipTricks::BlockDeflate.deflate_in_blocks_and_terminate(source_file, compressed)
26
- #
27
- # You can also do the same to parts that you will later concatenate together elsewhere, in that case
28
- # you need to skip the end marker:
29
- #
31
+ # ZipTricks::BlockDeflate.deflate_in_blocks_and_terminate(source_file,
32
+ # compressed)
33
+ #
34
+ # You can also do the same to parts that you will later concatenate together
35
+ # elsewhere, in that case you need to skip the end marker:
36
+ #
30
37
  # compressed = Tempfile.new
31
- # ZipTricks::BlockDeflate.deflate_in_blocks(File.open('part1.bin', 'rb), compressed)
32
- # ZipTricks::BlockDeflate.deflate_in_blocks(File.open('part2.bin', 'rb), compressed)
33
- # ZipTricks::BlockDeflate.deflate_in_blocks(File.open('partN.bin', 'rb), compressed)
38
+ # ZipTricks::BlockDeflate.deflate_in_blocks(File.open('part1.bin', 'rb),
39
+ # compressed)
40
+ # ZipTricks::BlockDeflate.deflate_in_blocks(File.open('part2.bin', 'rb),
41
+ # compressed)
42
+ # ZipTricks::BlockDeflate.deflate_in_blocks(File.open('partN.bin', 'rb),
43
+ # compressed)
34
44
  # ZipTricks::BlockDeflate.write_terminator(compressed)
35
- #
45
+ #
36
46
  # You can also elect to just compress strings in memory (to splice them later):
37
- #
47
+ #
38
48
  # compressed_string = ZipTricks::BlockDeflate.deflate_chunk(big_string)
39
- module ZipTricks::BlockDeflate
40
- DEFAULT_BLOCKSIZE = 1024*1024*5
41
- END_MARKER = [3, 0].pack("C*")
42
- VALID_COMPRESSIONS = (Zlib::DEFAULT_COMPRESSION..Zlib::BEST_COMPRESSION).to_a.freeze # Zlib::NO_COMPRESSION..
49
+
50
+ class ZipTricks::BlockDeflate
51
+ DEFAULT_BLOCKSIZE = 1_024 * 1024 * 5
52
+ END_MARKER = [3, 0].pack('C*')
53
+ # Zlib::NO_COMPRESSION..
54
+ VALID_COMPRESSIONS = (Zlib::DEFAULT_COMPRESSION..Zlib::BEST_COMPRESSION).to_a.freeze
43
55
  # Write the end marker (\x3\x0) to the given IO.
44
56
  #
45
57
  # `output_io` can also be a {ZipTricks::Streamer} to expedite ops.
@@ -83,7 +95,10 @@ module ZipTricks::BlockDeflate
83
95
  # @param level [Fixnum] Zlib compression level (defaults to `Zlib::DEFAULT_COMPRESSION`)
84
96
  # @param block_size [Fixnum] The block size to use (defaults to `DEFAULT_BLOCKSIZE`)
85
97
  # @return [Fixnum] number of bytes written to `output_io`
86
- def self.deflate_in_blocks_and_terminate(input_io, output_io, level: Zlib::DEFAULT_COMPRESSION, block_size: DEFAULT_BLOCKSIZE)
98
+ def self.deflate_in_blocks_and_terminate(input_io,
99
+ output_io,
100
+ level: Zlib::DEFAULT_COMPRESSION,
101
+ block_size: DEFAULT_BLOCKSIZE)
87
102
  bytes_written = deflate_in_blocks(input_io, output_io, level: level, block_size: block_size)
88
103
  bytes_written + write_terminator(output_io)
89
104
  end
@@ -100,7 +115,10 @@ module ZipTricks::BlockDeflate
100
115
  # @param level [Fixnum] Zlib compression level (defaults to `Zlib::DEFAULT_COMPRESSION`)
101
116
  # @param block_size [Fixnum] The block size to use (defaults to `DEFAULT_BLOCKSIZE`)
102
117
  # @return [Fixnum] number of bytes written to `output_io`
103
- def self.deflate_in_blocks(input_io, output_io, level: Zlib::DEFAULT_COMPRESSION, block_size: DEFAULT_BLOCKSIZE)
118
+ def self.deflate_in_blocks(input_io,
119
+ output_io,
120
+ level: Zlib::DEFAULT_COMPRESSION,
121
+ block_size: DEFAULT_BLOCKSIZE)
104
122
  bytes_written = 0
105
123
  while block = input_io.read(block_size)
106
124
  deflated = deflate_chunk(block, level: level)