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,361 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Zstandard
|
|
3
|
+
nav_order: 8
|
|
4
|
+
parent: Compression Algorithms
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
Zstandard (zstd) is a modern, fast compression algorithm developed by Facebook that offers an excellent balance between compression ratio and speed. It significantly outperforms Deflate in both speed and compression ratio.
|
|
11
|
+
|
|
12
|
+
== Key Characteristics
|
|
13
|
+
|
|
14
|
+
[cols="1,3"]
|
|
15
|
+
|===
|
|
16
|
+
|Property |Value
|
|
17
|
+
|
|
18
|
+
|Compression Ratio
|
|
19
|
+
|Very good (better than Deflate)
|
|
20
|
+
|
|
21
|
+
|Compression Speed
|
|
22
|
+
|Very fast (3-4x faster than Deflate)
|
|
23
|
+
|
|
24
|
+
|Decompression Speed
|
|
25
|
+
|Extremely fast (4-5x faster than Deflate)
|
|
26
|
+
|
|
27
|
+
|Memory Usage
|
|
28
|
+
|Low to medium
|
|
29
|
+
|
|
30
|
+
|Best For
|
|
31
|
+
|Real-time compression, high-throughput applications, modern systems
|
|
32
|
+
|===
|
|
33
|
+
|
|
34
|
+
== When to Use Zstandard
|
|
35
|
+
|
|
36
|
+
**Choose Zstandard when**:
|
|
37
|
+
|
|
38
|
+
* Need fast compression with good ratios
|
|
39
|
+
* Real-time compression requirements
|
|
40
|
+
* High throughput is critical
|
|
41
|
+
* Working with modern systems and tools
|
|
42
|
+
* Want better performance than Deflate without LZMA's slowness
|
|
43
|
+
|
|
44
|
+
**Consider alternatives when**:
|
|
45
|
+
|
|
46
|
+
* Maximum compatibility is required (use Deflate)
|
|
47
|
+
* Best compression ratio needed (use LZMA2)
|
|
48
|
+
* Working with legacy systems
|
|
49
|
+
|
|
50
|
+
== Basic Usage
|
|
51
|
+
|
|
52
|
+
=== Create Zstandard Archive
|
|
53
|
+
|
|
54
|
+
[source,ruby]
|
|
55
|
+
----
|
|
56
|
+
# Create with Zstandard compression
|
|
57
|
+
Omnizip::Archive.create('fast-backup.7z', format: :seven_zip) do |archive|
|
|
58
|
+
archive.compression = :zstandard
|
|
59
|
+
archive.level = 3 # Default level
|
|
60
|
+
archive.add_directory('data/')
|
|
61
|
+
end
|
|
62
|
+
----
|
|
63
|
+
|
|
64
|
+
=== Quick Compression
|
|
65
|
+
|
|
66
|
+
[source,ruby]
|
|
67
|
+
----
|
|
68
|
+
# Fast compression for temporary archives
|
|
69
|
+
Omnizip.compress_file(
|
|
70
|
+
'logfile.log',
|
|
71
|
+
'logs.7z',
|
|
72
|
+
compression: :zstandard,
|
|
73
|
+
level: 1 # Fastest compression
|
|
74
|
+
)
|
|
75
|
+
----
|
|
76
|
+
|
|
77
|
+
== Compression Levels
|
|
78
|
+
|
|
79
|
+
Zstandard offers levels 1-22 with fine-grained control:
|
|
80
|
+
|
|
81
|
+
[cols="1,2,2,2"]
|
|
82
|
+
|===
|
|
83
|
+
|Level Range |Speed |Ratio |Typical Use
|
|
84
|
+
|
|
85
|
+
|1-3
|
|
86
|
+
|Very Fast
|
|
87
|
+
|Good
|
|
88
|
+
|Real-time, temporary files
|
|
89
|
+
|
|
90
|
+
|3-7
|
|
91
|
+
|Fast
|
|
92
|
+
|Very Good
|
|
93
|
+
|**Default** - general use
|
|
94
|
+
|
|
95
|
+
|8-15
|
|
96
|
+
|Medium
|
|
97
|
+
|Excellent
|
|
98
|
+
|Distribution, important data
|
|
99
|
+
|
|
100
|
+
|16-22
|
|
101
|
+
|Slow
|
|
102
|
+
|Excellent+
|
|
103
|
+
|Archival (approaches LZMA)
|
|
104
|
+
|===
|
|
105
|
+
|
|
106
|
+
.Level Performance Example
|
|
107
|
+
[source,ruby]
|
|
108
|
+
----
|
|
109
|
+
# Compare different Zstandard levels
|
|
110
|
+
[1, 3, 10, 19].each do |level|
|
|
111
|
+
time = Benchmark.measure do
|
|
112
|
+
Omnizip.compress_file('data.bin', "zstd-#{level}.7z",
|
|
113
|
+
compression: :zstandard,
|
|
114
|
+
level: level
|
|
115
|
+
)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
size = File.size("zstd-#{level}.7z")
|
|
119
|
+
puts "Level #{level}: #{size / 1024} KB in #{time.real.round(3)}s"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Output:
|
|
123
|
+
# Level 1: 145 KB in 0.052s (fastest)
|
|
124
|
+
# Level 3: 128 KB in 0.089s (default)
|
|
125
|
+
# Level 10: 105 KB in 0.425s (better compression)
|
|
126
|
+
# Level 19: 98 KB in 2.156s (approaching LZMA quality)
|
|
127
|
+
----
|
|
128
|
+
|
|
129
|
+
== Performance Comparison
|
|
130
|
+
|
|
131
|
+
=== Speed vs Deflate
|
|
132
|
+
|
|
133
|
+
[cols="2,1,1,1"]
|
|
134
|
+
|===
|
|
135
|
+
|Operation |Deflate |Zstandard |Improvement
|
|
136
|
+
|
|
137
|
+
|Compress 100 MB
|
|
138
|
+
|10s
|
|
139
|
+
|3s
|
|
140
|
+
|3.3x faster
|
|
141
|
+
|
|
142
|
+
|Decompress 100 MB
|
|
143
|
+
|5s
|
|
144
|
+
|1.2s
|
|
145
|
+
|4.2x faster
|
|
146
|
+
|
|
147
|
+
|Compression Ratio
|
|
148
|
+
|68%
|
|
149
|
+
|72%
|
|
150
|
+
|4% better
|
|
151
|
+
|===
|
|
152
|
+
|
|
153
|
+
=== Speed vs LZMA
|
|
154
|
+
|
|
155
|
+
[cols="2,1,1,1"]
|
|
156
|
+
|===
|
|
157
|
+
|Operation |LZMA |Zstandard |Trade-off
|
|
158
|
+
|
|
159
|
+
|Compress 100 MB
|
|
160
|
+
|60s
|
|
161
|
+
|3s
|
|
162
|
+
|20x faster, slightly worse ratio
|
|
163
|
+
|
|
164
|
+
|Decompress 100 MB
|
|
165
|
+
|8s
|
|
166
|
+
|1.2s
|
|
167
|
+
|6.7x faster
|
|
168
|
+
|
|
169
|
+
|Compression Ratio
|
|
170
|
+
|78%
|
|
171
|
+
|72%
|
|
172
|
+
|LZMA ~6% better
|
|
173
|
+
|===
|
|
174
|
+
|
|
175
|
+
== Advanced Features
|
|
176
|
+
|
|
177
|
+
=== Dictionary Training
|
|
178
|
+
|
|
179
|
+
Train custom dictionaries for specific data types:
|
|
180
|
+
|
|
181
|
+
[source,ruby]
|
|
182
|
+
----
|
|
183
|
+
# Train dictionary on sample data
|
|
184
|
+
training_data = Dir.glob('samples/*.json').map { |f| File.read(f) }
|
|
185
|
+
dictionary = Omnizip::Zstandard.train_dictionary(training_data, size: 100.kilobytes)
|
|
186
|
+
|
|
187
|
+
# Use trained dictionary for better compression
|
|
188
|
+
Omnizip.compress_file('data.json', 'output.7z',
|
|
189
|
+
compression: :zstandard,
|
|
190
|
+
level: 5,
|
|
191
|
+
dictionary: dictionary
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# Can improve compression 10-30% for similar data
|
|
195
|
+
----
|
|
196
|
+
|
|
197
|
+
=== Streaming with Zstandard
|
|
198
|
+
|
|
199
|
+
Excellent streaming performance:
|
|
200
|
+
|
|
201
|
+
[source,ruby]
|
|
202
|
+
----
|
|
203
|
+
# Stream compression for real-time data
|
|
204
|
+
Omnizip::OutputStream.open('stream.7z', format: :seven_zip) do |stream|
|
|
205
|
+
stream.compression = :zstandard
|
|
206
|
+
stream.level = 3 # Fast for real-time
|
|
207
|
+
|
|
208
|
+
# Process log entries as they arrive
|
|
209
|
+
log_stream.each do |log_entry|
|
|
210
|
+
stream.put_next_entry("log_#{log_entry.id}.txt")
|
|
211
|
+
stream.write(log_entry.content)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
----
|
|
215
|
+
|
|
216
|
+
== Use Cases
|
|
217
|
+
|
|
218
|
+
=== Log File Compression
|
|
219
|
+
|
|
220
|
+
Perfect for compressing logs quickly:
|
|
221
|
+
|
|
222
|
+
[source,ruby]
|
|
223
|
+
----
|
|
224
|
+
# Compress today's logs rapidly
|
|
225
|
+
log_files = Dir.glob('/var/log/app/*.log')
|
|
226
|
+
|
|
227
|
+
Omnizip.compress_files(
|
|
228
|
+
log_files,
|
|
229
|
+
"logs_#{Date.today}.7z",
|
|
230
|
+
compression: :zstandard,
|
|
231
|
+
level: 5 # Fast with good compression
|
|
232
|
+
) do |progress|
|
|
233
|
+
puts "Compressing logs: #{progress.percentage}%"
|
|
234
|
+
end
|
|
235
|
+
----
|
|
236
|
+
|
|
237
|
+
=== Web Application Responses
|
|
238
|
+
|
|
239
|
+
Compress API responses on-the-fly:
|
|
240
|
+
|
|
241
|
+
[source,ruby]
|
|
242
|
+
----
|
|
243
|
+
class ExportController < ApplicationController
|
|
244
|
+
def download
|
|
245
|
+
# Generate export data
|
|
246
|
+
data = generate_export_data
|
|
247
|
+
|
|
248
|
+
# Compress quickly with Zstandard
|
|
249
|
+
compressed = Omnizip::Buffer.create(:seven_zip) do |archive|
|
|
250
|
+
archive.compression = :zstandard
|
|
251
|
+
archive.level = 3 # Fast compression
|
|
252
|
+
|
|
253
|
+
data.each do |filename, content|
|
|
254
|
+
archive.add(filename, content)
|
|
255
|
+
end
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
send_data compressed.string,
|
|
259
|
+
filename: 'export.7z',
|
|
260
|
+
type: 'application/x-7z-compressed'
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
----
|
|
264
|
+
|
|
265
|
+
=== Database Dumps
|
|
266
|
+
|
|
267
|
+
Compress database backups efficiently:
|
|
268
|
+
|
|
269
|
+
[source,ruby]
|
|
270
|
+
----
|
|
271
|
+
# Stream database dump to compressed archive
|
|
272
|
+
require 'open3'
|
|
273
|
+
|
|
274
|
+
Omnizip::OutputStream.open('db-backup.7z', format: :seven_zip) do |stream|
|
|
275
|
+
stream.compression = :zstandard
|
|
276
|
+
stream.level = 7
|
|
277
|
+
stream.put_next_entry('database.sql')
|
|
278
|
+
|
|
279
|
+
# Stream pg_dump output directly
|
|
280
|
+
Open3.popen3('pg_dump mydb') do |stdin, stdout, stderr, wait_thr|
|
|
281
|
+
while chunk = stdout.read(65536)
|
|
282
|
+
stream.write(chunk)
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
----
|
|
287
|
+
|
|
288
|
+
== Memory Efficiency
|
|
289
|
+
|
|
290
|
+
Zstandard is memory efficient:
|
|
291
|
+
|
|
292
|
+
[cols="1,1,1"]
|
|
293
|
+
|===
|
|
294
|
+
|Level |Compression RAM |Decompression RAM
|
|
295
|
+
|
|
296
|
+
|1-3
|
|
297
|
+
|~1 MB
|
|
298
|
+
|<1 MB
|
|
299
|
+
|
|
300
|
+
|4-7
|
|
301
|
+
|~8 MB
|
|
302
|
+
|<1 MB
|
|
303
|
+
|
|
304
|
+
|8-15
|
|
305
|
+
|~30 MB
|
|
306
|
+
|<1 MB
|
|
307
|
+
|
|
308
|
+
|16-22
|
|
309
|
+
|~100 MB
|
|
310
|
+
|<1 MB
|
|
311
|
+
|===
|
|
312
|
+
|
|
313
|
+
*Note: Decompression always requires minimal memory*
|
|
314
|
+
|
|
315
|
+
== Best Practices
|
|
316
|
+
|
|
317
|
+
. **Use Level 3-5 for General Use**: Excellent speed/ratio balance
|
|
318
|
+
. **Level 1 for Real-Time**: When speed is critical
|
|
319
|
+
. **Level 10+ for Archival**: When time permits better compression
|
|
320
|
+
. **Train Dictionaries**: For repetitive data types (JSON, logs)
|
|
321
|
+
. **Monitor Performance**: Should achieve 50-200 MB/s compression
|
|
322
|
+
|
|
323
|
+
== Command-Line Usage
|
|
324
|
+
|
|
325
|
+
[source,bash]
|
|
326
|
+
----
|
|
327
|
+
# Create Zstandard-compressed archive
|
|
328
|
+
$ omnizip archive create backup.7z data/ \
|
|
329
|
+
--compression zstandard \
|
|
330
|
+
--level 5
|
|
331
|
+
|
|
332
|
+
# Fast compression
|
|
333
|
+
$ omnizip archive create logs.7z logs/ \
|
|
334
|
+
--compression zstandard \
|
|
335
|
+
--level 1 \
|
|
336
|
+
--verbose
|
|
337
|
+
Algorithm: Zstandard, Level: 1
|
|
338
|
+
Compression speed: 185 MB/s
|
|
339
|
+
Original: 500 MB
|
|
340
|
+
Compressed: 145 MB (71% reduction)
|
|
341
|
+
Time: 2.7s
|
|
342
|
+
----
|
|
343
|
+
|
|
344
|
+
== Technical Details
|
|
345
|
+
|
|
346
|
+
**Zstandard Features**:
|
|
347
|
+
|
|
348
|
+
* **Fast Entropy Encoding**: Finite State Entropy (FSE) for speed
|
|
349
|
+
* **Adaptive Window**: Dynamically sized based on level
|
|
350
|
+
* **Dictionary Compression**: Optional pre-trained dictionaries
|
|
351
|
+
* **Multi-Threading**: Native parallel compression support
|
|
352
|
+
* **Seekable Format**: Optional frame indexes for random access
|
|
353
|
+
|
|
354
|
+
**Implementation**: Uses zstd-ruby gem (native binding)
|
|
355
|
+
|
|
356
|
+
== See Also
|
|
357
|
+
|
|
358
|
+
* link:deflate.html[Deflate] - Traditional fast compression
|
|
359
|
+
* link:lzma2.html[LZMA2] - Better ratio, slower speed
|
|
360
|
+
* link:../advanced-features/streaming.html[Streaming] - Zstandard excels at streaming
|
|
361
|
+
* link:../performance-tuning.html[Performance Tuning] - Optimize for speed
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Creating Archives
|
|
3
|
+
nav_order: 1
|
|
4
|
+
parent: Guides
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
== Creating Archives
|
|
8
|
+
|
|
9
|
+
Step-by-step guide to creating archives with Omnizip.
|
|
10
|
+
|
|
11
|
+
== Quick Examples
|
|
12
|
+
|
|
13
|
+
=== Create ZIP Archive
|
|
14
|
+
|
|
15
|
+
[source,ruby]
|
|
16
|
+
----
|
|
17
|
+
require 'omnizip'
|
|
18
|
+
|
|
19
|
+
Omnizip::Archive.create('backup.zip') do |archive|
|
|
20
|
+
archive.add_file('document.pdf')
|
|
21
|
+
archive.add_directory('photos/')
|
|
22
|
+
end
|
|
23
|
+
----
|
|
24
|
+
|
|
25
|
+
=== Create 7z Archive
|
|
26
|
+
|
|
27
|
+
[source,ruby]
|
|
28
|
+
----
|
|
29
|
+
Omnizip::Archive.create('backup.7z', format: :seven_zip) do |archive|
|
|
30
|
+
archive.add_directory('data/')
|
|
31
|
+
end
|
|
32
|
+
----
|
|
33
|
+
|
|
34
|
+
=== Create RAR5 Archive
|
|
35
|
+
|
|
36
|
+
[source,ruby]
|
|
37
|
+
----
|
|
38
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
39
|
+
|
|
40
|
+
# STORE compression (uncompressed)
|
|
41
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar')
|
|
42
|
+
writer.add_file('document.txt')
|
|
43
|
+
writer.add_file('image.png')
|
|
44
|
+
writer.write
|
|
45
|
+
|
|
46
|
+
# LZMA compression (default level 3)
|
|
47
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
48
|
+
compression: :lzma
|
|
49
|
+
)
|
|
50
|
+
writer.add_file('large_dataset.json')
|
|
51
|
+
writer.write
|
|
52
|
+
|
|
53
|
+
# LZMA level 5 (best compression)
|
|
54
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
55
|
+
compression: :lzma,
|
|
56
|
+
level: 5
|
|
57
|
+
)
|
|
58
|
+
writer.add_directory('photos/')
|
|
59
|
+
writer.write
|
|
60
|
+
|
|
61
|
+
# Include modification time
|
|
62
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
63
|
+
include_mtime: true
|
|
64
|
+
)
|
|
65
|
+
writer.add_file('document.txt')
|
|
66
|
+
writer.write
|
|
67
|
+
|
|
68
|
+
# Include CRC32 (STORE compression only)
|
|
69
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
70
|
+
compression: :store,
|
|
71
|
+
include_crc32: true
|
|
72
|
+
)
|
|
73
|
+
writer.add_file('data.bin')
|
|
74
|
+
writer.write
|
|
75
|
+
----
|
|
76
|
+
|
|
77
|
+
IMPORTANT: RAR5 CRC32 checksums only work with STORE compression. When LZMA is used, CRC32 is automatically disabled. Use BLAKE2sp (always present) for compressed file integrity.
|
|
78
|
+
|
|
79
|
+
=== RAR5 Multi-Volume Archives (v0.5.0)
|
|
80
|
+
|
|
81
|
+
Split large archives across multiple volumes:
|
|
82
|
+
|
|
83
|
+
[source,ruby]
|
|
84
|
+
----
|
|
85
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
86
|
+
|
|
87
|
+
# Basic multi-volume with default naming (part1, part2, ...)
|
|
88
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
|
|
89
|
+
multi_volume: true,
|
|
90
|
+
volume_size: '100M' # Human-readable sizes supported
|
|
91
|
+
)
|
|
92
|
+
writer.add_directory('large_dataset/')
|
|
93
|
+
volumes = writer.write
|
|
94
|
+
# => ['backup.part1.rar', 'backup.part2.rar', ...]
|
|
95
|
+
|
|
96
|
+
# Custom volume naming patterns
|
|
97
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('data.rar',
|
|
98
|
+
multi_volume: true,
|
|
99
|
+
volume_size: '4.7GB', # CD/DVD sizes
|
|
100
|
+
volume_naming: 'numeric' # data.001.rar, data.002.rar, ...
|
|
101
|
+
)
|
|
102
|
+
writer.add_file('huge_database.sql')
|
|
103
|
+
volumes = writer.write
|
|
104
|
+
|
|
105
|
+
# Volume naming options:
|
|
106
|
+
# - 'part' (default): archive.part1.rar, archive.part2.rar
|
|
107
|
+
# - 'volume': archive.volume1.rar, archive.volume2.rar
|
|
108
|
+
# - 'numeric': archive.001.rar, archive.002.rar
|
|
109
|
+
|
|
110
|
+
# Minimum volume size: 64 KB
|
|
111
|
+
----
|
|
112
|
+
|
|
113
|
+
=== RAR5 Solid Compression (v0.5.0)
|
|
114
|
+
|
|
115
|
+
Achieve 10-30% better compression ratios for similar files:
|
|
116
|
+
|
|
117
|
+
[source,ruby]
|
|
118
|
+
----
|
|
119
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
120
|
+
|
|
121
|
+
# Enable solid compression
|
|
122
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('project.rar',
|
|
123
|
+
compression: :lzma,
|
|
124
|
+
level: 5,
|
|
125
|
+
solid: true # Shared dictionary across files
|
|
126
|
+
)
|
|
127
|
+
writer.add_directory('source_code/')
|
|
128
|
+
writer.write
|
|
129
|
+
|
|
130
|
+
# Best for:
|
|
131
|
+
# - Source code repositories
|
|
132
|
+
# - Log files
|
|
133
|
+
# - Text documents
|
|
134
|
+
# - Similar structured data
|
|
135
|
+
|
|
136
|
+
# Trade-offs:
|
|
137
|
+
# - Cannot extract individual files without decompressing entire block
|
|
138
|
+
# - Corruption may affect multiple files
|
|
139
|
+
# - Slightly longer extraction time for single files
|
|
140
|
+
----
|
|
141
|
+
|
|
142
|
+
=== RAR5 AES-256 Encryption (v0.5.0)
|
|
143
|
+
|
|
144
|
+
Password-protect archives with industry-standard encryption:
|
|
145
|
+
|
|
146
|
+
[source,ruby]
|
|
147
|
+
----
|
|
148
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
149
|
+
|
|
150
|
+
# Basic password protection
|
|
151
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('secure.rar',
|
|
152
|
+
compression: :lzma,
|
|
153
|
+
password: 'SecurePassword123!'
|
|
154
|
+
)
|
|
155
|
+
writer.add_file('confidential.pdf')
|
|
156
|
+
writer.write
|
|
157
|
+
|
|
158
|
+
# Custom key derivation iterations (higher = more secure, slower)
|
|
159
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('protected.rar',
|
|
160
|
+
compression: :lzma,
|
|
161
|
+
level: 5,
|
|
162
|
+
password: 'VerySecurePassword2025!',
|
|
163
|
+
kdf_iterations: 524_288 # 2^19, more secure than default
|
|
164
|
+
)
|
|
165
|
+
writer.add_directory('sensitive_data/')
|
|
166
|
+
writer.write
|
|
167
|
+
|
|
168
|
+
# KDF iteration options:
|
|
169
|
+
# - 65,536 (2^16): Minimum, fast but less secure
|
|
170
|
+
# - 262,144 (2^18): Default, balanced security/performance
|
|
171
|
+
# - 1,048,576 (2^20): Maximum, strongest security
|
|
172
|
+
|
|
173
|
+
# Security features:
|
|
174
|
+
# - AES-256-CBC encryption with PKCS#7 padding
|
|
175
|
+
# - PBKDF2-HMAC-SHA256 key derivation
|
|
176
|
+
# - Per-file IV generation
|
|
177
|
+
# - Password verification before decryption
|
|
178
|
+
----
|
|
179
|
+
|
|
180
|
+
=== RAR5 PAR2 Recovery Records (v0.5.0)
|
|
181
|
+
|
|
182
|
+
Add error correction for archive recovery:
|
|
183
|
+
|
|
184
|
+
[source,ruby]
|
|
185
|
+
----
|
|
186
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
187
|
+
|
|
188
|
+
# Enable PAR2 recovery with default 5% redundancy
|
|
189
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
|
|
190
|
+
compression: :lzma,
|
|
191
|
+
recovery: true
|
|
192
|
+
)
|
|
193
|
+
writer.add_directory('important_data/')
|
|
194
|
+
files = writer.write
|
|
195
|
+
# => ['backup.rar', 'backup.par2', 'backup.vol00+01.par2', ...]
|
|
196
|
+
|
|
197
|
+
# Custom redundancy percentage
|
|
198
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('critical.rar',
|
|
199
|
+
compression: :lzma,
|
|
200
|
+
level: 5,
|
|
201
|
+
recovery: true,
|
|
202
|
+
recovery_percent: 15 # Can recover up to 15% data loss
|
|
203
|
+
)
|
|
204
|
+
writer.add_file('mission_critical.db')
|
|
205
|
+
files = writer.write
|
|
206
|
+
|
|
207
|
+
# Redundancy guidelines:
|
|
208
|
+
# - 5% (default): General backups
|
|
209
|
+
# - 10%: Important data
|
|
210
|
+
# - 20-30%: High-value data
|
|
211
|
+
# - 50-100%: Maximum protection
|
|
212
|
+
|
|
213
|
+
# Recovery capabilities:
|
|
214
|
+
# - Detect corruption at block level
|
|
215
|
+
# - Repair damaged archives automatically
|
|
216
|
+
# - Works with multi-volume, solid, and encrypted archives
|
|
217
|
+
----
|
|
218
|
+
|
|
219
|
+
=== RAR5 Combined Features (v0.5.0)
|
|
220
|
+
|
|
221
|
+
Use all features together for comprehensive protection:
|
|
222
|
+
|
|
223
|
+
[source,ruby]
|
|
224
|
+
----
|
|
225
|
+
require 'omnizip/formats/rar/rar5/writer'
|
|
226
|
+
|
|
227
|
+
# Production-ready backup configuration
|
|
228
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('complete_backup.rar',
|
|
229
|
+
# Compression
|
|
230
|
+
compression: :lzma,
|
|
231
|
+
level: 5,
|
|
232
|
+
solid: true,
|
|
233
|
+
|
|
234
|
+
# Security
|
|
235
|
+
password: 'SecureBackup2025!',
|
|
236
|
+
kdf_iterations: 262_144,
|
|
237
|
+
|
|
238
|
+
# Multi-volume
|
|
239
|
+
multi_volume: true,
|
|
240
|
+
volume_size: '4G', # DVD-sized volumes
|
|
241
|
+
volume_naming: 'part',
|
|
242
|
+
|
|
243
|
+
# Recovery
|
|
244
|
+
recovery: true,
|
|
245
|
+
recovery_percent: 10,
|
|
246
|
+
|
|
247
|
+
# Optional fields
|
|
248
|
+
include_mtime: true
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
writer.add_directory('/critical/data')
|
|
252
|
+
writer.add_directory('/important/documents')
|
|
253
|
+
files = writer.write
|
|
254
|
+
|
|
255
|
+
puts "Backup created: #{files.size} files"
|
|
256
|
+
archive_files = files.select { |f| f.end_with?('.rar') }
|
|
257
|
+
par2_files = files.select { |f| f.include?('.par2') }
|
|
258
|
+
puts " Archive volumes: #{archive_files.size}"
|
|
259
|
+
puts " PAR2 files: #{par2_files.size}"
|
|
260
|
+
puts " Total size: #{files.sum { |f| File.size(f) } / 1024 / 1024}MB"
|
|
261
|
+
----
|
|
262
|
+
|
|
263
|
+
=== RAR5 Best Practices
|
|
264
|
+
|
|
265
|
+
**For Maximum Compression:**
|
|
266
|
+
[source,ruby]
|
|
267
|
+
----
|
|
268
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
269
|
+
compression: :lzma,
|
|
270
|
+
level: 5, # Best compression
|
|
271
|
+
solid: true, # 10-30% better ratios
|
|
272
|
+
include_mtime: true
|
|
273
|
+
)
|
|
274
|
+
----
|
|
275
|
+
|
|
276
|
+
**For Important Data:**
|
|
277
|
+
[source,ruby]
|
|
278
|
+
----
|
|
279
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
|
|
280
|
+
compression: :lzma,
|
|
281
|
+
level: 3, # Balanced performance
|
|
282
|
+
recovery: true,
|
|
283
|
+
recovery_percent: 15, # 15% redundancy
|
|
284
|
+
include_mtime: true
|
|
285
|
+
)
|
|
286
|
+
----
|
|
287
|
+
|
|
288
|
+
**For Optical Media:**
|
|
289
|
+
[source,ruby]
|
|
290
|
+
----
|
|
291
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
|
|
292
|
+
compression: :lzma,
|
|
293
|
+
level: 5,
|
|
294
|
+
solid: true,
|
|
295
|
+
multi_volume: true,
|
|
296
|
+
volume_size: '4.7GB', # DVD size
|
|
297
|
+
recovery: true,
|
|
298
|
+
include_mtime: true
|
|
299
|
+
)
|
|
300
|
+
----
|
|
301
|
+
|
|
302
|
+
**For Secure Archives:**
|
|
303
|
+
[source,ruby]
|
|
304
|
+
----
|
|
305
|
+
writer = Omnizip::Formats::Rar::Rar5::Writer.new('secure.rar',
|
|
306
|
+
compression: :lzma,
|
|
307
|
+
level: 5,
|
|
308
|
+
password: ENV['BACKUP_PASSWORD'],
|
|
309
|
+
kdf_iterations: 524_288, # Enhanced security
|
|
310
|
+
recovery: true,
|
|
311
|
+
recovery_percent: 10,
|
|
312
|
+
include_mtime: true
|
|
313
|
+
)
|
|
314
|
+
----
|
|
315
|
+
|
|
316
|
+
== Adding Files
|
|
317
|
+
|
|
318
|
+
=== Individual Files
|
|
319
|
+
|
|
320
|
+
[source,ruby]
|
|
321
|
+
----
|
|
322
|
+
archive.add_file('source.txt', 'dest.txt')
|
|
323
|
+
----
|
|
324
|
+
|
|
325
|
+
=== Directories
|
|
326
|
+
|
|
327
|
+
[source,ruby]
|
|
328
|
+
----
|
|
329
|
+
archive.add_directory('folder/')
|
|
330
|
+
----
|
|
331
|
+
|
|
332
|
+
=== From Data
|
|
333
|
+
|
|
334
|
+
[source,ruby]
|
|
335
|
+
----
|
|
336
|
+
archive.add_data('config.json', JSON.generate(config))
|
|
337
|
+
----
|
|
338
|
+
|
|
339
|
+
== Compression Options
|
|
340
|
+
|
|
341
|
+
[source,ruby]
|
|
342
|
+
----
|
|
343
|
+
Omnizip::Archive.create('archive.7z',
|
|
344
|
+
format: :seven_zip,
|
|
345
|
+
algorithm: :lzma2,
|
|
346
|
+
level: 9) do |archive|
|
|
347
|
+
# ...
|
|
348
|
+
end
|
|
349
|
+
----
|
|
350
|
+
|
|
351
|
+
== See Also
|
|
352
|
+
|
|
353
|
+
* link:extracting-archives.html[Extracting Archives]
|
|
354
|
+
* link:../reference/api/overview.html[Ruby API]
|