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,256 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Architecture
|
|
3
|
+
nav_order: 90
|
|
4
|
+
parent: Developer Guide
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
== Architecture
|
|
8
|
+
|
|
9
|
+
Omnizip's system design and component relationships.
|
|
10
|
+
|
|
11
|
+
=== Overview Diagram
|
|
12
|
+
|
|
13
|
+
[source]
|
|
14
|
+
----
|
|
15
|
+
Omnizip Library
|
|
16
|
+
|
|
|
17
|
+
+-----------------+-----------------+
|
|
18
|
+
| | |
|
|
19
|
+
Registries Algorithms Formats
|
|
20
|
+
| | |
|
|
21
|
+
+---+---+ +---+---+ +---+---+
|
|
22
|
+
| | | | | |
|
|
23
|
+
Alg. Filter LZMA BZip2 7z ZIP
|
|
24
|
+
Reg. Reg. LZMA2 PPMd RAR TAR
|
|
25
|
+
Deflate Zstd ISO GZIP
|
|
26
|
+
CPIO XZ
|
|
27
|
+
BZIP2
|
|
28
|
+
----
|
|
29
|
+
|
|
30
|
+
=== Registry Pattern
|
|
31
|
+
|
|
32
|
+
All components use a registry pattern for extensibility:
|
|
33
|
+
|
|
34
|
+
[source,ruby]
|
|
35
|
+
----
|
|
36
|
+
# Base registry class
|
|
37
|
+
module Omnizip
|
|
38
|
+
class Registry
|
|
39
|
+
def initialize
|
|
40
|
+
@registry = {}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def register(name, klass)
|
|
44
|
+
@registry[name] = klass
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def get(name)
|
|
48
|
+
@registry[name] || raise(NotFoundError, name)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def registered
|
|
52
|
+
@registry.keys
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Algorithm registry
|
|
58
|
+
AlgorithmRegistry = Registry.new
|
|
59
|
+
|
|
60
|
+
# Filter registry
|
|
61
|
+
FilterRegistry = Registry.new
|
|
62
|
+
|
|
63
|
+
# Format registry
|
|
64
|
+
FormatRegistry = Registry.new
|
|
65
|
+
----
|
|
66
|
+
|
|
67
|
+
=== Algorithm Architecture
|
|
68
|
+
|
|
69
|
+
Compression algorithms implement a common interface:
|
|
70
|
+
|
|
71
|
+
[source,ruby]
|
|
72
|
+
----
|
|
73
|
+
module Omnizip
|
|
74
|
+
module Algorithms
|
|
75
|
+
class Base
|
|
76
|
+
def initialize(options = {})
|
|
77
|
+
@options = options
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def compress(input, output)
|
|
81
|
+
raise NotImplementedError
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def decompress(input, output)
|
|
85
|
+
raise NotImplementedError
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Example: LZMA2
|
|
92
|
+
module Algorithms
|
|
93
|
+
class LZMA2 < Base
|
|
94
|
+
def compress(input, output)
|
|
95
|
+
# LZMA2 compression implementation
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def decompress(input, output)
|
|
99
|
+
# LZMA2 decompression implementation
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
----
|
|
104
|
+
|
|
105
|
+
=== Format Architecture
|
|
106
|
+
|
|
107
|
+
Archive formats implement reader/writer interfaces:
|
|
108
|
+
|
|
109
|
+
[source,ruby]
|
|
110
|
+
----
|
|
111
|
+
module Omnizip
|
|
112
|
+
module Formats
|
|
113
|
+
module SevenZip
|
|
114
|
+
class Reader
|
|
115
|
+
def initialize(filename)
|
|
116
|
+
@filename = filename
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def open
|
|
120
|
+
# Open archive
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def each_file
|
|
124
|
+
# Yield archive entries
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def extract_all(output_dir)
|
|
128
|
+
# Extract all files
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def close
|
|
132
|
+
# Close archive
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
class Writer
|
|
137
|
+
def initialize(filename, options = {})
|
|
138
|
+
@filename = filename
|
|
139
|
+
@options = options
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def add_file(path)
|
|
143
|
+
# Add file to archive
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def add_directory(path)
|
|
147
|
+
# Add directory to archive
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def close
|
|
151
|
+
# Write and close archive
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
----
|
|
158
|
+
|
|
159
|
+
=== Component Relationships
|
|
160
|
+
|
|
161
|
+
==== Compression Flow
|
|
162
|
+
|
|
163
|
+
[source,ruby]
|
|
164
|
+
----
|
|
165
|
+
# User API call
|
|
166
|
+
Omnizip.compress_file('input.txt', 'output.lzma',
|
|
167
|
+
algorithm: :lzma2,
|
|
168
|
+
level: 9
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# Resolves to:
|
|
172
|
+
# 1. Get algorithm from registry
|
|
173
|
+
algorithm = AlgorithmRegistry.get(:lzma2).new(level: 9)
|
|
174
|
+
|
|
175
|
+
# 2. Open files
|
|
176
|
+
File.open('input.txt', 'rb') do |input|
|
|
177
|
+
File.open('output.lzma', 'wb') do |output|
|
|
178
|
+
# 3. Compress
|
|
179
|
+
algorithm.compress(input, output)
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
----
|
|
183
|
+
|
|
184
|
+
==== Archive Creation Flow
|
|
185
|
+
|
|
186
|
+
[source,ruby]
|
|
187
|
+
----
|
|
188
|
+
# User API call
|
|
189
|
+
writer = Formats::SevenZip::Writer.new('archive.7z',
|
|
190
|
+
algorithm: :lzma2,
|
|
191
|
+
level: 7
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
# Resolves to:
|
|
195
|
+
# 1. Get algorithm
|
|
196
|
+
algorithm = AlgorithmRegistry.get(:lzma2).new(level: 7)
|
|
197
|
+
|
|
198
|
+
# 2. Apply filters (if any)
|
|
199
|
+
filters = options[:filters].map do |name|
|
|
200
|
+
FilterRegistry.get(name).new
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# 3. For each added file:
|
|
204
|
+
# a. Apply filters
|
|
205
|
+
# b. Compress with algorithm
|
|
206
|
+
# c. Write to archive
|
|
207
|
+
|
|
208
|
+
writer.add_file('document.txt')
|
|
209
|
+
writer.close
|
|
210
|
+
----
|
|
211
|
+
|
|
212
|
+
### Design Principles
|
|
213
|
+
|
|
214
|
+
==== Object-Oriented
|
|
215
|
+
|
|
216
|
+
All components use proper OOP:
|
|
217
|
+
|
|
218
|
+
* Encapsulation of state and behavior
|
|
219
|
+
* Inheritance for shared functionality
|
|
220
|
+
* Polymorphism for extensibility
|
|
221
|
+
|
|
222
|
+
==== Separation of Concerns
|
|
223
|
+
|
|
224
|
+
Each component has single responsibility:
|
|
225
|
+
|
|
226
|
+
* **Algorithms** - Compression/decompression only
|
|
227
|
+
* **Formats** - Archive structure only
|
|
228
|
+
* **Filters** - Preprocessing only
|
|
229
|
+
* **Checksums** - Integrity verification only
|
|
230
|
+
|
|
231
|
+
==== Extensibility
|
|
232
|
+
|
|
233
|
+
Easy to add new components:
|
|
234
|
+
|
|
235
|
+
[source,ruby]
|
|
236
|
+
----
|
|
237
|
+
# Add custom algorithm
|
|
238
|
+
class MyAlgorithm < Omnizip::Algorithms::Base
|
|
239
|
+
def compress(input, output)
|
|
240
|
+
# Custom compression
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
Omnizip::AlgorithmRegistry.register(:myalgo, MyAlgorithm)
|
|
245
|
+
|
|
246
|
+
# Use immediately
|
|
247
|
+
Omnizip.compress_file('input.txt', 'output.my',
|
|
248
|
+
algorithm: :myalgo
|
|
249
|
+
)
|
|
250
|
+
----
|
|
251
|
+
|
|
252
|
+
### See Also
|
|
253
|
+
|
|
254
|
+
* link:../concepts/[Core Concepts]
|
|
255
|
+
* link:contributing[Contributing Guide]
|
|
256
|
+
* link:../guides/[Usage Guides]
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Contributing
|
|
3
|
+
nav_order: 86
|
|
4
|
+
parent: Developer Guide
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
== Contributing
|
|
8
|
+
|
|
9
|
+
Thank you for considering contributing to Omnizip!
|
|
10
|
+
|
|
11
|
+
=== General
|
|
12
|
+
|
|
13
|
+
Contributions are welcome! This document provides guidelines for contributing to Omnizip.
|
|
14
|
+
|
|
15
|
+
=== Code of Conduct
|
|
16
|
+
|
|
17
|
+
* Be respectful and inclusive
|
|
18
|
+
* Provide constructive feedback
|
|
19
|
+
* Focus on what is best for the community
|
|
20
|
+
|
|
21
|
+
### How to Contribute
|
|
22
|
+
|
|
23
|
+
==== Report Bugs
|
|
24
|
+
|
|
25
|
+
Report bugs at https://github.com/metanorma/omnizip/issues
|
|
26
|
+
|
|
27
|
+
Include:
|
|
28
|
+
|
|
29
|
+
* Omnizip version
|
|
30
|
+
* Ruby version
|
|
31
|
+
* Operating system
|
|
32
|
+
* Reproduction steps
|
|
33
|
+
* Expected vs actual behavior
|
|
34
|
+
|
|
35
|
+
==== Suggest Features
|
|
36
|
+
|
|
37
|
+
Request features at https://github.com/metanorma/omnizip/issues
|
|
38
|
+
|
|
39
|
+
Explain:
|
|
40
|
+
|
|
41
|
+
* Use case for the feature
|
|
42
|
+
* Why it's important
|
|
43
|
+
* Proposed implementation (if known)
|
|
44
|
+
|
|
45
|
+
==== Submit Pull Requests
|
|
46
|
+
|
|
47
|
+
1. Fork the repository
|
|
48
|
+
2. Create a feature branch
|
|
49
|
+
3. Make your changes
|
|
50
|
+
4. Add/update tests
|
|
51
|
+
5. Run test suite
|
|
52
|
+
6. Run linter
|
|
53
|
+
7. Commit with semantic message
|
|
54
|
+
8. Push to branch
|
|
55
|
+
9. Create pull request
|
|
56
|
+
|
|
57
|
+
=== Development Setup
|
|
58
|
+
|
|
59
|
+
[source,bash]
|
|
60
|
+
----
|
|
61
|
+
# Clone repository
|
|
62
|
+
git clone https://github.com/metanorma/omnizip.git
|
|
63
|
+
cd omnizip
|
|
64
|
+
|
|
65
|
+
# Install dependencies
|
|
66
|
+
bundle install
|
|
67
|
+
|
|
68
|
+
# Run tests
|
|
69
|
+
bundle exec rspec
|
|
70
|
+
|
|
71
|
+
# Run linter
|
|
72
|
+
bundle exec rubocop -A
|
|
73
|
+
----
|
|
74
|
+
|
|
75
|
+
### Coding Standards
|
|
76
|
+
|
|
77
|
+
==== Style Guide
|
|
78
|
+
|
|
79
|
+
Follow these guidelines:
|
|
80
|
+
|
|
81
|
+
* Use 2 spaces for indentation
|
|
82
|
+
* Max line length: 80 characters
|
|
83
|
+
* Max method length: 50 lines
|
|
84
|
+
* Max class length: 700 lines
|
|
85
|
+
|
|
86
|
+
==== Naming Conventions
|
|
87
|
+
|
|
88
|
+
* Classes: `PascalCase`
|
|
89
|
+
* Methods: `snake_case`
|
|
90
|
+
* Constants: `SCREAMING_SNAKE_CASE`
|
|
91
|
+
* Variables: `snake_case`
|
|
92
|
+
|
|
93
|
+
==== Documentation
|
|
94
|
+
|
|
95
|
+
* Document public methods with YARD comments
|
|
96
|
+
* Include usage examples
|
|
97
|
+
* Explain parameters and return values
|
|
98
|
+
|
|
99
|
+
=== Testing
|
|
100
|
+
|
|
101
|
+
==== Test Coverage
|
|
102
|
+
|
|
103
|
+
Aim for:
|
|
104
|
+
|
|
105
|
+
* Unit tests for all methods
|
|
106
|
+
* Integration tests for formats
|
|
107
|
+
* Round-trip tests for compression
|
|
108
|
+
|
|
109
|
+
==== Test Structure
|
|
110
|
+
|
|
111
|
+
[source,ruby]
|
|
112
|
+
----
|
|
113
|
+
RSpec.describe Omnizip::Algorithms::LZMA do
|
|
114
|
+
describe '#compress' do
|
|
115
|
+
it 'compresses data correctly' do
|
|
116
|
+
# Test implementation
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe '#decompress' do
|
|
121
|
+
it 'decompresses data correctly' do
|
|
122
|
+
# Test implementation
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
----
|
|
127
|
+
|
|
128
|
+
=== Commit Messages
|
|
129
|
+
|
|
130
|
+
Use semantic commit messages:
|
|
131
|
+
|
|
132
|
+
```
|
|
133
|
+
feat(algorithm): add new compression algorithm
|
|
134
|
+
fix(format): correct ZIP file header parsing
|
|
135
|
+
docs(guide): update installation instructions
|
|
136
|
+
test(spec): add regression test for issue #123
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Release Process
|
|
140
|
+
|
|
141
|
+
Releases are managed by maintainers:
|
|
142
|
+
|
|
143
|
+
1. Update version number
|
|
144
|
+
2. Update CHANGELOG
|
|
145
|
+
3. Create release tag
|
|
146
|
+
4. Build and publish gem
|
|
147
|
+
5. Update documentation
|
|
148
|
+
|
|
149
|
+
### Getting Help
|
|
150
|
+
|
|
151
|
+
* GitHub Issues: https://github.com/metanorma/omnizip/issues
|
|
152
|
+
* Discussions: https://github.com/metanorma/omnizip/discussions
|
|
153
|
+
|
|
154
|
+
### See Also
|
|
155
|
+
|
|
156
|
+
* link:code-style[Code Style] - Detailed coding standards
|
|
157
|
+
* link:testing[Testing Guide] - Testing guidelines
|
|
158
|
+
* link:architecture[Architecture] - System design
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Developer Guide
|
|
3
|
+
nav_order: 85
|
|
4
|
+
has_children: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
== Developer Guide
|
|
8
|
+
|
|
9
|
+
Information for developers contributing to or extending Omnizip.
|
|
10
|
+
|
|
11
|
+
=== Contributing
|
|
12
|
+
|
|
13
|
+
* link:contributing[Contributing Guide] - How to contribute
|
|
14
|
+
* link:code-style[Code Style] - Coding standards
|
|
15
|
+
* link:testing[Testing] - Running and writing tests
|
|
16
|
+
|
|
17
|
+
=== Development
|
|
18
|
+
|
|
19
|
+
* link:architecture[Architecture] - System design and patterns
|
|
20
|
+
* link:release-process[Release Process] - How releases work
|
|
21
|
+
|
|
22
|
+
=== Resources
|
|
23
|
+
|
|
24
|
+
* link:../concepts/[Core Concepts] - Fundamental concepts
|
|
25
|
+
* link:../troubleshooting/[Troubleshooting] - Common issues
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Testing
|
|
3
|
+
nav_order: 88
|
|
4
|
+
parent: Developer Guide
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
== Testing
|
|
8
|
+
|
|
9
|
+
Guidelines for running and writing tests for Omnizip.
|
|
10
|
+
|
|
11
|
+
=== Running Tests
|
|
12
|
+
|
|
13
|
+
==== Run All Tests
|
|
14
|
+
|
|
15
|
+
[source,bash]
|
|
16
|
+
----
|
|
17
|
+
bundle exec rspec
|
|
18
|
+
----
|
|
19
|
+
|
|
20
|
+
==== Run Specific Test File
|
|
21
|
+
|
|
22
|
+
[source,bash]
|
|
23
|
+
----
|
|
24
|
+
bundle exec rspec spec/omnizip/algorithms/lzma_spec.rb
|
|
25
|
+
----
|
|
26
|
+
|
|
27
|
+
==== Run with Documentation Format
|
|
28
|
+
|
|
29
|
+
[source,bash]
|
|
30
|
+
----
|
|
31
|
+
bundle exec rspec --format documentation
|
|
32
|
+
----
|
|
33
|
+
|
|
34
|
+
==== Run with Coverage
|
|
35
|
+
|
|
36
|
+
[source,bash]
|
|
37
|
+
----
|
|
38
|
+
bundle exec rspec --format documentation --format html --out coverage.html
|
|
39
|
+
----
|
|
40
|
+
|
|
41
|
+
=== Writing Tests
|
|
42
|
+
|
|
43
|
+
==== Test Structure
|
|
44
|
+
|
|
45
|
+
[source,ruby]
|
|
46
|
+
----
|
|
47
|
+
RSpec.describe Omnizip::Algorithms::LZMA do
|
|
48
|
+
let(:algorithm) { described_class.new(level: 5) }
|
|
49
|
+
|
|
50
|
+
describe '#compress' do
|
|
51
|
+
it 'compresses data' do
|
|
52
|
+
input = StringIO.new('Hello, World!')
|
|
53
|
+
output = StringIO.new
|
|
54
|
+
|
|
55
|
+
algorithm.compress(input, output)
|
|
56
|
+
|
|
57
|
+
expect(output.string).to start_with LZMA_MAGIC_BYTES
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe '#decompress' do
|
|
62
|
+
it 'decompresses data' do
|
|
63
|
+
# Test implementation
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
----
|
|
68
|
+
|
|
69
|
+
==== Test Fixtures
|
|
70
|
+
|
|
71
|
+
Place test fixtures in `spec/fixtures/`:
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
spec/fixtures/
|
|
75
|
+
├── compression/
|
|
76
|
+
│ ├── test.txt
|
|
77
|
+
│ ├── test.txt.lzma
|
|
78
|
+
│ └── test.txt.bz2
|
|
79
|
+
└── archives/
|
|
80
|
+
├── test.7z
|
|
81
|
+
├── test.zip
|
|
82
|
+
└── test.rar
|
|
83
|
+
----
|
|
84
|
+
|
|
85
|
+
==== Use StringIO for File Tests
|
|
86
|
+
|
|
87
|
+
[source,ruby]
|
|
88
|
+
----
|
|
89
|
+
# Instead of real files
|
|
90
|
+
input = StringIO.new('test data')
|
|
91
|
+
output = StringIO.new
|
|
92
|
+
|
|
93
|
+
algorithm.compress(input, output)
|
|
94
|
+
|
|
95
|
+
expect(output.string).to eq compressed_data
|
|
96
|
+
----
|
|
97
|
+
|
|
98
|
+
=== Test Coverage
|
|
99
|
+
|
|
100
|
+
==== Unit Tests
|
|
101
|
+
|
|
102
|
+
Test individual methods and classes:
|
|
103
|
+
|
|
104
|
+
[source,ruby]
|
|
105
|
+
----
|
|
106
|
+
RSpec.describe Omnizip::AlgorithmRegistry do
|
|
107
|
+
describe '#get' do
|
|
108
|
+
it 'returns algorithm instance' do
|
|
109
|
+
algorithm = Omnizip::AlgorithmRegistry.get(:lzma2)
|
|
110
|
+
expect(algorithm).to be_a(Omnizip::Algorithms::LZMA2)
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
----
|
|
115
|
+
|
|
116
|
+
==== Integration Tests
|
|
117
|
+
|
|
118
|
+
Test complete workflows:
|
|
119
|
+
|
|
120
|
+
[source,ruby]
|
|
121
|
+
----
|
|
122
|
+
RSpec.describe 'LZMA2 compression workflow' do
|
|
123
|
+
it 'compresses and decompresses file' do
|
|
124
|
+
# Compress
|
|
125
|
+
Omnizip.compress_file('input.txt', 'output.lzma')
|
|
126
|
+
|
|
127
|
+
# Decompress
|
|
128
|
+
Omnizip.decompress_file('output.lzma', 'restored.txt')
|
|
129
|
+
|
|
130
|
+
# Verify
|
|
131
|
+
expect(File.read('restored.txt')).to eq File.read('input.txt')
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
----
|
|
135
|
+
|
|
136
|
+
=== Best Practices
|
|
137
|
+
|
|
138
|
+
==== Isolation
|
|
139
|
+
|
|
140
|
+
Each test should be independent:
|
|
141
|
+
|
|
142
|
+
[source,ruby]
|
|
143
|
+
----
|
|
144
|
+
# Good
|
|
145
|
+
RSpec.describe 'File compression' do
|
|
146
|
+
let(:temp_dir) { Dir.mktmpdir }
|
|
147
|
+
let(:input_file) { File.join(temp_dir, 'input.txt') }
|
|
148
|
+
let(:output_file) { File.join(temp_dir, 'output.lzma') }
|
|
149
|
+
|
|
150
|
+
before do
|
|
151
|
+
File.write(input_file, 'test data')
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
after do
|
|
155
|
+
FileUtils.rm_rf(temp_dir)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
it 'compresses file' do
|
|
159
|
+
Omnizip.compress_file(input_file, output_file)
|
|
160
|
+
expect(File.exist?(output_file)).to be true
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
----
|
|
164
|
+
|
|
165
|
+
==== Descriptive Names
|
|
166
|
+
|
|
167
|
+
Use descriptive test names:
|
|
168
|
+
|
|
169
|
+
[source,ruby]
|
|
170
|
+
----
|
|
171
|
+
# Good
|
|
172
|
+
it 'compresses text file with 50% ratio'
|
|
173
|
+
|
|
174
|
+
# Bad
|
|
175
|
+
it 'works'
|
|
176
|
+
----
|
|
177
|
+
|
|
178
|
+
==== No Mocks
|
|
179
|
+
|
|
180
|
+
Prefer real behavior over mocks:
|
|
181
|
+
|
|
182
|
+
[source,ruby]
|
|
183
|
+
----
|
|
184
|
+
# Good
|
|
185
|
+
it 'compresses data' do
|
|
186
|
+
algorithm = LZMA2.new(level: 5)
|
|
187
|
+
input = StringIO.new('test')
|
|
188
|
+
output = StringIO.new
|
|
189
|
+
|
|
190
|
+
algorithm.compress(input, output)
|
|
191
|
+
|
|
192
|
+
expect(output.string.length).to be < input.string.length
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# Avoid
|
|
196
|
+
it 'compresses data' do
|
|
197
|
+
allow(algorithm).to receive(:compress).and_return('result')
|
|
198
|
+
end
|
|
199
|
+
----
|
|
200
|
+
|
|
201
|
+
=== CI/CD
|
|
202
|
+
|
|
203
|
+
Tests run automatically on:
|
|
204
|
+
|
|
205
|
+
* Pull requests
|
|
206
|
+
* Push to main branch
|
|
207
|
+
* Scheduled runs
|
|
208
|
+
|
|
209
|
+
### See Also
|
|
210
|
+
|
|
211
|
+
* link:../troubleshooting/[Troubleshooting]
|
|
212
|
+
* link:architecture[Architecture]
|