omnizip 0.3.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 +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +754 -0
- data/COPYING +502 -0
- data/Gemfile +17 -0
- data/LICENSE +12 -0
- data/README.adoc +1045 -0
- data/Rakefile +12 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +91 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +271 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +185 -0
- data/docs/getting-started/your-first-archive.adoc +218 -0
- data/docs/guides/advanced-features/encryption.adoc +300 -0
- data/docs/guides/advanced-features/index.adoc +49 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
- data/docs/guides/advanced-features/streaming.adoc +212 -0
- data/docs/guides/archive-formats/gzip-format.adoc +107 -0
- data/docs/guides/archive-formats/index.adoc +130 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
- data/docs/guides/compression-algorithms/deflate.adoc +319 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +398 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
- data/docs/guides/creating-archives.adoc +354 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +218 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +188 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/troubleshooting/index.adoc +208 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +130 -0
- data/lib/omnizip/algorithm_registry.rb +86 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
- data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
- data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
- data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
- data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
- data/lib/omnizip/algorithms/bzip2.rb +130 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
- data/lib/omnizip/algorithms/deflate.rb +128 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
- data/lib/omnizip/algorithms/deflate64.rb +109 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
- data/lib/omnizip/algorithms/lzma.rb +238 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +141 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +116 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +82 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
- data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
- data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
- data/lib/omnizip/algorithms/zstandard.rb +138 -0
- data/lib/omnizip/buffer/memory_archive.rb +251 -0
- data/lib/omnizip/buffer/memory_extractor.rb +224 -0
- data/lib/omnizip/buffer.rb +176 -0
- data/lib/omnizip/checksum_registry.rb +114 -0
- data/lib/omnizip/checksums/crc32.rb +100 -0
- data/lib/omnizip/checksums/crc64.rb +101 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/verifier.rb +131 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +120 -0
- data/lib/omnizip/chunked.rb +129 -0
- data/lib/omnizip/cli/output_formatter.rb +104 -0
- data/lib/omnizip/cli.rb +572 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +427 -0
- data/lib/omnizip/commands/archive_extract_command.rb +272 -0
- data/lib/omnizip/commands/archive_list_command.rb +218 -0
- data/lib/omnizip/commands/archive_repair_command.rb +131 -0
- data/lib/omnizip/commands/archive_verify_command.rb +117 -0
- data/lib/omnizip/commands/compress_command.rb +117 -0
- data/lib/omnizip/commands/decompress_command.rb +120 -0
- data/lib/omnizip/commands/list_command.rb +53 -0
- data/lib/omnizip/commands/metadata_command.rb +153 -0
- data/lib/omnizip/commands/parity_create_command.rb +122 -0
- data/lib/omnizip/commands/parity_repair_command.rb +122 -0
- data/lib/omnizip/commands/parity_verify_command.rb +124 -0
- data/lib/omnizip/commands/profile_list_command.rb +56 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/convenience.rb +359 -0
- data/lib/omnizip/converter/conversion_registry.rb +49 -0
- data/lib/omnizip/converter/conversion_strategy.rb +121 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
- data/lib/omnizip/converter.rb +105 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/error.rb +106 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +63 -0
- data/lib/omnizip/extraction/filter_chain.rb +177 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +240 -0
- data/lib/omnizip/extraction.rb +111 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +113 -0
- data/lib/omnizip/filter.rb +139 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +166 -0
- data/lib/omnizip/filters/bcj.rb +279 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
- data/lib/omnizip/filters/bcj2.rb +99 -0
- data/lib/omnizip/filters/bcj_arm.rb +176 -0
- data/lib/omnizip/filters/bcj_arm64.rb +244 -0
- data/lib/omnizip/filters/bcj_ia64.rb +196 -0
- data/lib/omnizip/filters/bcj_ppc.rb +190 -0
- data/lib/omnizip/filters/bcj_sparc.rb +176 -0
- data/lib/omnizip/filters/bcj_x86.rb +193 -0
- data/lib/omnizip/filters/delta.rb +196 -0
- data/lib/omnizip/filters/filter_base.rb +72 -0
- data/lib/omnizip/filters/registry.rb +123 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/format_detector.rb +162 -0
- data/lib/omnizip/format_registry.rb +59 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +172 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +385 -0
- data/lib/omnizip/formats/cpio/reader.rb +196 -0
- data/lib/omnizip/formats/cpio/writer.rb +234 -0
- data/lib/omnizip/formats/cpio.rb +140 -0
- data/lib/omnizip/formats/format_spec_loader.rb +230 -0
- data/lib/omnizip/formats/gzip.rb +238 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
- data/lib/omnizip/formats/iso/directory_record.rb +152 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +197 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +530 -0
- data/lib/omnizip/formats/iso.rb +140 -0
- data/lib/omnizip/formats/lzip.rb +175 -0
- data/lib/omnizip/formats/lzma_alone.rb +171 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
- data/lib/omnizip/formats/rar/block_parser.rb +243 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +82 -0
- data/lib/omnizip/formats/rar/decompressor.rb +238 -0
- data/lib/omnizip/formats/rar/external_writer.rb +312 -0
- data/lib/omnizip/formats/rar/header.rb +192 -0
- data/lib/omnizip/formats/rar/license_validator.rb +109 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
- data/lib/omnizip/formats/rar/reader.rb +366 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
- data/lib/omnizip/formats/rar/writer.rb +431 -0
- data/lib/omnizip/formats/rar.rb +205 -0
- data/lib/omnizip/formats/rar3/compressor.rb +73 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar3/reader.rb +386 -0
- data/lib/omnizip/formats/rar3/writer.rb +219 -0
- data/lib/omnizip/formats/rar5/compressor.rb +73 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
- data/lib/omnizip/formats/rar5/reader.rb +342 -0
- data/lib/omnizip/formats/rar5/writer.rb +214 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
- data/lib/omnizip/formats/seven_zip/header.rb +106 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
- data/lib/omnizip/formats/seven_zip.rb +93 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +94 -0
- data/lib/omnizip/formats/tar/header.rb +168 -0
- data/lib/omnizip/formats/tar/reader.rb +121 -0
- data/lib/omnizip/formats/tar/writer.rb +216 -0
- data/lib/omnizip/formats/tar.rb +84 -0
- data/lib/omnizip/formats/xz/reader.rb +116 -0
- data/lib/omnizip/formats/xz.rb +237 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
- data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
- data/lib/omnizip/formats/zip/reader.rb +250 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +375 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
- data/lib/omnizip/io/buffered_input.rb +146 -0
- data/lib/omnizip/io/buffered_output.rb +105 -0
- data/lib/omnizip/io/stream_manager.rb +115 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +124 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +146 -0
- data/lib/omnizip/metadata/metadata_editor.rb +171 -0
- data/lib/omnizip/metadata/metadata_registry.rb +64 -0
- data/lib/omnizip/metadata/metadata_validator.rb +99 -0
- data/lib/omnizip/metadata.rb +57 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +73 -0
- data/lib/omnizip/models/compression_options.rb +71 -0
- data/lib/omnizip/models/conversion_options.rb +87 -0
- data/lib/omnizip/models/conversion_result.rb +135 -0
- data/lib/omnizip/models/eta_result.rb +46 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +144 -0
- data/lib/omnizip/models/filter_config.rb +183 -0
- data/lib/omnizip/models/match_result.rb +124 -0
- data/lib/omnizip/models/optimization_suggestion.rb +91 -0
- data/lib/omnizip/models/parallel_options.rb +104 -0
- data/lib/omnizip/models/performance_result.rb +79 -0
- data/lib/omnizip/models/profile_report.rb +82 -0
- data/lib/omnizip/models/progress_options.rb +38 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +81 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +203 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
- data/lib/omnizip/parallel/worker_pool.rb +223 -0
- data/lib/omnizip/parallel.rb +149 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +73 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
- data/lib/omnizip/parity/models/main_packet.rb +128 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +109 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
- data/lib/omnizip/parity/par2_creator.rb +531 -0
- data/lib/omnizip/parity/par2_repairer.rb +407 -0
- data/lib/omnizip/parity/par2_verifier.rb +364 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
- data/lib/omnizip/parity.rb +186 -0
- data/lib/omnizip/password/encryption_registry.rb +65 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
- data/lib/omnizip/password.rb +87 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
- data/lib/omnizip/pipe.rb +121 -0
- data/lib/omnizip/platform/ntfs_streams.rb +201 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +39 -0
- data/lib/omnizip/profile/balanced_profile.rb +33 -0
- data/lib/omnizip/profile/binary_profile.rb +36 -0
- data/lib/omnizip/profile/compression_profile.rb +158 -0
- data/lib/omnizip/profile/custom_profile.rb +157 -0
- data/lib/omnizip/profile/fast_profile.rb +33 -0
- data/lib/omnizip/profile/maximum_profile.rb +33 -0
- data/lib/omnizip/profile/profile_detector.rb +110 -0
- data/lib/omnizip/profile/profile_registry.rb +161 -0
- data/lib/omnizip/profile/text_profile.rb +36 -0
- data/lib/omnizip/profile.rb +190 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +169 -0
- data/lib/omnizip/profiler.rb +204 -0
- data/lib/omnizip/progress/callback_reporter.rb +36 -0
- data/lib/omnizip/progress/console_reporter.rb +62 -0
- data/lib/omnizip/progress/log_reporter.rb +91 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +190 -0
- data/lib/omnizip/progress/silent_reporter.rb +24 -0
- data/lib/omnizip/progress.rb +127 -0
- data/lib/omnizip/rubyzip_compat.rb +63 -0
- data/lib/omnizip/temp/safe_extract.rb +168 -0
- data/lib/omnizip/temp/temp_file.rb +124 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +181 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +156 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +273 -0
- data/lib/omnizip/zip/output_stream.rb +324 -0
- data/lib/omnizip.rb +156 -0
- data/readme-docs/advanced-features.adoc +515 -0
- data/readme-docs/api-usage.adoc +444 -0
- data/readme-docs/architecture.adoc +449 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +442 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +325 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- metadata +617 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
= Library API Usage
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Purpose
|
|
6
|
+
|
|
7
|
+
This document provides comprehensive API documentation for using Omnizip programmatically in Ruby applications. It covers both file-based and stream-based compression operations using the algorithm registry system.
|
|
8
|
+
|
|
9
|
+
== General
|
|
10
|
+
|
|
11
|
+
The library provides a programmatic API for integrating compression into Ruby applications. The API supports both file-based and stream-based compression operations.
|
|
12
|
+
|
|
13
|
+
All compression operations use the algorithm registry to locate and instantiate the appropriate algorithm implementation. This design allows for consistent behavior whether using the CLI or the library API.
|
|
14
|
+
|
|
15
|
+
[[lzma-compression]]
|
|
16
|
+
== LZMA Compression
|
|
17
|
+
|
|
18
|
+
=== General
|
|
19
|
+
|
|
20
|
+
LZMA (Lempel-Ziv-Markov chain Algorithm) is a lossless data compression algorithm that achieves high compression ratios through dictionary-based compression combined with range coding. The implementation uses adaptive probability models that adjust based on the input data.
|
|
21
|
+
|
|
22
|
+
The LZMA algorithm operates in three main stages:
|
|
23
|
+
|
|
24
|
+
. Dictionary-based compression using LZ77 match finding
|
|
25
|
+
. Range encoding with adaptive bit models
|
|
26
|
+
. State machine for context tracking
|
|
27
|
+
|
|
28
|
+
=== Compressing data
|
|
29
|
+
|
|
30
|
+
Basic file compression using LZMA:
|
|
31
|
+
|
|
32
|
+
Syntax:
|
|
33
|
+
|
|
34
|
+
[source,ruby]
|
|
35
|
+
----
|
|
36
|
+
algorithm_class = Omnizip::AlgorithmRegistry.get({algorithm}) <1>
|
|
37
|
+
algorithm = algorithm_class.new({options}) <2>
|
|
38
|
+
algorithm.compress({input}, {output}) <3>
|
|
39
|
+
----
|
|
40
|
+
<1> Retrieve the algorithm class from the registry
|
|
41
|
+
<2> Create an algorithm instance with compression options
|
|
42
|
+
<3> Perform the compression operation
|
|
43
|
+
|
|
44
|
+
Where,
|
|
45
|
+
|
|
46
|
+
`algorithm`:: The algorithm name as a symbol (e.g., `:lzma`)
|
|
47
|
+
`options`:: A hash of compression options (e.g., `level: 7`)
|
|
48
|
+
`input`:: An IO object or file handle for reading input data
|
|
49
|
+
`output`:: An IO object or file handle for writing compressed data
|
|
50
|
+
|
|
51
|
+
.Compressing a file with LZMA
|
|
52
|
+
[example]
|
|
53
|
+
====
|
|
54
|
+
[source,ruby]
|
|
55
|
+
----
|
|
56
|
+
require 'omnizip'
|
|
57
|
+
|
|
58
|
+
# Get the LZMA algorithm
|
|
59
|
+
algorithm_class = Omnizip::AlgorithmRegistry.get(:lzma)
|
|
60
|
+
|
|
61
|
+
# Create an algorithm instance with compression level 7
|
|
62
|
+
algorithm = algorithm_class.new(level: 7)
|
|
63
|
+
|
|
64
|
+
# Compress a file
|
|
65
|
+
File.open('input.txt', 'rb') do |input|
|
|
66
|
+
File.open('output.lzma', 'wb') do |output|
|
|
67
|
+
algorithm.compress(input, output)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
----
|
|
71
|
+
|
|
72
|
+
This example compresses `input.txt` using LZMA with compression level 7 and writes the result to `output.lzma`.
|
|
73
|
+
====
|
|
74
|
+
|
|
75
|
+
=== Decompressing data
|
|
76
|
+
|
|
77
|
+
Basic file decompression using LZMA:
|
|
78
|
+
|
|
79
|
+
Syntax:
|
|
80
|
+
|
|
81
|
+
[source,ruby]
|
|
82
|
+
----
|
|
83
|
+
algorithm_class = Omnizip::AlgorithmRegistry.get({algorithm}) <1>
|
|
84
|
+
algorithm = algorithm_class.new <2>
|
|
85
|
+
algorithm.decompress({input}, {output}) <3>
|
|
86
|
+
----
|
|
87
|
+
<1> Retrieve the algorithm class from the registry
|
|
88
|
+
<2> Create an algorithm instance (no options needed for decompression)
|
|
89
|
+
<3> Perform the decompression operation
|
|
90
|
+
|
|
91
|
+
Where,
|
|
92
|
+
|
|
93
|
+
`algorithm`:: The algorithm name as a symbol (e.g., `:lzma`)
|
|
94
|
+
`input`:: An IO object or file handle containing compressed data
|
|
95
|
+
`output`:: An IO object or file handle for writing decompressed data
|
|
96
|
+
|
|
97
|
+
.Decompressing a file with LZMA
|
|
98
|
+
[example]
|
|
99
|
+
====
|
|
100
|
+
[source,ruby]
|
|
101
|
+
----
|
|
102
|
+
require 'omnizip'
|
|
103
|
+
|
|
104
|
+
# Get the LZMA algorithm
|
|
105
|
+
algorithm_class = Omnizip::AlgorithmRegistry.get(:lzma)
|
|
106
|
+
algorithm = algorithm_class.new
|
|
107
|
+
|
|
108
|
+
# Decompress a file
|
|
109
|
+
File.open('output.lzma', 'rb') do |input|
|
|
110
|
+
File.open('restored.txt', 'wb') do |output|
|
|
111
|
+
algorithm.decompress(input, output)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
----
|
|
115
|
+
|
|
116
|
+
This example decompresses `output.lzma` and writes the result to `restored.txt`.
|
|
117
|
+
====
|
|
118
|
+
|
|
119
|
+
=== Stream-based compression
|
|
120
|
+
|
|
121
|
+
Compressing data from any IO-like object:
|
|
122
|
+
|
|
123
|
+
Syntax:
|
|
124
|
+
|
|
125
|
+
[source,ruby]
|
|
126
|
+
----
|
|
127
|
+
algorithm.compress({input_stream}, {output_stream}, {options}) <1>
|
|
128
|
+
----
|
|
129
|
+
<1> Compress from any IO object (File, StringIO, etc.)
|
|
130
|
+
|
|
131
|
+
Where,
|
|
132
|
+
|
|
133
|
+
`input_stream`:: Any object responding to `read` (IO, StringIO, etc.)
|
|
134
|
+
`output_stream`:: Any object responding to `write` (IO, StringIO, etc.)
|
|
135
|
+
`options`:: Optional compression options (can be nil for defaults)
|
|
136
|
+
|
|
137
|
+
.Using StringIO for in-memory compression
|
|
138
|
+
[example]
|
|
139
|
+
====
|
|
140
|
+
[source,ruby]
|
|
141
|
+
----
|
|
142
|
+
require 'omnizip'
|
|
143
|
+
require 'stringio'
|
|
144
|
+
|
|
145
|
+
# Get the LZMA algorithm
|
|
146
|
+
algorithm_class = Omnizip::AlgorithmRegistry.get(:lzma)
|
|
147
|
+
algorithm = algorithm_class.new(level: 5)
|
|
148
|
+
|
|
149
|
+
# Compress in-memory data
|
|
150
|
+
input_data = "Hello, World!" * 1000
|
|
151
|
+
input = StringIO.new(input_data)
|
|
152
|
+
output = StringIO.new
|
|
153
|
+
|
|
154
|
+
algorithm.compress(input, output)
|
|
155
|
+
|
|
156
|
+
compressed_data = output.string
|
|
157
|
+
puts "Original size: #{input_data.bytesize} bytes"
|
|
158
|
+
puts "Compressed size: #{compressed_data.bytesize} bytes"
|
|
159
|
+
puts "Compression ratio: #{100 - (compressed_data.bytesize * 100.0 / input_data.bytesize).round(1)}%"
|
|
160
|
+
----
|
|
161
|
+
|
|
162
|
+
This example demonstrates in-memory compression using StringIO objects instead of files.
|
|
163
|
+
====
|
|
164
|
+
|
|
165
|
+
[[compression-levels]]
|
|
166
|
+
=== Compression levels
|
|
167
|
+
|
|
168
|
+
LZMA supports compression levels from 1 to 9, where higher levels provide better compression at the cost of increased processing time and memory usage.
|
|
169
|
+
|
|
170
|
+
Syntax:
|
|
171
|
+
|
|
172
|
+
[source,ruby]
|
|
173
|
+
----
|
|
174
|
+
algorithm = algorithm_class.new(level: {level}) <1>
|
|
175
|
+
----
|
|
176
|
+
<1> Specify the compression level (1-9)
|
|
177
|
+
|
|
178
|
+
Where,
|
|
179
|
+
|
|
180
|
+
`level`:: Compression level from 1 to 9
|
|
181
|
+
+
|
|
182
|
+
* Level 1: Fastest compression, lower ratio (64KB dictionary)
|
|
183
|
+
* Level 2-3: Fast compression (1MB dictionary)
|
|
184
|
+
* Level 4-5: Balanced compression and speed (4MB dictionary) - *Default: 5*
|
|
185
|
+
* Level 6-7: Higher compression (8MB dictionary)
|
|
186
|
+
* Level 8-9: Maximum compression, slower (16MB dictionary)
|
|
187
|
+
|
|
188
|
+
.Comparing compression levels
|
|
189
|
+
[example]
|
|
190
|
+
====
|
|
191
|
+
[source,ruby]
|
|
192
|
+
----
|
|
193
|
+
require 'omnizip'
|
|
194
|
+
|
|
195
|
+
# Test different compression levels
|
|
196
|
+
[1, 5, 9].each do |level|
|
|
197
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:lzma).new(level: level)
|
|
198
|
+
|
|
199
|
+
File.open('input.txt', 'rb') do |input|
|
|
200
|
+
File.open("output-level#{level}.lzma", 'wb') do |output|
|
|
201
|
+
start_time = Time.now
|
|
202
|
+
algorithm.compress(input, output)
|
|
203
|
+
elapsed = Time.now - start_time
|
|
204
|
+
|
|
205
|
+
size = File.size("output-level#{level}.lzma")
|
|
206
|
+
puts "Level #{level}: #{size} bytes, #{elapsed.round(2)}s"
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
----
|
|
211
|
+
|
|
212
|
+
This example compresses the same file with three different compression levels and compares the resulting file sizes and processing times.
|
|
213
|
+
|
|
214
|
+
* Level 1 provides fast compression but larger output
|
|
215
|
+
* Level 5 (default) provides balanced performance
|
|
216
|
+
* Level 9 provides maximum compression but takes longer
|
|
217
|
+
====
|
|
218
|
+
|
|
219
|
+
[[bzip2-compression]]
|
|
220
|
+
== BZip2 Compression
|
|
221
|
+
|
|
222
|
+
BZip2 uses the Burrows-Wheeler Transform (BWT) for block-sorting compression, achieving good compression ratios with moderate speed.
|
|
223
|
+
|
|
224
|
+
[source,ruby]
|
|
225
|
+
----
|
|
226
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:bzip2).new(level: 9)
|
|
227
|
+
File.open('input.txt', 'rb') do |input|
|
|
228
|
+
File.open('output.bz2', 'wb') do |output|
|
|
229
|
+
algorithm.compress(input, output)
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
----
|
|
233
|
+
|
|
234
|
+
[[ppmd-compression]]
|
|
235
|
+
== PPMd Compression
|
|
236
|
+
|
|
237
|
+
PPMd (Prediction by Partial Matching) excels at text compression using statistical modeling. PPMd7 and PPMd8 variants are supported.
|
|
238
|
+
|
|
239
|
+
[source,ruby]
|
|
240
|
+
----
|
|
241
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:ppmd7).new(
|
|
242
|
+
mem_size: 24, # 2^24 bytes = 16MB
|
|
243
|
+
order: 6 # Context order
|
|
244
|
+
)
|
|
245
|
+
algorithm.compress(input, output)
|
|
246
|
+
----
|
|
247
|
+
|
|
248
|
+
[[deflate-compression]]
|
|
249
|
+
== Deflate Compression
|
|
250
|
+
|
|
251
|
+
Deflate provides ZIP-compatible compression using the native Zlib library.
|
|
252
|
+
|
|
253
|
+
[source,ruby]
|
|
254
|
+
----
|
|
255
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:deflate).new(level: 6)
|
|
256
|
+
algorithm.compress(input, output)
|
|
257
|
+
----
|
|
258
|
+
|
|
259
|
+
[[deflate64-compression]]
|
|
260
|
+
== Deflate64 Compression
|
|
261
|
+
|
|
262
|
+
=== General
|
|
263
|
+
|
|
264
|
+
Deflate64 (Enhanced Deflate) extends standard Deflate with a 64KB sliding window (versus 32KB in standard Deflate), providing better compression ratios for larger files while maintaining ZIP format compatibility as compression method 9.
|
|
265
|
+
|
|
266
|
+
The algorithm operates in three stages:
|
|
267
|
+
|
|
268
|
+
. LZ77 match finding with 64KB dictionary
|
|
269
|
+
. Huffman coding with dynamic trees
|
|
270
|
+
. Bitstream encoding
|
|
271
|
+
|
|
272
|
+
=== Compressing with Deflate64
|
|
273
|
+
|
|
274
|
+
Syntax:
|
|
275
|
+
|
|
276
|
+
[source,ruby]
|
|
277
|
+
----
|
|
278
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:deflate64).new({options}) <1>
|
|
279
|
+
algorithm.compress({input}, {output}) <2>
|
|
280
|
+
----
|
|
281
|
+
<1> Create Deflate64 instance with optional compression level
|
|
282
|
+
<2> Perform compression operation
|
|
283
|
+
|
|
284
|
+
Where,
|
|
285
|
+
|
|
286
|
+
`options`:: Optional hash containing:
|
|
287
|
+
+
|
|
288
|
+
* `level`: Compression level (1-9, default: 6)
|
|
289
|
+
* `window_size`: Dictionary size (default: 65536 bytes)
|
|
290
|
+
|
|
291
|
+
`input`:: IO object or stream with data to compress
|
|
292
|
+
`output`:: IO object or stream for compressed output
|
|
293
|
+
|
|
294
|
+
.Compressing a file with Deflate64
|
|
295
|
+
[example]
|
|
296
|
+
====
|
|
297
|
+
[source,ruby]
|
|
298
|
+
----
|
|
299
|
+
require 'omnizip'
|
|
300
|
+
|
|
301
|
+
# Get Deflate64 algorithm
|
|
302
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:deflate64).new(level: 7)
|
|
303
|
+
|
|
304
|
+
# Compress file
|
|
305
|
+
File.open('large_file.txt', 'rb') do |input|
|
|
306
|
+
File.open('output.deflate64', 'wb') do |output|
|
|
307
|
+
algorithm.compress(input, output)
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
----
|
|
311
|
+
|
|
312
|
+
This example demonstrates compressing a large file using Deflate64. The 64KB window provides better compression for files larger than 32KB compared to standard Deflate.
|
|
313
|
+
====
|
|
314
|
+
|
|
315
|
+
=== Decompressing Deflate64
|
|
316
|
+
|
|
317
|
+
.Decompressing a Deflate64 file
|
|
318
|
+
[example]
|
|
319
|
+
====
|
|
320
|
+
[source,ruby]
|
|
321
|
+
----
|
|
322
|
+
require 'omnizip'
|
|
323
|
+
|
|
324
|
+
# Get Deflate64 algorithm
|
|
325
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:deflate64).new
|
|
326
|
+
|
|
327
|
+
# Decompress file
|
|
328
|
+
File.open('output.deflate64', 'rb') do |input|
|
|
329
|
+
File.open('restored.txt', 'wb') do |output|
|
|
330
|
+
algorithm.decompress(input, output)
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
----
|
|
334
|
+
====
|
|
335
|
+
|
|
336
|
+
[[zstandard-compression]]
|
|
337
|
+
== Zstandard Compression
|
|
338
|
+
|
|
339
|
+
Zstandard offers fast compression with good ratios, using the native library.
|
|
340
|
+
|
|
341
|
+
[source,ruby]
|
|
342
|
+
----
|
|
343
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:zstd).new(level: 3)
|
|
344
|
+
algorithm.compress(input, output)
|
|
345
|
+
----
|
|
346
|
+
|
|
347
|
+
[[bcj-filters]]
|
|
348
|
+
== BCJ Filters
|
|
349
|
+
|
|
350
|
+
Branch-Call-Jump filters improve compression of executable files by converting relative addresses to absolute addresses.
|
|
351
|
+
|
|
352
|
+
[source,ruby]
|
|
353
|
+
----
|
|
354
|
+
# Use with filter pipeline
|
|
355
|
+
pipeline = Omnizip::FilterPipeline.new
|
|
356
|
+
pipeline.add_filter(:bcj_x86) # For x86 executables
|
|
357
|
+
|
|
358
|
+
# Apply before compression
|
|
359
|
+
filtered_data = pipeline.encode(executable_data)
|
|
360
|
+
algorithm.compress(StringIO.new(filtered_data), output)
|
|
361
|
+
----
|
|
362
|
+
|
|
363
|
+
Supported architectures: `:bcj_x86`, `:bcj_arm`, `:bcj_arm64`, `:bcj_ppc`, `:bcj_sparc`, `:bcj_ia64`
|
|
364
|
+
|
|
365
|
+
[[bcj2-filter]]
|
|
366
|
+
== BCJ2 Filter
|
|
367
|
+
|
|
368
|
+
BCJ2 provides advanced 4-stream filtering for x86 code, achieving better compression than standard BCJ.
|
|
369
|
+
|
|
370
|
+
[source,ruby]
|
|
371
|
+
----
|
|
372
|
+
filter = Omnizip::FilterRegistry.get(:bcj2).new
|
|
373
|
+
encoded_streams = filter.encode(x86_code)
|
|
374
|
+
# Returns 4 separate streams for optimal compression
|
|
375
|
+
----
|
|
376
|
+
|
|
377
|
+
[[delta-filter]]
|
|
378
|
+
== Delta Filter
|
|
379
|
+
|
|
380
|
+
Delta encoding is effective for multimedia files and time-series data.
|
|
381
|
+
|
|
382
|
+
[source,ruby]
|
|
383
|
+
----
|
|
384
|
+
filter = Omnizip::FilterRegistry.get(:delta).new(distance: 1)
|
|
385
|
+
filtered = filter.encode(audio_data)
|
|
386
|
+
----
|
|
387
|
+
|
|
388
|
+
[[aes-encryption]]
|
|
389
|
+
== AES-256 Encryption
|
|
390
|
+
|
|
391
|
+
Password-protected archives use AES-256-CBC encryption with SHA-256 key derivation.
|
|
392
|
+
|
|
393
|
+
[source,ruby]
|
|
394
|
+
----
|
|
395
|
+
# Encryption is handled automatically in .7z archives
|
|
396
|
+
writer = Omnizip::Formats::SevenZip::Writer.new(
|
|
397
|
+
output_file,
|
|
398
|
+
password: "secret_password"
|
|
399
|
+
)
|
|
400
|
+
----
|
|
401
|
+
|
|
402
|
+
[[checksums]]
|
|
403
|
+
== Checksums
|
|
404
|
+
|
|
405
|
+
CRC32 and CRC64 checksums ensure data integrity.
|
|
406
|
+
|
|
407
|
+
[source,ruby]
|
|
408
|
+
----
|
|
409
|
+
crc32 = Omnizip::ChecksumRegistry.get(:crc32).calculate(data)
|
|
410
|
+
crc64 = Omnizip::ChecksumRegistry.get(:crc64).calculate(data)
|
|
411
|
+
----
|
|
412
|
+
|
|
413
|
+
[[seven-zip-format]]
|
|
414
|
+
== .7z Archive Format
|
|
415
|
+
|
|
416
|
+
Full support for creating and extracting .7z archives.
|
|
417
|
+
|
|
418
|
+
[source,ruby]
|
|
419
|
+
----
|
|
420
|
+
# Create archive
|
|
421
|
+
writer = Omnizip::Formats::SevenZip::Writer.new('archive.7z')
|
|
422
|
+
writer.add_file('input.txt')
|
|
423
|
+
writer.add_file('data.bin')
|
|
424
|
+
writer.close
|
|
425
|
+
|
|
426
|
+
# Extract archive
|
|
427
|
+
reader = Omnizip::Formats::SevenZip::Reader.new('archive.7z')
|
|
428
|
+
reader.extract_all('output_dir/')
|
|
429
|
+
reader.close
|
|
430
|
+
|
|
431
|
+
# List contents
|
|
432
|
+
reader = Omnizip::Formats::SevenZip::Reader.new('archive.7z')
|
|
433
|
+
reader.entries.each do |entry|
|
|
434
|
+
puts "#{entry.name}: #{entry.size} bytes"
|
|
435
|
+
end
|
|
436
|
+
----
|
|
437
|
+
|
|
438
|
+
== See Also
|
|
439
|
+
|
|
440
|
+
* link:cli-usage.adoc[CLI Usage Guide]
|
|
441
|
+
* link:compression-algorithms.adoc[Compression Algorithms]
|
|
442
|
+
* link:preprocessing-filters.adoc[Preprocessing Filters]
|
|
443
|
+
* link:encryption-checksums.adoc[Encryption & Checksums]
|
|
444
|
+
* link:../README.adoc[Main README]
|