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,137 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
|
|
5
|
+
module Benchmark
|
|
6
|
+
# Generates test data files for benchmarking compression algorithms
|
|
7
|
+
class TestData
|
|
8
|
+
LOREM_IPSUM = <<~TEXT
|
|
9
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
|
|
10
|
+
eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
|
|
11
|
+
enim ad minim veniam, quis nostrud exercitation ullamco laboris
|
|
12
|
+
nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
|
|
13
|
+
in reprehenderit in voluptate velit esse cillum dolore eu fugiat
|
|
14
|
+
nulla pariatur. Excepteur sint occaecat cupidatat non proident,
|
|
15
|
+
sunt in culpa qui officia deserunt mollit anim id est laborum.
|
|
16
|
+
TEXT
|
|
17
|
+
|
|
18
|
+
attr_reader :data_dir
|
|
19
|
+
|
|
20
|
+
def initialize(data_dir = "benchmark/data")
|
|
21
|
+
@data_dir = data_dir
|
|
22
|
+
FileUtils.mkdir_p(@data_dir)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def generate_text(size, filename: "text.txt")
|
|
26
|
+
path = File.join(data_dir, filename)
|
|
27
|
+
content = generate_lorem_text(size)
|
|
28
|
+
File.binwrite(path, content)
|
|
29
|
+
path
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def generate_source_code(size, filename: "source.rb")
|
|
33
|
+
path = File.join(data_dir, filename)
|
|
34
|
+
content = generate_ruby_source(size)
|
|
35
|
+
File.binwrite(path, content)
|
|
36
|
+
path
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def generate_repetitive(size, filename: "repetitive.bin")
|
|
40
|
+
path = File.join(data_dir, filename)
|
|
41
|
+
pattern = "ABCDEFGH" * 32
|
|
42
|
+
content = (pattern * ((size / pattern.bytesize) + 1))[0, size]
|
|
43
|
+
File.binwrite(path, content)
|
|
44
|
+
path
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def generate_random(size, filename: "random.bin")
|
|
48
|
+
path = File.join(data_dir, filename)
|
|
49
|
+
content = Random.bytes(size)
|
|
50
|
+
File.binwrite(path, content)
|
|
51
|
+
path
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def generate_multimedia(size, filename: "multimedia.bin")
|
|
55
|
+
path = File.join(data_dir, filename)
|
|
56
|
+
content = generate_gradient_data(size)
|
|
57
|
+
File.binwrite(path, content)
|
|
58
|
+
path
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def cleanup
|
|
62
|
+
FileUtils.rm_rf(data_dir)
|
|
63
|
+
FileUtils.mkdir_p(data_dir)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def generate_lorem_text(size)
|
|
69
|
+
paragraphs = []
|
|
70
|
+
current_size = 0
|
|
71
|
+
|
|
72
|
+
while current_size < size
|
|
73
|
+
paragraphs << LOREM_IPSUM
|
|
74
|
+
current_size += LOREM_IPSUM.bytesize
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
paragraphs.join("\n\n")[0, size]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def generate_ruby_source(size)
|
|
81
|
+
code = <<~RUBY
|
|
82
|
+
# frozen_string_literal: true
|
|
83
|
+
|
|
84
|
+
module Example
|
|
85
|
+
class DataProcessor
|
|
86
|
+
attr_reader :data
|
|
87
|
+
|
|
88
|
+
def initialize(data)
|
|
89
|
+
@data = data
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def process
|
|
93
|
+
data.map { |item| transform(item) }
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def transform(item)
|
|
97
|
+
item.upcase.reverse
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def filter(predicate)
|
|
101
|
+
data.select { |item| predicate.call(item) }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def aggregate
|
|
105
|
+
data.inject(0) { |sum, item| sum + item.length }
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
RUBY
|
|
110
|
+
|
|
111
|
+
lines = []
|
|
112
|
+
current_size = 0
|
|
113
|
+
|
|
114
|
+
counter = 0
|
|
115
|
+
while current_size < size
|
|
116
|
+
lines << code
|
|
117
|
+
counter += 1
|
|
118
|
+
lines << "\n# Generated code block #{counter}\n"
|
|
119
|
+
current_size = lines.join.bytesize
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
lines.join[0, size]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def generate_gradient_data(size)
|
|
126
|
+
data = []
|
|
127
|
+
step = 256.0 / [size, 256].min
|
|
128
|
+
|
|
129
|
+
size.times do |i|
|
|
130
|
+
value = ((i * step) % 256).to_i
|
|
131
|
+
data << value.chr
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
data.join
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# RAR v3 Format Specification
|
|
2
|
+
# Based on RAR 3.x archive format
|
|
3
|
+
|
|
4
|
+
format:
|
|
5
|
+
name: "RAR3"
|
|
6
|
+
version: "3.0"
|
|
7
|
+
extension: ".rar"
|
|
8
|
+
|
|
9
|
+
# RAR 3.x signature: "Rar!\x1A\x07\x00"
|
|
10
|
+
magic_bytes: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00]
|
|
11
|
+
|
|
12
|
+
block_types:
|
|
13
|
+
marker: 0x72 # Archive marker block
|
|
14
|
+
archive: 0x73 # Archive header block
|
|
15
|
+
file: 0x74 # File header block
|
|
16
|
+
comment: 0x75 # Comment header block
|
|
17
|
+
old_auth: 0x76 # Old-style authentication block
|
|
18
|
+
old_subblock: 0x77 # Old-style subblock
|
|
19
|
+
recovery: 0x78 # Recovery record block
|
|
20
|
+
auth: 0x79 # Authentication block
|
|
21
|
+
subblock: 0x7A # Subblock
|
|
22
|
+
terminator: 0x7B # Archive end block
|
|
23
|
+
|
|
24
|
+
archive_flags:
|
|
25
|
+
volume: 0x0001 # Archive volume
|
|
26
|
+
comment: 0x0002 # Archive comment present
|
|
27
|
+
lock: 0x0004 # Archive locked
|
|
28
|
+
solid: 0x0008 # Solid archive
|
|
29
|
+
new_naming: 0x0010 # New volume naming scheme
|
|
30
|
+
auth_info: 0x0020 # Authenticity information present
|
|
31
|
+
recovery: 0x0040 # Recovery record present
|
|
32
|
+
encrypted: 0x0080 # Block headers encrypted
|
|
33
|
+
first_volume: 0x0100 # First volume
|
|
34
|
+
|
|
35
|
+
file_flags:
|
|
36
|
+
split_before: 0x0001 # File continued from previous volume
|
|
37
|
+
split_after: 0x0002 # File continued in next volume
|
|
38
|
+
encrypted: 0x0004 # File encrypted
|
|
39
|
+
comment: 0x0008 # File comment present
|
|
40
|
+
solid: 0x0010 # Information from previous files used
|
|
41
|
+
dictionary_mask: 0x00E0 # Dictionary size (bits 5-7)
|
|
42
|
+
large_file: 0x0100 # file64 operations
|
|
43
|
+
unicode: 0x0200 # Filename is Unicode
|
|
44
|
+
salt: 0x0400 # Salt present
|
|
45
|
+
version: 0x0800 # Version flag
|
|
46
|
+
ext_time: 0x1000 # Extended time field present
|
|
47
|
+
ext_flags: 0x2000 # Extended flags field
|
|
48
|
+
|
|
49
|
+
compression_methods:
|
|
50
|
+
store: 0x30 # No compression
|
|
51
|
+
fastest: 0x31 # Fastest compression
|
|
52
|
+
fast: 0x32 # Fast compression
|
|
53
|
+
normal: 0x33 # Normal compression
|
|
54
|
+
good: 0x34 # Good compression
|
|
55
|
+
best: 0x35 # Best compression
|
|
56
|
+
|
|
57
|
+
host_os:
|
|
58
|
+
msdos: 0 # MS DOS
|
|
59
|
+
os2: 1 # OS/2
|
|
60
|
+
win32: 2 # Windows
|
|
61
|
+
unix: 3 # Unix
|
|
62
|
+
macos: 4 # Mac OS
|
|
63
|
+
beos: 5 # BeOS
|
|
64
|
+
|
|
65
|
+
dictionary_sizes:
|
|
66
|
+
64k: 0 # 64 KB
|
|
67
|
+
128k: 1 # 128 KB
|
|
68
|
+
256k: 2 # 256 KB
|
|
69
|
+
512k: 3 # 512 KB
|
|
70
|
+
1024k: 4 # 1024 KB (1 MB)
|
|
71
|
+
2048k: 5 # 2048 KB (2 MB)
|
|
72
|
+
4096k: 6 # 4096 KB (4 MB)
|
|
73
|
+
auto: 7 # Auto-detect
|
|
74
|
+
|
|
75
|
+
encryption:
|
|
76
|
+
supported: true
|
|
77
|
+
algorithms:
|
|
78
|
+
- aes128
|
|
79
|
+
- aes256
|
|
80
|
+
key_derivation: pbkdf2
|
|
81
|
+
salt_size: 8
|
|
82
|
+
|
|
83
|
+
features:
|
|
84
|
+
recovery_records: true
|
|
85
|
+
solid_archives: true
|
|
86
|
+
multivolume: true
|
|
87
|
+
file_comments: true
|
|
88
|
+
archive_comments: true
|
|
89
|
+
unicode_filenames: true
|
|
90
|
+
large_files: true # > 4 GB
|
|
91
|
+
extended_timestamps: true
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# RAR v5 Format Specification
|
|
2
|
+
# Based on RAR 5.x archive format
|
|
3
|
+
|
|
4
|
+
format:
|
|
5
|
+
name: "RAR5"
|
|
6
|
+
version: "5.0"
|
|
7
|
+
extension: ".rar"
|
|
8
|
+
|
|
9
|
+
# RAR 5.x signature: "Rar!\x1A\x07\x01\x00"
|
|
10
|
+
magic_bytes: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x01, 0x00]
|
|
11
|
+
|
|
12
|
+
block_types:
|
|
13
|
+
main_header: 0x01 # Main archive header
|
|
14
|
+
file_header: 0x02 # File header
|
|
15
|
+
service_header: 0x03 # Service header
|
|
16
|
+
encryption_header: 0x04 # Archive encryption header
|
|
17
|
+
end_marker: 0x05 # End of archive marker
|
|
18
|
+
|
|
19
|
+
main_header_flags:
|
|
20
|
+
volume: 0x0001 # Archive is volume
|
|
21
|
+
volume_number: 0x0002 # Volume number field present
|
|
22
|
+
solid: 0x0004 # Solid archive
|
|
23
|
+
recovery: 0x0008 # Recovery record present
|
|
24
|
+
locked: 0x0010 # Archive locked
|
|
25
|
+
|
|
26
|
+
file_header_flags:
|
|
27
|
+
directory: 0x0001 # Entry is a directory
|
|
28
|
+
time_present: 0x0002 # Time field present
|
|
29
|
+
crc32_present: 0x0004 # CRC32 field present
|
|
30
|
+
unpacked_size_unknown: 0x0008 # Unpacked size is unknown
|
|
31
|
+
|
|
32
|
+
encryption_flags:
|
|
33
|
+
password_check: 0x0001 # Check password present
|
|
34
|
+
use_mac: 0x0002 # Use MAC
|
|
35
|
+
|
|
36
|
+
compression_methods:
|
|
37
|
+
store: 0 # No compression
|
|
38
|
+
fastest: 1 # Fastest compression
|
|
39
|
+
fast: 2 # Fast compression
|
|
40
|
+
normal: 3 # Normal compression
|
|
41
|
+
good: 4 # Good compression
|
|
42
|
+
best: 5 # Best compression (maximum)
|
|
43
|
+
|
|
44
|
+
# RAR 5 uses BLAKE2sp for checksums
|
|
45
|
+
checksum:
|
|
46
|
+
algorithm: blake2sp
|
|
47
|
+
size: 32 # bytes
|
|
48
|
+
|
|
49
|
+
host_os:
|
|
50
|
+
windows: 0 # Windows
|
|
51
|
+
unix: 1 # Unix/Linux
|
|
52
|
+
|
|
53
|
+
dictionary_sizes:
|
|
54
|
+
128k: 0 # 128 KB
|
|
55
|
+
256k: 1 # 256 KB
|
|
56
|
+
512k: 2 # 512 KB
|
|
57
|
+
1024k: 3 # 1024 KB (1 MB)
|
|
58
|
+
2048k: 4 # 2048 KB (2 MB)
|
|
59
|
+
4096k: 5 # 4096 KB (4 MB)
|
|
60
|
+
8192k: 6 # 8192 KB (8 MB)
|
|
61
|
+
16384k: 7 # 16384 KB (16 MB)
|
|
62
|
+
32768k: 8 # 32768 KB (32 MB)
|
|
63
|
+
65536k: 9 # 65536 KB (64 MB)
|
|
64
|
+
131072k: 10 # 131072 KB (128 MB)
|
|
65
|
+
262144k: 11 # 262144 KB (256 MB)
|
|
66
|
+
524288k: 12 # 524288 KB (512 MB)
|
|
67
|
+
1048576k: 13 # 1048576 KB (1024 MB / 1 GB)
|
|
68
|
+
|
|
69
|
+
encryption:
|
|
70
|
+
supported: true
|
|
71
|
+
algorithms:
|
|
72
|
+
- aes256
|
|
73
|
+
key_derivation: pbkdf2
|
|
74
|
+
kdf_iterations: 262144 # PBKDF2 iterations
|
|
75
|
+
salt_size: 16 # bytes
|
|
76
|
+
|
|
77
|
+
compression_features:
|
|
78
|
+
solid_archives: true
|
|
79
|
+
multivolume: true
|
|
80
|
+
recovery_records: true
|
|
81
|
+
unicode_filenames: true # UTF-8 encoding
|
|
82
|
+
large_files: true # No size limitations
|
|
83
|
+
extended_timestamps: true
|
|
84
|
+
64bit_sizes: true
|
|
85
|
+
|
|
86
|
+
# RAR 5 specific features
|
|
87
|
+
advanced_features:
|
|
88
|
+
blake2_checksums: true
|
|
89
|
+
improved_compression: true
|
|
90
|
+
better_unicode: true
|
|
91
|
+
optional_crc32: true
|
|
92
|
+
extended_time_format: true
|
|
93
|
+
|
|
94
|
+
# Extra record types
|
|
95
|
+
extra_records:
|
|
96
|
+
encryption: 0x01
|
|
97
|
+
hash: 0x02
|
|
98
|
+
time: 0x03
|
|
99
|
+
version: 0x04
|
|
100
|
+
redirection: 0x05
|
|
101
|
+
owner: 0x06
|
|
102
|
+
service: 0x07
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
name: Documentation
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- main
|
|
7
|
+
- master
|
|
8
|
+
paths:
|
|
9
|
+
- 'docs/**'
|
|
10
|
+
- '.github/workflows/docs.yml'
|
|
11
|
+
pull_request:
|
|
12
|
+
paths:
|
|
13
|
+
- 'docs/**'
|
|
14
|
+
- '.github/workflows/docs.yml'
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
build:
|
|
18
|
+
name: Build Jekyll Site
|
|
19
|
+
runs-on: ubuntu-latest
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout repository
|
|
23
|
+
uses: actions/checkout@v4
|
|
24
|
+
|
|
25
|
+
- name: Setup Ruby
|
|
26
|
+
uses: ruby/setup-ruby@v1
|
|
27
|
+
with:
|
|
28
|
+
ruby-version: '3.2'
|
|
29
|
+
bundler-cache: false
|
|
30
|
+
|
|
31
|
+
- name: Cache dependencies
|
|
32
|
+
uses: actions/cache@v4
|
|
33
|
+
with:
|
|
34
|
+
path: docs/vendor/bundle
|
|
35
|
+
key: ${{ runner.os }}-gems-${{ hashFiles('docs/Gemfile.lock') }}
|
|
36
|
+
restore-keys: |
|
|
37
|
+
${{ runner.os }}-gems-
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: |
|
|
41
|
+
cd docs
|
|
42
|
+
bundle config path vendor/bundle
|
|
43
|
+
bundle install --jobs 4 --retry 3
|
|
44
|
+
|
|
45
|
+
- name: Build Jekyll site
|
|
46
|
+
run: |
|
|
47
|
+
cd docs
|
|
48
|
+
bundle exec jekyll build --trace
|
|
49
|
+
env:
|
|
50
|
+
JEKYLL_ENV: production
|
|
51
|
+
|
|
52
|
+
- name: Upload build artifact
|
|
53
|
+
uses: actions/upload-artifact@v4
|
|
54
|
+
with:
|
|
55
|
+
name: site
|
|
56
|
+
path: docs/_site
|
|
57
|
+
retention-days: 7
|
|
58
|
+
|
|
59
|
+
link-check:
|
|
60
|
+
name: Check Links
|
|
61
|
+
runs-on: ubuntu-latest
|
|
62
|
+
needs: build
|
|
63
|
+
continue-on-error: true
|
|
64
|
+
|
|
65
|
+
steps:
|
|
66
|
+
- name: Checkout repository
|
|
67
|
+
uses: actions/checkout@v4
|
|
68
|
+
|
|
69
|
+
- name: Download build artifact
|
|
70
|
+
uses: actions/download-artifact@v4
|
|
71
|
+
with:
|
|
72
|
+
name: site
|
|
73
|
+
path: docs/_site
|
|
74
|
+
|
|
75
|
+
- name: Install lychee
|
|
76
|
+
run: |
|
|
77
|
+
curl -sSL https://github.com/lycheeverse/lychee/releases/download/lychee-v0.22.0/lychee-x86_64-unknown-linux-gnu.tar.gz | tar -xz
|
|
78
|
+
sudo mv lychee /usr/local/bin/
|
|
79
|
+
|
|
80
|
+
- name: Run link checker
|
|
81
|
+
run: |
|
|
82
|
+
cd docs
|
|
83
|
+
lychee --config .lychee.toml _site --format markdown --output lychee-report.md
|
|
84
|
+
continue-on-error: true
|
|
85
|
+
|
|
86
|
+
- name: Display link check summary
|
|
87
|
+
if: always()
|
|
88
|
+
run: |
|
|
89
|
+
cd docs
|
|
90
|
+
if [ -f lychee-report.md ]; then
|
|
91
|
+
echo "## Link Check Results" >> $GITHUB_STEP_SUMMARY
|
|
92
|
+
cat lychee-report.md >> $GITHUB_STEP_SUMMARY
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
- name: Check for broken links
|
|
96
|
+
run: |
|
|
97
|
+
cd docs
|
|
98
|
+
lychee --config .lychee.toml _site
|
|
99
|
+
|
|
100
|
+
validate-structure:
|
|
101
|
+
name: Validate Documentation Structure
|
|
102
|
+
runs-on: ubuntu-latest
|
|
103
|
+
|
|
104
|
+
steps:
|
|
105
|
+
- name: Checkout repository
|
|
106
|
+
uses: actions/checkout@v4
|
|
107
|
+
|
|
108
|
+
- name: Check for required files
|
|
109
|
+
run: |
|
|
110
|
+
cd docs
|
|
111
|
+
required_files=(
|
|
112
|
+
"index.adoc"
|
|
113
|
+
"README.md"
|
|
114
|
+
"_config.yml"
|
|
115
|
+
"Gemfile"
|
|
116
|
+
".lychee.toml"
|
|
117
|
+
)
|
|
118
|
+
missing_files=()
|
|
119
|
+
for file in "${required_files[@]}"; do
|
|
120
|
+
if [ ! -f "$file" ]; then
|
|
121
|
+
missing_files+=("$file")
|
|
122
|
+
fi
|
|
123
|
+
done
|
|
124
|
+
if [ ${#missing_files[@]} -gt 0 ]; then
|
|
125
|
+
echo "Missing required files:"
|
|
126
|
+
printf '%s\n' "${missing_files[@]}"
|
|
127
|
+
exit 1
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
summary:
|
|
131
|
+
name: Build Summary
|
|
132
|
+
runs-on: ubuntu-latest
|
|
133
|
+
needs: [build, link-check, validate-structure]
|
|
134
|
+
if: always()
|
|
135
|
+
|
|
136
|
+
steps:
|
|
137
|
+
- name: Generate summary
|
|
138
|
+
run: |
|
|
139
|
+
echo "## Documentation Build Summary" >> $GITHUB_STEP_SUMMARY
|
|
140
|
+
echo "Jekyll build completed" >> $GITHUB_STEP_SUMMARY
|
|
141
|
+
echo "Link validation completed" >> $GITHUB_STEP_SUMMARY
|
|
142
|
+
echo "Structure validation completed" >> $GITHUB_STEP_SUMMARY
|
data/docs/.gitignore
ADDED
data/docs/.lychee.toml
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Lychee link checker configuration for Omnizip documentation
|
|
2
|
+
|
|
3
|
+
# Check all links recursively
|
|
4
|
+
include_verbatim = false
|
|
5
|
+
|
|
6
|
+
# Follow redirects
|
|
7
|
+
max_redirects = 5
|
|
8
|
+
|
|
9
|
+
# Timeout for requests (seconds)
|
|
10
|
+
timeout = 30
|
|
11
|
+
|
|
12
|
+
# Number of concurrent requests
|
|
13
|
+
max_concurrency = 10
|
|
14
|
+
|
|
15
|
+
# Accept HTTP status codes
|
|
16
|
+
accept = [200, 201, 204, 206, 301, 302, 303, 304, 307, 308]
|
|
17
|
+
|
|
18
|
+
# Retry failed requests
|
|
19
|
+
max_retries = 3
|
|
20
|
+
|
|
21
|
+
# User agent string
|
|
22
|
+
user_agent = "lychee/omnizip-docs"
|
|
23
|
+
|
|
24
|
+
# Exclude patterns (use regex syntax)
|
|
25
|
+
exclude = [
|
|
26
|
+
# Exclude localhost and example URLs
|
|
27
|
+
"http://localhost.*",
|
|
28
|
+
"http://127\\.0\\.0\\.1.*",
|
|
29
|
+
"http://example\\.com.*",
|
|
30
|
+
"https://example\\.com.*",
|
|
31
|
+
|
|
32
|
+
# Exclude email addresses
|
|
33
|
+
"mailto:.*",
|
|
34
|
+
|
|
35
|
+
# Exclude same-page anchors (handled by Jekyll/AsciiDoc)
|
|
36
|
+
"^#.*",
|
|
37
|
+
|
|
38
|
+
# Exclude common placeholder URLs
|
|
39
|
+
"http://www\\.example\\.com.*",
|
|
40
|
+
"https://www\\.example\\.com.*",
|
|
41
|
+
|
|
42
|
+
# Exclude GitHub edit links (these are templates)
|
|
43
|
+
".*/edit/.*",
|
|
44
|
+
|
|
45
|
+
# Exclude all internal site links - they work on deployed site
|
|
46
|
+
# but fail when checking local files due to baseurl path issues
|
|
47
|
+
"https?://metanorma\\.github\\.io/omnizip/.*",
|
|
48
|
+
|
|
49
|
+
# Exclude root-relative links with baseurl (local checking issue)
|
|
50
|
+
# These work when deployed but fail on local file system checks
|
|
51
|
+
"^/omnizip/.*"
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
# Cache responses to avoid repeated checks
|
|
55
|
+
cache = true
|
|
56
|
+
|
|
57
|
+
# Only check unique links
|
|
58
|
+
no_progress = true
|
|
59
|
+
|
|
60
|
+
# Check HTTPS certificates
|
|
61
|
+
insecure = false
|
|
62
|
+
|
|
63
|
+
# Scheme (http, https, file)
|
|
64
|
+
scheme = ["https", "http"]
|
|
65
|
+
|
|
66
|
+
# Don't fail on missing local files
|
|
67
|
+
skip_missing = true
|
data/docs/Gemfile
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# RAR Write Support Documentation
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
The key distinction:
|
|
6
|
+
|
|
7
|
+
RAR format structure = Publicly documented, implementable ✅
|
|
8
|
+
WinRAR's specific compression = Proprietary ❌
|
|
9
|
+
|
|
10
|
+
## Important Licensing Information
|
|
11
|
+
|
|
12
|
+
WinRAR is owned by Alexander Roshal and RARLAB. Creating RAR archives using WinRAR requires:
|
|
13
|
+
|
|
14
|
+
1. **A valid WinRAR license** - Purchase from https://www.rarlab.com/
|
|
15
|
+
2. **WinRAR installation** - The command-line tool must be installed
|
|
16
|
+
|
|
17
|
+
RAR format structure = Publicly documented, implementable ✅
|
|
18
|
+
WinRAR's specific compression = Proprietary ❌
|
|
19
|
+
|
|
20
|
+
### Why Not Built-In?
|
|
21
|
+
|
|
22
|
+
Unlike formats such as ZIP, 7z, TAR, etc., there is a confusion that RAR compression cannot be implemented freely due to:
|
|
23
|
+
|
|
24
|
+
- Proprietary algorithm patents: but there are NO patents on RAR compression algorithms
|
|
25
|
+
- Licensing restrictions from RARLAB: the RAR format structure is publicly documented, implementable, and already implemented independently in libarchive which is fully open source.
|
|
26
|
+
- Legal risks of reverse engineering: the RAR format structure is documented and does not require reverse engineering.
|
data/docs/README.md
ADDED
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# Omnizip Documentation
|
|
2
|
+
|
|
3
|
+
This directory contains the documentation site for Omnizip, built with [Jekyll](https://jekyllrb.com/) and the [Just the Docs](https://just-the-docs.github.io/just-the-docs/) theme.
|
|
4
|
+
|
|
5
|
+
## Building the Documentation Site
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
|
|
9
|
+
- Ruby 3.0 or higher
|
|
10
|
+
- Bundler
|
|
11
|
+
|
|
12
|
+
### Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
cd docs
|
|
16
|
+
bundle install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Building
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
bundle exec jekyll build
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The built site will be in the `_site` directory.
|
|
26
|
+
|
|
27
|
+
### Serving Locally
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
bundle exec jekyll serve
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then open http://localhost:4000/omnizip/ in your browser.
|
|
34
|
+
|
|
35
|
+
## Documentation Structure
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
docs/
|
|
39
|
+
├── index.adoc # Home page
|
|
40
|
+
├── getting-started/ # Installation and quick start guides
|
|
41
|
+
├── guides/ # Comprehensive usage guides
|
|
42
|
+
│ ├── basic-usage/ # Basic operations
|
|
43
|
+
│ ├── advanced-usage/ # Advanced features
|
|
44
|
+
│ ├── compression-algorithms/ # Algorithm documentation
|
|
45
|
+
│ ├── archive-formats/ # Format documentation
|
|
46
|
+
│ └── filters/ # Filter documentation
|
|
47
|
+
├── reference/ # Technical reference
|
|
48
|
+
│ ├── cli/ # CLI documentation
|
|
49
|
+
│ └── api/ # Ruby API documentation
|
|
50
|
+
├── resources/ # Additional resources
|
|
51
|
+
├── concepts/ # Core concepts
|
|
52
|
+
├── developer/ # Development documentation
|
|
53
|
+
├── examples/ # Usage examples
|
|
54
|
+
└── troubleshooting/ # Troubleshooting guides
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Writing Documentation
|
|
58
|
+
|
|
59
|
+
Documentation is written in [AsciiDoc](https://asciidoctor.org/) format. Each page should start with YAML front matter:
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
---
|
|
63
|
+
title: Page Title
|
|
64
|
+
nav_order: 1
|
|
65
|
+
---
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Linking
|
|
69
|
+
|
|
70
|
+
Use AsciiDoc link syntax:
|
|
71
|
+
|
|
72
|
+
- Internal link: `link:path/to/page.adoc[Link text]`
|
|
73
|
+
- External link: `https://example.com[Link text]`
|
|
74
|
+
|
|
75
|
+
### Code Blocks
|
|
76
|
+
|
|
77
|
+
Use source code blocks with syntax highlighting:
|
|
78
|
+
|
|
79
|
+
```asciidoc
|
|
80
|
+
[source,ruby]
|
|
81
|
+
----
|
|
82
|
+
require 'omnizip'
|
|
83
|
+
----
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Checking Links
|
|
87
|
+
|
|
88
|
+
The documentation site includes a link checker using [lychee](https://github.com/lycheeverse/lychee). To check links:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# Install lychee
|
|
92
|
+
cargo install lychee
|
|
93
|
+
|
|
94
|
+
# Run link checker
|
|
95
|
+
cd docs
|
|
96
|
+
lychee --config .lychee.toml _site
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## License
|
|
100
|
+
|
|
101
|
+
Copyright 2025 Ribose Inc.
|