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,449 @@
|
|
|
1
|
+
= Architecture Documentation
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Purpose
|
|
6
|
+
|
|
7
|
+
This document describes Omnizip's system architecture, design patterns, and extensibility mechanisms. It's intended for developers who want to understand the internal structure or contribute new algorithms and features.
|
|
8
|
+
|
|
9
|
+
== General Architecture
|
|
10
|
+
|
|
11
|
+
Omnizip uses a registry-based architecture that separates algorithm implementation from the compression interface. This design enables easy addition of new compression algorithms while maintaining a consistent API.
|
|
12
|
+
|
|
13
|
+
The architecture consists of three main layers:
|
|
14
|
+
|
|
15
|
+
. **Algorithm Registry Layer:** Manages algorithm registration and discovery
|
|
16
|
+
. **Algorithm Implementation Layer:** Implements specific compression algorithms
|
|
17
|
+
. **I/O Management Layer:** Handles buffered input/output operations
|
|
18
|
+
|
|
19
|
+
== System Architecture Diagram
|
|
20
|
+
|
|
21
|
+
[source]
|
|
22
|
+
----
|
|
23
|
+
┌────────────────────────────────────────────────────────────┐
|
|
24
|
+
│ User Code │
|
|
25
|
+
│ (CLI / Ruby API) │
|
|
26
|
+
└────────────────────┬───────────────────────────────────────┘
|
|
27
|
+
│
|
|
28
|
+
│ Uses
|
|
29
|
+
▼
|
|
30
|
+
┌────────────────────────────────────────────────────────────┐
|
|
31
|
+
│ AlgorithmRegistry │
|
|
32
|
+
│ │
|
|
33
|
+
│ • register(name, klass) │
|
|
34
|
+
│ • get(name) → Algorithm Class │
|
|
35
|
+
│ • available → [:lzma, ...] │
|
|
36
|
+
└────────────┬───────────────────────────────────────────────┘
|
|
37
|
+
│
|
|
38
|
+
│ Returns
|
|
39
|
+
▼
|
|
40
|
+
┌────────────────────────────────────────────────────────────┐
|
|
41
|
+
│ Algorithm (Base) │
|
|
42
|
+
│ │
|
|
43
|
+
│ • compress(input, output, options) │
|
|
44
|
+
│ • decompress(input, output, options) │
|
|
45
|
+
│ • metadata → AlgorithmMetadata │
|
|
46
|
+
└────────────┬───────────────────────────────────────────────┘
|
|
47
|
+
│
|
|
48
|
+
│ Implemented by
|
|
49
|
+
▼
|
|
50
|
+
┌────────────────────────────────────────────────────────────┐
|
|
51
|
+
│ LZMA Algorithm │
|
|
52
|
+
│ │
|
|
53
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
54
|
+
│ │ Encoder │ │ Decoder │ │ State │ │
|
|
55
|
+
│ │ │ │ │ │ │ │
|
|
56
|
+
│ │ • encode() │ │ • decode() │ │ • track() │ │
|
|
57
|
+
│ └──────┬───────┘ └──────┬───────┘ └──────────────┘ │
|
|
58
|
+
│ │ │ │
|
|
59
|
+
│ ▼ ▼ │
|
|
60
|
+
│ ┌──────────────┐ ┌──────────────┐ │
|
|
61
|
+
│ │ RangeEncoder │ │ RangeDecoder │ │
|
|
62
|
+
│ └──────────────┘ └──────────────┘ │
|
|
63
|
+
│ │ │ │
|
|
64
|
+
│ ▼ ▼ │
|
|
65
|
+
│ ┌──────────────┐ ┌──────────────┐ │
|
|
66
|
+
│ │ MatchFinder │ │ BitModel │ │
|
|
67
|
+
│ └──────────────┘ └──────────────┘ │
|
|
68
|
+
└────────────┬───────────────────────────────────────────────┘
|
|
69
|
+
│
|
|
70
|
+
│ Uses
|
|
71
|
+
▼
|
|
72
|
+
┌────────────────────────────────────────────────────────────┐
|
|
73
|
+
│ I/O Management │
|
|
74
|
+
│ │
|
|
75
|
+
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
|
|
76
|
+
│ │ BufferedInput│ │BufferedOutput│ │StreamManager │ │
|
|
77
|
+
│ └──────────────┘ └──────────────┘ └──────────────┘ │
|
|
78
|
+
└────────────────────────────────────────────────────────────┘
|
|
79
|
+
----
|
|
80
|
+
|
|
81
|
+
== Data Flow
|
|
82
|
+
|
|
83
|
+
=== Compression Flow
|
|
84
|
+
|
|
85
|
+
[source]
|
|
86
|
+
----
|
|
87
|
+
Compression Flow:
|
|
88
|
+
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
89
|
+
│ Input File │────►│ LZMA Encoder │────►│ Output File │
|
|
90
|
+
└─────────────┘ └──────────────┘ └──────────────┘
|
|
91
|
+
│
|
|
92
|
+
│ Uses
|
|
93
|
+
▼
|
|
94
|
+
┌──────────────┐
|
|
95
|
+
│ MatchFinder │
|
|
96
|
+
│ RangeEncoder │
|
|
97
|
+
│ BitModel │
|
|
98
|
+
└──────────────┘
|
|
99
|
+
----
|
|
100
|
+
|
|
101
|
+
=== Decompression Flow
|
|
102
|
+
|
|
103
|
+
[source]
|
|
104
|
+
----
|
|
105
|
+
Decompression Flow:
|
|
106
|
+
┌─────────────┐ ┌──────────────┐ ┌──────────────┐
|
|
107
|
+
│Compressed │────►│ LZMA Decoder │────►│ Decompressed │
|
|
108
|
+
│ File │ │ │ │ Output │
|
|
109
|
+
└─────────────┘ └──────────────┘ └──────────────┘
|
|
110
|
+
│
|
|
111
|
+
│ Uses
|
|
112
|
+
▼
|
|
113
|
+
┌──────────────┐
|
|
114
|
+
│ RangeDecoder │
|
|
115
|
+
│ BitModel │
|
|
116
|
+
│ State │
|
|
117
|
+
└──────────────┘
|
|
118
|
+
----
|
|
119
|
+
|
|
120
|
+
== Design Patterns
|
|
121
|
+
|
|
122
|
+
=== Registry Pattern
|
|
123
|
+
|
|
124
|
+
The registry pattern provides a plugin architecture for algorithms, filters, formats, and checksums.
|
|
125
|
+
|
|
126
|
+
**Purpose:** Enable runtime discovery and dynamic algorithm selection
|
|
127
|
+
|
|
128
|
+
**Implementation:**
|
|
129
|
+
|
|
130
|
+
* `AlgorithmRegistry` - Manages compression algorithms
|
|
131
|
+
* `FilterRegistry` - Manages preprocessing filters
|
|
132
|
+
* `FormatRegistry` - Manages archive formats
|
|
133
|
+
* `ChecksumRegistry` - Manages checksum algorithms
|
|
134
|
+
|
|
135
|
+
**Benefits:**
|
|
136
|
+
|
|
137
|
+
* Easy to add new algorithms without modifying core
|
|
138
|
+
* Runtime algorithm discovery
|
|
139
|
+
* Consistent API across implementations
|
|
140
|
+
* Clean separation of concerns
|
|
141
|
+
|
|
142
|
+
=== Template Method Pattern
|
|
143
|
+
|
|
144
|
+
**Purpose:** Define algorithm interface, let subclasses implement specifics
|
|
145
|
+
|
|
146
|
+
**Implementation:**
|
|
147
|
+
|
|
148
|
+
* `Algorithm` base class defines `compress`, `decompress`, `metadata` interface
|
|
149
|
+
* Subclasses implement specific compression logic
|
|
150
|
+
* Metadata method provides algorithm information
|
|
151
|
+
|
|
152
|
+
**Example:**
|
|
153
|
+
|
|
154
|
+
[source,ruby]
|
|
155
|
+
----
|
|
156
|
+
class Algorithm
|
|
157
|
+
def compress(input, output, options = nil)
|
|
158
|
+
raise NotImplementedError
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def decompress(input, output, options = nil)
|
|
162
|
+
raise NotImplementedError
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def self.metadata
|
|
166
|
+
raise NotImplementedError
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
----
|
|
170
|
+
|
|
171
|
+
=== Strategy Pattern
|
|
172
|
+
|
|
173
|
+
**Purpose:** Interchangeable compression strategies
|
|
174
|
+
|
|
175
|
+
**Implementation:**
|
|
176
|
+
|
|
177
|
+
* Different algorithms (LZMA, Deflate, BZip2) implement same interface
|
|
178
|
+
* User selects strategy via registry: `AlgorithmRegistry.get(:lzma)`
|
|
179
|
+
* Filters can be composed using `FilterPipeline`
|
|
180
|
+
|
|
181
|
+
**Benefits:**
|
|
182
|
+
|
|
183
|
+
* Algorithm selection at runtime
|
|
184
|
+
* Easy to swap algorithms
|
|
185
|
+
* Composition of filters
|
|
186
|
+
|
|
187
|
+
=== Builder Pattern
|
|
188
|
+
|
|
189
|
+
**Purpose:** Construct complex archives step-by-step
|
|
190
|
+
|
|
191
|
+
**Implementation:**
|
|
192
|
+
|
|
193
|
+
* Archive writers allow incremental file addition
|
|
194
|
+
* Options configured via models before execution
|
|
195
|
+
* Clean API for multi-step operations
|
|
196
|
+
|
|
197
|
+
**Example:**
|
|
198
|
+
|
|
199
|
+
[source,ruby]
|
|
200
|
+
----
|
|
201
|
+
writer = Omnizip::Formats::SevenZip::Writer.new('archive.7z')
|
|
202
|
+
writer.algorithm = :lzma2
|
|
203
|
+
writer.level = 9
|
|
204
|
+
writer.add_file('file1.txt')
|
|
205
|
+
writer.add_file('file2.txt')
|
|
206
|
+
writer.close
|
|
207
|
+
----
|
|
208
|
+
|
|
209
|
+
=== Adapter Pattern
|
|
210
|
+
|
|
211
|
+
**Purpose:** Provide rubyzip-compatible interface
|
|
212
|
+
|
|
213
|
+
**Implementation:**
|
|
214
|
+
|
|
215
|
+
* `rubyzip_compat.rb` adapts native API to `Zip::` namespace
|
|
216
|
+
* Allows drop-in replacement for existing rubyzip code
|
|
217
|
+
* Maintains backward compatibility
|
|
218
|
+
|
|
219
|
+
**Benefits:**
|
|
220
|
+
|
|
221
|
+
* Easy migration path
|
|
222
|
+
* No code changes needed for basic operations
|
|
223
|
+
* Gradual adoption possible
|
|
224
|
+
|
|
225
|
+
== The Algorithm Registry
|
|
226
|
+
|
|
227
|
+
=== General
|
|
228
|
+
|
|
229
|
+
The `AlgorithmRegistry` class maintains a global registry of available compression algorithms.
|
|
230
|
+
|
|
231
|
+
=== Registration
|
|
232
|
+
|
|
233
|
+
[source,ruby]
|
|
234
|
+
----
|
|
235
|
+
# Register a new algorithm
|
|
236
|
+
Omnizip::AlgorithmRegistry.register(:lzma, Omnizip::Algorithms::LZMA)
|
|
237
|
+
|
|
238
|
+
# Get an algorithm class
|
|
239
|
+
algorithm_class = Omnizip::AlgorithmRegistry.get(:lzma)
|
|
240
|
+
|
|
241
|
+
# Check if registered
|
|
242
|
+
if Omnizip::AlgorithmRegistry.registered?(:lzma)
|
|
243
|
+
puts "LZMA is available"
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# List all available
|
|
247
|
+
algorithms = Omnizip::AlgorithmRegistry.available
|
|
248
|
+
# => [:lzma, :lzma2, :bzip2, :ppmd7, :ppmd8, :deflate, :deflate64, :zstd]
|
|
249
|
+
----
|
|
250
|
+
|
|
251
|
+
=== Adding New Algorithms
|
|
252
|
+
|
|
253
|
+
To add a new compression algorithm:
|
|
254
|
+
|
|
255
|
+
. Create a class that inherits from `Omnizip::Algorithm`
|
|
256
|
+
. Implement required methods: `compress`, `decompress`, `metadata`
|
|
257
|
+
. Register the algorithm with the registry
|
|
258
|
+
|
|
259
|
+
**Example:**
|
|
260
|
+
|
|
261
|
+
[source,ruby]
|
|
262
|
+
----
|
|
263
|
+
module Omnizip
|
|
264
|
+
module Algorithms
|
|
265
|
+
class MyAlgorithm < Algorithm
|
|
266
|
+
def self.metadata
|
|
267
|
+
Models::AlgorithmMetadata.new.tap do |meta|
|
|
268
|
+
meta.name = "myalgorithm"
|
|
269
|
+
meta.description = "My custom compression algorithm"
|
|
270
|
+
meta.version = "1.0.0"
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def compress(input_stream, output_stream, options = nil)
|
|
275
|
+
# Implement compression logic
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def decompress(input_stream, output_stream, options = nil)
|
|
279
|
+
# Implement decompression logic
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end
|
|
284
|
+
|
|
285
|
+
# Register the algorithm
|
|
286
|
+
Omnizip::AlgorithmRegistry.register(:myalgorithm, Omnizip::Algorithms::MyAlgorithm)
|
|
287
|
+
----
|
|
288
|
+
|
|
289
|
+
== Component Relationships
|
|
290
|
+
|
|
291
|
+
=== Dependency Graph
|
|
292
|
+
|
|
293
|
+
[source]
|
|
294
|
+
----
|
|
295
|
+
CLI → Commands → Formats → Algorithms → Registries
|
|
296
|
+
↓
|
|
297
|
+
Filters → FilterRegistry
|
|
298
|
+
↓
|
|
299
|
+
I/O Layer
|
|
300
|
+
----
|
|
301
|
+
|
|
302
|
+
=== Module Organization
|
|
303
|
+
|
|
304
|
+
**Core Modules:**
|
|
305
|
+
|
|
306
|
+
* `Omnizip::Algorithms::*` - Algorithm implementations
|
|
307
|
+
* `Omnizip::Formats::*` - Archive format handlers
|
|
308
|
+
* `Omnizip::Filters::*` - Preprocessing filters
|
|
309
|
+
* `Omnizip::Models::*` - Data models (Lutaml::Model based)
|
|
310
|
+
* `Omnizip::Checksums::*` - Checksum algorithms
|
|
311
|
+
|
|
312
|
+
**Support Modules:**
|
|
313
|
+
|
|
314
|
+
* `Omnizip::Chunked::*` - Chunked I/O for large files
|
|
315
|
+
* `Omnizip::Progress::*` - Progress tracking
|
|
316
|
+
* `Omnizip::Profiler::*` - Performance profiling
|
|
317
|
+
* `Omnizip::Parallel::*` - Parallel processing
|
|
318
|
+
|
|
319
|
+
== Extension Points
|
|
320
|
+
|
|
321
|
+
=== Adding New Algorithms
|
|
322
|
+
|
|
323
|
+
. Inherit from `Algorithm`
|
|
324
|
+
. Implement `compress`, `decompress`, `metadata`
|
|
325
|
+
. Register with `AlgorithmRegistry.register`
|
|
326
|
+
|
|
327
|
+
=== Adding New Filters
|
|
328
|
+
|
|
329
|
+
. Inherit from `Filters::FilterBase`
|
|
330
|
+
. Implement `encode` and `decode` methods
|
|
331
|
+
. Register with `FilterRegistry.register`
|
|
332
|
+
|
|
333
|
+
=== Adding New Formats
|
|
334
|
+
|
|
335
|
+
. Create reader/writer classes
|
|
336
|
+
. Follow format specification
|
|
337
|
+
. Register with `FormatRegistry`
|
|
338
|
+
|
|
339
|
+
=== Adding New Checksums
|
|
340
|
+
|
|
341
|
+
. Inherit from `Checksums::CrcBase`
|
|
342
|
+
. Implement checksum calculation
|
|
343
|
+
. Register with `ChecksumRegistry`
|
|
344
|
+
|
|
345
|
+
== Performance Considerations
|
|
346
|
+
|
|
347
|
+
=== Pure Ruby Trade-offs
|
|
348
|
+
|
|
349
|
+
**Decision:** Implement everything in pure Ruby without C extensions
|
|
350
|
+
|
|
351
|
+
**Rationale:** Maximum portability across all Ruby platforms
|
|
352
|
+
|
|
353
|
+
**Trade-off:** 10-60x slower than native implementations
|
|
354
|
+
|
|
355
|
+
**Mitigation:** Profile-guided optimization within Ruby bounds
|
|
356
|
+
|
|
357
|
+
=== Bottlenecks (v1.0 baseline)
|
|
358
|
+
|
|
359
|
+
* **BWT (Burrows-Wheeler Transform):** 50-60x slower - CRITICAL
|
|
360
|
+
* **LZMA encoding:** 13-15x slower - acceptable
|
|
361
|
+
* **LZMA decoding:** 8-10x slower - good
|
|
362
|
+
* **Range coder:** 10x slower - excellent
|
|
363
|
+
|
|
364
|
+
=== Optimization Strategies
|
|
365
|
+
|
|
366
|
+
. Profile-guided optimization using `Profiler`
|
|
367
|
+
. Algorithm-specific tuning (e.g., BWT implementation)
|
|
368
|
+
. Memory allocation reduction
|
|
369
|
+
. Hot path optimization
|
|
370
|
+
. Avoid unnecessary object creation
|
|
371
|
+
|
|
372
|
+
== Memory Management
|
|
373
|
+
|
|
374
|
+
=== Chunked Processing
|
|
375
|
+
|
|
376
|
+
For large files (> 100MB), use chunked processing:
|
|
377
|
+
|
|
378
|
+
* `Chunked::Reader` - Read files in chunks
|
|
379
|
+
* `Chunked::Writer` - Write files in chunks
|
|
380
|
+
* `Chunked::MemoryManager` - Track memory usage
|
|
381
|
+
|
|
382
|
+
=== Dictionary Size Configuration
|
|
383
|
+
|
|
384
|
+
Configure dictionary sizes based on available memory:
|
|
385
|
+
|
|
386
|
+
* **LZMA level 1:** 64KB
|
|
387
|
+
* **LZMA level 5:** 4MB (default)
|
|
388
|
+
* **LZMA level 9:** 16MB
|
|
389
|
+
* **PPMd:** Configurable (4MB-256MB)
|
|
390
|
+
|
|
391
|
+
== Testing Architecture
|
|
392
|
+
|
|
393
|
+
=== Test Structure
|
|
394
|
+
|
|
395
|
+
* **Unit Tests:** Individual class/method testing
|
|
396
|
+
* **Integration Tests:** End-to-end workflows
|
|
397
|
+
* **Format Tests:** Archive format compatibility
|
|
398
|
+
|
|
399
|
+
=== Test Principles
|
|
400
|
+
|
|
401
|
+
* **MECE:** Mutually Exclusive, Collectively Exhaustive
|
|
402
|
+
* **No Mocks:** Test real behavior, not test doubles
|
|
403
|
+
* **StringIO:** Use for in-memory testing
|
|
404
|
+
* **Fixtures:** Store in `spec/fixtures/`
|
|
405
|
+
|
|
406
|
+
=== Test Organization
|
|
407
|
+
|
|
408
|
+
[source]
|
|
409
|
+
----
|
|
410
|
+
spec/
|
|
411
|
+
├── omnizip/
|
|
412
|
+
│ ├── algorithms/
|
|
413
|
+
│ │ ├── lzma_spec.rb # Unit tests
|
|
414
|
+
│ │ ├── lzma_integration_spec.rb # Integration
|
|
415
|
+
│ │ └── ...
|
|
416
|
+
│ ├── formats/
|
|
417
|
+
│ │ ├── seven_zip/
|
|
418
|
+
│ │ │ ├── reader_spec.rb
|
|
419
|
+
│ │ │ ├── writer_spec.rb
|
|
420
|
+
│ │ │ └── ...
|
|
421
|
+
│ │ └── ...
|
|
422
|
+
│ └── ...
|
|
423
|
+
└── fixtures/
|
|
424
|
+
├── test_data/
|
|
425
|
+
└── archives/
|
|
426
|
+
----
|
|
427
|
+
|
|
428
|
+
== Code Quality Standards
|
|
429
|
+
|
|
430
|
+
=== RuboCop Configuration
|
|
431
|
+
|
|
432
|
+
* **Max line length:** 80 characters
|
|
433
|
+
* **Max method length:** 50 lines (complex algorithms allowed)
|
|
434
|
+
* **Max class length:** 700 lines (refactor if exceeded)
|
|
435
|
+
* **Indentation:** 2 spaces, no tabs
|
|
436
|
+
|
|
437
|
+
=== Documentation Requirements
|
|
438
|
+
|
|
439
|
+
* All public methods must have YARD documentation
|
|
440
|
+
* Complex algorithms need detailed comments
|
|
441
|
+
* README sections for all major features
|
|
442
|
+
* Examples for common use cases
|
|
443
|
+
|
|
444
|
+
== See Also
|
|
445
|
+
|
|
446
|
+
* link:api-usage.adoc[Library API Usage]
|
|
447
|
+
* link:compression-algorithms.adoc[Compression Algorithms]
|
|
448
|
+
* link:preprocessing-filters.adoc[Preprocessing Filters]
|
|
449
|
+
* link:../README.adoc[Main README]
|