diff --git a/.gitignore b/.gitignore index 2f25087..8c23598 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ test/huge.zip test/centralEntryHeader.bin test/data/generated/ test/deflatertest.bin +test/compressiontest_*.bin test/dummy.txt test/localEntryHeader.bin test/okToDeleteMoved.txt diff --git a/README.md b/README.md index 36efea2..b659c7a 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,14 @@ If you want to store non english names and want to open properly file on Windows Zip.unicode_names = true ``` +You can set the default compression level like so: + +```ruby +Zip.default_compression = Zlib::DEFAULT_COMPRESSION +``` + +It defaults to `Zlib::DEFAULT_COMPRESSION`. Possible values are `Zlib::BEST_COMPRESSION`, `Zlib::DEFAULT_COMPRESSION` and `Zlib::NO_COMPRESSION` + All settings in same time ```ruby @@ -171,6 +179,7 @@ All settings in same time c.on_exists_proc = true c.continue_on_exists_proc = true c.unicode_names = true + c.default_compression = Zlib::BEST_COMPRESSION end ``` diff --git a/lib/zip.rb b/lib/zip.rb index f78a9fe..55f78f2 100644 --- a/lib/zip.rb +++ b/lib/zip.rb @@ -34,7 +34,7 @@ end module Zip extend self - attr_accessor :unicode_names, :on_exists_proc, :continue_on_exists_proc, :sort_entries + attr_accessor :unicode_names, :on_exists_proc, :continue_on_exists_proc, :sort_entries, :default_compression def reset! @_ran_once = false @@ -42,6 +42,7 @@ module Zip @on_exists_proc = false @continue_on_exists_proc = false @sort_entries = false + @default_compression = ::Zlib::DEFAULT_COMPRESSION end def setup diff --git a/lib/zip/deflater.rb b/lib/zip/deflater.rb index 01e923b..84a8c0b 100755 --- a/lib/zip/deflater.rb +++ b/lib/zip/deflater.rb @@ -1,7 +1,7 @@ module Zip class Deflater < Compressor #:nodoc:all - def initialize(output_stream, level = ::Zlib::DEFAULT_COMPRESSION) + def initialize(output_stream, level = Zip.default_compression) super() @output_stream = output_stream @zlib_deflater = ::Zlib::Deflate.new(level, -::Zlib::MAX_WBITS) diff --git a/lib/zip/output_stream.rb b/lib/zip/output_stream.rb index efdd813..b89f9b6 100755 --- a/lib/zip/output_stream.rb +++ b/lib/zip/output_stream.rb @@ -84,7 +84,7 @@ module Zip # Closes the current entry and opens a new for writing. # +entry+ can be a ZipEntry object or a string. - def put_next_entry(entryname, comment = nil, extra = nil, compression_method = Entry::DEFLATED, level = Zlib::DEFAULT_COMPRESSION) + def put_next_entry(entryname, comment = nil, extra = nil, compression_method = Entry::DEFLATED, level = Zip.default_compression) raise ZipError, "zip stream is closed" if @closed if entryname.kind_of?(Entry) new_entry = entryname @@ -129,7 +129,7 @@ module Zip @compressor = NullCompressor.instance end - def init_next_entry(entry, level = Zlib::DEFAULT_COMPRESSION) + def init_next_entry(entry, level = Zip.default_compression) finalize_current_entry @entry_set << entry entry.write_local_entry(@output_stream) diff --git a/test/ziptest.rb b/test/ziptest.rb index 3e36a10..99af5ed 100755 --- a/test/ziptest.rb +++ b/test/ziptest.rb @@ -669,6 +669,25 @@ class DeflaterTest < Test::Unit::TestCase assert_equal(txt, inflatedTxt) end + def test_default_compression + txt = load_file("data/file2.txt") + + Zip.default_compression = ::Zlib::BEST_COMPRESSION + deflate(txt, "compressiontest_best_compression.bin") + Zip.default_compression = ::Zlib::DEFAULT_COMPRESSION + deflate(txt, "compressiontest_default_compression.bin") + Zip.default_compression = ::Zlib::NO_COMPRESSION + deflate(txt, "compressiontest_no_compression.bin") + + best = File.size("compressiontest_best_compression.bin") + default = File.size("compressiontest_default_compression.bin") + no = File.size("compressiontest_no_compression.bin") + + assert(best < default) + assert(best < no) + assert(default < no) + end + private def load_file(fileName) txt = nil