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,246 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Parallel Processing
|
|
3
|
+
nav_order: 2
|
|
4
|
+
parent: Advanced Features
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
Parallel processing leverages multiple CPU cores to significantly speed up compression and extraction operations. This feature allows you to process large archives or multiple files simultaneously, reducing overall processing time.
|
|
11
|
+
|
|
12
|
+
== Benefits
|
|
13
|
+
|
|
14
|
+
* **2-3x Faster**: Achieve 2-3x speedup on multi-core systems
|
|
15
|
+
* **Better Resource Utilization**: Use all available CPU cores effectively
|
|
16
|
+
* **Reduced Wait Time**: Process large batches of files quickly
|
|
17
|
+
* **Scalable**: Performance improves with more CPU cores
|
|
18
|
+
|
|
19
|
+
== When to Use Parallel Processing
|
|
20
|
+
|
|
21
|
+
[cols="1,3"]
|
|
22
|
+
|===
|
|
23
|
+
|Scenario |Parallel Benefit
|
|
24
|
+
|
|
25
|
+
|Large Archives (>100 files)
|
|
26
|
+
|Distribute file processing across cores
|
|
27
|
+
|
|
28
|
+
|Batch Operations
|
|
29
|
+
|Process multiple archives simultaneously
|
|
30
|
+
|
|
31
|
+
|Multi-core Servers
|
|
32
|
+
|Maximize server resource utilization
|
|
33
|
+
|
|
34
|
+
|Time-Critical Tasks
|
|
35
|
+
|Reduce processing time for urgent operations
|
|
36
|
+
|===
|
|
37
|
+
|
|
38
|
+
== Parallel Compression
|
|
39
|
+
|
|
40
|
+
=== Compress Directory in Parallel
|
|
41
|
+
|
|
42
|
+
Automatically distribute files across available cores:
|
|
43
|
+
|
|
44
|
+
[source,ruby]
|
|
45
|
+
----
|
|
46
|
+
# Compress using all available cores
|
|
47
|
+
Omnizip.compress_directory(
|
|
48
|
+
'large_project/',
|
|
49
|
+
'backup.zip',
|
|
50
|
+
parallel: true,
|
|
51
|
+
threads: 4 # Or omit to use all cores
|
|
52
|
+
)
|
|
53
|
+
----
|
|
54
|
+
|
|
55
|
+
=== Custom Thread Count
|
|
56
|
+
|
|
57
|
+
Control the number of parallel workers:
|
|
58
|
+
|
|
59
|
+
[source,ruby]
|
|
60
|
+
----
|
|
61
|
+
# Use specific number of threads
|
|
62
|
+
Omnizip::Archive.create('archive.7z', format: :seven_zip) do |archive|
|
|
63
|
+
archive.add_directory(
|
|
64
|
+
'data/',
|
|
65
|
+
parallel: true,
|
|
66
|
+
threads: 8, # Use 8 worker threads
|
|
67
|
+
chunk_size: 1.megabyte # Process 1MB chunks
|
|
68
|
+
)
|
|
69
|
+
end
|
|
70
|
+
----
|
|
71
|
+
|
|
72
|
+
== Parallel Extraction
|
|
73
|
+
|
|
74
|
+
=== Extract Multiple Files Simultaneously
|
|
75
|
+
|
|
76
|
+
Extract files in parallel for faster extraction:
|
|
77
|
+
|
|
78
|
+
[source,ruby]
|
|
79
|
+
----
|
|
80
|
+
# Extract with parallel processing
|
|
81
|
+
Omnizip.extract_archive(
|
|
82
|
+
'large-archive.zip',
|
|
83
|
+
'output/',
|
|
84
|
+
parallel: true,
|
|
85
|
+
threads: 4
|
|
86
|
+
)
|
|
87
|
+
----
|
|
88
|
+
|
|
89
|
+
=== With Progress Tracking
|
|
90
|
+
|
|
91
|
+
Combine parallel processing with progress monitoring:
|
|
92
|
+
|
|
93
|
+
[source,ruby]
|
|
94
|
+
----
|
|
95
|
+
Omnizip.extract_archive('backup.zip', 'restored/') do |progress|
|
|
96
|
+
puts "Extracted #{progress.files_processed}/#{progress.total_files} files"
|
|
97
|
+
puts "Using #{progress.active_threads} parallel threads"
|
|
98
|
+
puts "Speed: #{progress.throughput_mb_s} MB/s"
|
|
99
|
+
end
|
|
100
|
+
----
|
|
101
|
+
|
|
102
|
+
== Performance Characteristics
|
|
103
|
+
|
|
104
|
+
[cols="2,1,1,1,1"]
|
|
105
|
+
|===
|
|
106
|
+
|Workload |1 Thread |2 Threads |4 Threads |8 Threads
|
|
107
|
+
|
|
108
|
+
|100 small files
|
|
109
|
+
|10s
|
|
110
|
+
|6s
|
|
111
|
+
|4s
|
|
112
|
+
|3s
|
|
113
|
+
|
|
114
|
+
|10 large files
|
|
115
|
+
|60s
|
|
116
|
+
|35s
|
|
117
|
+
|20s
|
|
118
|
+
|15s
|
|
119
|
+
|
|
120
|
+
|Mixed workload
|
|
121
|
+
|30s
|
|
122
|
+
|18s
|
|
123
|
+
|12s
|
|
124
|
+
|10s
|
|
125
|
+
|===
|
|
126
|
+
|
|
127
|
+
*Note: Performance varies based on CPU, disk speed, and file characteristics.*
|
|
128
|
+
|
|
129
|
+
== Configuration Options
|
|
130
|
+
|
|
131
|
+
=== Thread Count
|
|
132
|
+
|
|
133
|
+
Control parallelism level:
|
|
134
|
+
|
|
135
|
+
[source,ruby]
|
|
136
|
+
----
|
|
137
|
+
# Auto-detect (recommended)
|
|
138
|
+
parallel: true
|
|
139
|
+
|
|
140
|
+
# Specific thread count
|
|
141
|
+
parallel: true, threads: 4
|
|
142
|
+
|
|
143
|
+
# Match CPU cores
|
|
144
|
+
parallel: true, threads: Etc.nprocessors
|
|
145
|
+
----
|
|
146
|
+
|
|
147
|
+
=== Chunk Size
|
|
148
|
+
|
|
149
|
+
Configure work distribution:
|
|
150
|
+
|
|
151
|
+
[source,ruby]
|
|
152
|
+
----
|
|
153
|
+
# Smaller chunks = better distribution, more overhead
|
|
154
|
+
chunk_size: 512.kilobytes
|
|
155
|
+
|
|
156
|
+
# Larger chunks = less overhead, less parallel benefit
|
|
157
|
+
chunk_size: 10.megabytes
|
|
158
|
+
|
|
159
|
+
# Default: 1MB (good balance)
|
|
160
|
+
chunk_size: 1.megabyte
|
|
161
|
+
----
|
|
162
|
+
|
|
163
|
+
== Use Cases
|
|
164
|
+
|
|
165
|
+
=== Server Deployments
|
|
166
|
+
|
|
167
|
+
Maximize server hardware utilization:
|
|
168
|
+
|
|
169
|
+
[source,ruby]
|
|
170
|
+
----
|
|
171
|
+
# Backup server with 16 cores
|
|
172
|
+
Omnizip.compress_directory(
|
|
173
|
+
'/var/www/',
|
|
174
|
+
'/backups/www-backup.7z',
|
|
175
|
+
format: :seven_zip,
|
|
176
|
+
compression: :lzma2,
|
|
177
|
+
parallel: true,
|
|
178
|
+
threads: 16
|
|
179
|
+
)
|
|
180
|
+
----
|
|
181
|
+
|
|
182
|
+
=== Batch Processing
|
|
183
|
+
|
|
184
|
+
Process multiple archives efficiently:
|
|
185
|
+
|
|
186
|
+
[source,ruby]
|
|
187
|
+
----
|
|
188
|
+
# Extract multiple archives in parallel
|
|
189
|
+
archives = Dir.glob('downloads/*.zip')
|
|
190
|
+
|
|
191
|
+
archives.each_slice(4) do |batch|
|
|
192
|
+
threads = batch.map do |archive|
|
|
193
|
+
Thread.new do
|
|
194
|
+
Omnizip.extract_archive(
|
|
195
|
+
archive,
|
|
196
|
+
"extracted/#{File.basename(archive, '.zip')}/"
|
|
197
|
+
)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
threads.each(&:join)
|
|
202
|
+
end
|
|
203
|
+
----
|
|
204
|
+
|
|
205
|
+
== Best Practices
|
|
206
|
+
|
|
207
|
+
. **Match Thread Count to Cores**: Use `Etc.nprocessors` for optimal performance
|
|
208
|
+
. **Consider Disk I/O**: More threads may not help with slow disks
|
|
209
|
+
. **Monitor Memory**: Each thread uses additional memory
|
|
210
|
+
. **Test Your Workload**: Measure actual speedup for your use case
|
|
211
|
+
. **Combine with Streaming**: Use both for maximum efficiency
|
|
212
|
+
|
|
213
|
+
== Limitations
|
|
214
|
+
|
|
215
|
+
* Ruby GIL limits true parallelism (use JRuby for better results)
|
|
216
|
+
* Memory usage increases with thread count
|
|
217
|
+
* I/O-bound operations see less benefit
|
|
218
|
+
* Very small files have overhead from thread management
|
|
219
|
+
|
|
220
|
+
== Platform Considerations
|
|
221
|
+
|
|
222
|
+
[cols="1,3"]
|
|
223
|
+
|===
|
|
224
|
+
|Platform |Notes
|
|
225
|
+
|
|
226
|
+
|MRI Ruby
|
|
227
|
+
|Limited by GIL, 2-3x speedup typical
|
|
228
|
+
|
|
229
|
+
|JRuby
|
|
230
|
+
|No GIL, better parallel scalability
|
|
231
|
+
|
|
232
|
+
|TruffleRuby
|
|
233
|
+
|Excellent parallel performance
|
|
234
|
+
|
|
235
|
+
|Windows
|
|
236
|
+
|Similar performance to Unix systems
|
|
237
|
+
|
|
238
|
+
|Linux/macOS
|
|
239
|
+
|Full parallel processing support
|
|
240
|
+
|===
|
|
241
|
+
|
|
242
|
+
== See Also
|
|
243
|
+
|
|
244
|
+
* link:streaming.html[Streaming] - Combine for memory efficiency
|
|
245
|
+
* link:progress-tracking.html[Progress Tracking] - Monitor parallel operations
|
|
246
|
+
* link:../../compatibility.html[Compatibility] - Format support for parallel processing
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Progress Tracking
|
|
3
|
+
nav_order: 3
|
|
4
|
+
parent: Advanced Features
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
Real-time progress tracking provides visibility into long-running archive operations. Monitor file counts, bytes processed, processing rate, and estimated time remaining.
|
|
11
|
+
|
|
12
|
+
== Benefits
|
|
13
|
+
|
|
14
|
+
* **User Feedback**: Show progress to users during long operations
|
|
15
|
+
* **Better UX**: Prevent "frozen" appearance during processing
|
|
16
|
+
* **Performance Monitoring**: Track processing rates and bottlenecks
|
|
17
|
+
* **Time Estimation**: Know how long operations will take
|
|
18
|
+
* **Debugging**: Identify which files cause slowdowns
|
|
19
|
+
|
|
20
|
+
== Progress Callbacks
|
|
21
|
+
|
|
22
|
+
=== Basic Progress Monitoring
|
|
23
|
+
|
|
24
|
+
Get updates during compression or extraction:
|
|
25
|
+
|
|
26
|
+
[source,ruby]
|
|
27
|
+
----
|
|
28
|
+
Omnizip.compress_directory('large_project/', 'backup.zip') do |progress|
|
|
29
|
+
puts "Progress: #{progress.percentage}%"
|
|
30
|
+
puts "Current file: #{progress.current_file}"
|
|
31
|
+
puts "Files: #{progress.files_processed}/#{progress.total_files}"
|
|
32
|
+
end
|
|
33
|
+
----
|
|
34
|
+
|
|
35
|
+
=== Detailed Progress Information
|
|
36
|
+
|
|
37
|
+
Access comprehensive progress data:
|
|
38
|
+
|
|
39
|
+
[source,ruby]
|
|
40
|
+
----
|
|
41
|
+
Omnizip.extract_archive('archive.zip', 'output/') do |progress|
|
|
42
|
+
puts "Files: #{progress.files_processed}/#{progress.total_files}"
|
|
43
|
+
puts "Bytes: #{progress.bytes_processed}/#{progress.total_bytes}"
|
|
44
|
+
puts "Speed: #{progress.throughput_mb_s} MB/s"
|
|
45
|
+
puts "Elapsed: #{progress.elapsed_seconds}s"
|
|
46
|
+
puts "ETA: #{progress.eta_seconds}s"
|
|
47
|
+
puts "Percentage: #{progress.percentage}%"
|
|
48
|
+
end
|
|
49
|
+
----
|
|
50
|
+
|
|
51
|
+
== Console Progress Bar
|
|
52
|
+
|
|
53
|
+
=== Automatic Progress Bar
|
|
54
|
+
|
|
55
|
+
Enable automatic progress bar for terminal output:
|
|
56
|
+
|
|
57
|
+
[source,ruby]
|
|
58
|
+
----
|
|
59
|
+
Omnizip.compress_directory(
|
|
60
|
+
'data/',
|
|
61
|
+
'backup.zip',
|
|
62
|
+
progress: :console # Show progress bar
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# Output:
|
|
66
|
+
# [=========> ] 45% (23/50 files) - 2.5 MB/s - ETA: 12s
|
|
67
|
+
----
|
|
68
|
+
|
|
69
|
+
=== Custom Progress Bar
|
|
70
|
+
|
|
71
|
+
Configure progress bar appearance:
|
|
72
|
+
|
|
73
|
+
[source,ruby]
|
|
74
|
+
----
|
|
75
|
+
options = {
|
|
76
|
+
progress: :console,
|
|
77
|
+
progress_format: :detailed, # or :simple, :verbose
|
|
78
|
+
update_interval: 0.5, # Update every 500ms
|
|
79
|
+
show_rate: true,
|
|
80
|
+
show_eta: true
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
Omnizip.compress_directory('files/', 'backup.7z', **options)
|
|
84
|
+
----
|
|
85
|
+
|
|
86
|
+
== Web Application Integration
|
|
87
|
+
|
|
88
|
+
=== Rails Real-Time Updates
|
|
89
|
+
|
|
90
|
+
Send progress updates to the browser via WebSocket:
|
|
91
|
+
|
|
92
|
+
[source,ruby]
|
|
93
|
+
----
|
|
94
|
+
class ArchiveJob < ApplicationJob
|
|
95
|
+
def perform(user_id, file_paths)
|
|
96
|
+
ActionCable.server.broadcast("archive_#{user_id}", {
|
|
97
|
+
status: 'starting',
|
|
98
|
+
total_files: file_paths.count
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
Omnizip.compress_files(file_paths, 'output.zip') do |progress|
|
|
102
|
+
ActionCable.server.broadcast("archive_#{user_id}", {
|
|
103
|
+
status: 'processing',
|
|
104
|
+
percentage: progress.percentage,
|
|
105
|
+
files_done: progress.files_processed,
|
|
106
|
+
current_file: progress.current_file,
|
|
107
|
+
eta: progress.eta_seconds
|
|
108
|
+
})
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
ActionCable.server.broadcast("archive_#{user_id}", {
|
|
112
|
+
status: 'complete',
|
|
113
|
+
download_url: archive_url
|
|
114
|
+
})
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
----
|
|
118
|
+
|
|
119
|
+
=== API Progress Endpoint
|
|
120
|
+
|
|
121
|
+
Provide progress via polling endpoint:
|
|
122
|
+
|
|
123
|
+
[source,ruby]
|
|
124
|
+
----
|
|
125
|
+
# Start background job
|
|
126
|
+
def create_archive
|
|
127
|
+
job_id = SecureRandom.uuid
|
|
128
|
+
|
|
129
|
+
Thread.new do
|
|
130
|
+
Omnizip.compress_directory('data/', 'output.zip') do |progress|
|
|
131
|
+
# Store progress in Redis/cache
|
|
132
|
+
Rails.cache.write("archive_progress_#{job_id}", {
|
|
133
|
+
percentage: progress.percentage,
|
|
134
|
+
files: progress.files_processed,
|
|
135
|
+
total: progress.total_files,
|
|
136
|
+
eta: progress.eta_seconds
|
|
137
|
+
})
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
render json: { job_id: job_id }
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Check progress
|
|
145
|
+
def check_progress
|
|
146
|
+
progress = Rails.cache.read("archive_progress_#{params[:job_id]}")
|
|
147
|
+
render json: progress
|
|
148
|
+
end
|
|
149
|
+
----
|
|
150
|
+
|
|
151
|
+
== Progress Metrics
|
|
152
|
+
|
|
153
|
+
=== Available Metrics
|
|
154
|
+
|
|
155
|
+
[cols="2,3"]
|
|
156
|
+
|===
|
|
157
|
+
|Metric |Description
|
|
158
|
+
|
|
159
|
+
|`percentage`
|
|
160
|
+
|Overall completion percentage (0-100)
|
|
161
|
+
|
|
162
|
+
|`files_processed`
|
|
163
|
+
|Number of files processed so far
|
|
164
|
+
|
|
165
|
+
|`total_files`
|
|
166
|
+
|Total number of files to process
|
|
167
|
+
|
|
168
|
+
|`bytes_processed`
|
|
169
|
+
|Bytes processed so far
|
|
170
|
+
|
|
171
|
+
|`total_bytes`
|
|
172
|
+
|Total bytes to process
|
|
173
|
+
|
|
174
|
+
|`current_file`
|
|
175
|
+
|Name of file currently being processed
|
|
176
|
+
|
|
177
|
+
|`throughput_mb_s`
|
|
178
|
+
|Processing speed in MB/second
|
|
179
|
+
|
|
180
|
+
|`elapsed_seconds`
|
|
181
|
+
|Time elapsed since start
|
|
182
|
+
|
|
183
|
+
|`eta_seconds`
|
|
184
|
+
|Estimated seconds until completion
|
|
185
|
+
|
|
186
|
+
|`active_threads`
|
|
187
|
+
|Number of active worker threads (parallel mode)
|
|
188
|
+
|===
|
|
189
|
+
|
|
190
|
+
=== Computed Properties
|
|
191
|
+
|
|
192
|
+
[source,ruby]
|
|
193
|
+
----
|
|
194
|
+
progress.percentage # => 45.2
|
|
195
|
+
progress.files_remaining # => 27
|
|
196
|
+
progress.bytes_remaining # => 125829120
|
|
197
|
+
progress.elapsed_formatted # => "2m 15s"
|
|
198
|
+
progress.eta_formatted # => "3m 05s"
|
|
199
|
+
progress.completion_time # => 2024-01-15 14:32:10
|
|
200
|
+
----
|
|
201
|
+
|
|
202
|
+
== Performance Monitoring
|
|
203
|
+
|
|
204
|
+
=== Track Processing Rate
|
|
205
|
+
|
|
206
|
+
Monitor compression/decompression speed:
|
|
207
|
+
|
|
208
|
+
[source,ruby]
|
|
209
|
+
----
|
|
210
|
+
rates = []
|
|
211
|
+
|
|
212
|
+
Omnizip.compress_directory('files/', 'backup.zip') do |progress|
|
|
213
|
+
rates << progress.throughput_mb_s
|
|
214
|
+
|
|
215
|
+
# Alert if speed drops significantly
|
|
216
|
+
if rates.size > 10 && progress.throughput_mb_s < rates[-10..-1].average * 0.5
|
|
217
|
+
puts "WARNING: Processing slowed down significantly"
|
|
218
|
+
puts "Current file: #{progress.current_file}"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
puts "Average rate: #{rates.average.round(2)} MB/s"
|
|
223
|
+
puts "Peak rate: #{rates.max.round(2)} MB/s"
|
|
224
|
+
----
|
|
225
|
+
|
|
226
|
+
=== Identify Slow Files
|
|
227
|
+
|
|
228
|
+
Find files that take longest to process:
|
|
229
|
+
|
|
230
|
+
[source,ruby]
|
|
231
|
+
----
|
|
232
|
+
slow_files = []
|
|
233
|
+
|
|
234
|
+
Omnizip.compress_directory('data/', 'backup.zip') do |progress|
|
|
235
|
+
if progress.current_file_duration > 5.0 # More than 5 seconds
|
|
236
|
+
slow_files << {
|
|
237
|
+
name: progress.current_file,
|
|
238
|
+
duration: progress.current_file_duration,
|
|
239
|
+
size: progress.current_file_size
|
|
240
|
+
}
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
slow_files.sort_by { |f| -f[:duration] }.first(10).each do |f|
|
|
245
|
+
puts "#{f[:name]}: #{f[:duration]}s (#{f[:size]} bytes)"
|
|
246
|
+
end
|
|
247
|
+
----
|
|
248
|
+
|
|
249
|
+
== Custom Progress Reporters
|
|
250
|
+
|
|
251
|
+
=== Log File Reporter
|
|
252
|
+
|
|
253
|
+
Write progress to log file:
|
|
254
|
+
|
|
255
|
+
[source,ruby]
|
|
256
|
+
----
|
|
257
|
+
File.open('archive_progress.log', 'w') do |log|
|
|
258
|
+
Omnizip.compress_directory('data/', 'backup.zip') do |progress|
|
|
259
|
+
log.puts "[#{Time.now}] #{progress.percentage}% - #{progress.current_file}"
|
|
260
|
+
log.flush
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
----
|
|
264
|
+
|
|
265
|
+
=== JSON Progress Reporter
|
|
266
|
+
|
|
267
|
+
Output machine-readable progress:
|
|
268
|
+
|
|
269
|
+
[source,ruby]
|
|
270
|
+
----
|
|
271
|
+
Omnizip.compress_directory('data/', 'backup.zip') do |progress|
|
|
272
|
+
json = {
|
|
273
|
+
timestamp: Time.now.iso8601,
|
|
274
|
+
percentage: progress.percentage,
|
|
275
|
+
files_done: progress.files_processed,
|
|
276
|
+
files_total: progress.total_files,
|
|
277
|
+
current: progress.current_file,
|
|
278
|
+
rate_mbs: progress.throughput_mb_s,
|
|
279
|
+
eta_seconds: progress.eta_seconds
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
puts json.to_json
|
|
283
|
+
end
|
|
284
|
+
----
|
|
285
|
+
|
|
286
|
+
== CLI Progress Display
|
|
287
|
+
|
|
288
|
+
[source,bash]
|
|
289
|
+
----
|
|
290
|
+
# Default progress bar
|
|
291
|
+
$ omnizip archive create backup.zip files/
|
|
292
|
+
[=========> ] 45% (230/512 files) - 2.5 MB/s - ETA: 1m 23s
|
|
293
|
+
|
|
294
|
+
# Verbose progress
|
|
295
|
+
$ omnizip archive create backup.zip files/ --progress verbose
|
|
296
|
+
Processing: src/app.rb (230/512 files, 45%)
|
|
297
|
+
Size: 45 KB -> 12 KB (73% compression)
|
|
298
|
+
Rate: 2.5 MB/s, Elapsed: 1m 12s, ETA: 1m 23s
|
|
299
|
+
|
|
300
|
+
# Quiet mode (no progress)
|
|
301
|
+
$ omnizip archive create backup.zip files/ --quiet
|
|
302
|
+
|
|
303
|
+
# JSON progress output
|
|
304
|
+
$ omnizip archive create backup.zip files/ --progress json
|
|
305
|
+
{"percentage":45.0,"files":230,"total":512,"eta":83}
|
|
306
|
+
----
|
|
307
|
+
|
|
308
|
+
== Best Practices
|
|
309
|
+
|
|
310
|
+
. **Update Interval**: Don't update too frequently (0.5-1s is good)
|
|
311
|
+
. **Non-Blocking**: Use threads/async for long operations
|
|
312
|
+
. **User Experience**: Always show progress for operations >5 seconds
|
|
313
|
+
. **Error Handling**: Continue tracking even if individual files fail
|
|
314
|
+
. **Resource Cleanup**: Ensure progress callbacks don't leak memory
|
|
315
|
+
|
|
316
|
+
== See Also
|
|
317
|
+
|
|
318
|
+
* link:parallel-processing.html[Parallel Processing] - Monitor multi-threaded operations
|
|
319
|
+
* link:streaming.html[Streaming] - Track streaming operations
|
|
320
|
+
* link:../performance-tuning.html[Performance Tuning] - Optimize based on progress data
|