omnizip 0.4.7-arm-linux
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 +293 -0
- data/CHANGELOG.md +1647 -0
- data/CONTEXT.md +68 -0
- data/COPYING +502 -0
- data/Gemfile +19 -0
- data/LICENSE +12 -0
- data/README.adoc +1327 -0
- data/Rakefile +15 -0
- data/TODO.refactor/00-overview.md +67 -0
- data/TODO.refactor/01-registry-base-class.md +81 -0
- data/TODO.refactor/02-error-hierarchy.md +57 -0
- data/TODO.refactor/03-autoload-entry-point.md +69 -0
- data/TODO.refactor/04-filter-base-consolidation.md +49 -0
- data/TODO.refactor/05-send-private-methods.md +64 -0
- data/TODO.refactor/06-instance-variable-access.md +69 -0
- data/TODO.refactor/07-respond-to-replacement.md +237 -0
- data/TODO.refactor/08-spec-doubles.md +27 -0
- data/TODO.refactor/09-cli-shared-module.md +35 -0
- data/TODO.refactor/10-format-detector-ocp.md +34 -0
- data/TODO.refactor/11-convenience-decoupling.md +38 -0
- data/TODO.refactor/12-thread-safety.md +8 -0
- data/TODO.refactor/13-lutaml-model-migration.md +158 -0
- data/TODO.refactor/14-add-missing-specs.md +25 -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 +92 -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 +263 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +183 -0
- data/docs/getting-started/your-first-archive.adoc +219 -0
- data/docs/guides/advanced-features/encryption.adoc +277 -0
- data/docs/guides/advanced-features/index.adoc +59 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
- data/docs/guides/advanced-features/streaming.adoc +142 -0
- data/docs/guides/archive-formats/gzip-format.adoc +105 -0
- data/docs/guides/archive-formats/index.adoc +160 -0
- data/docs/guides/archive-formats/ole-format.adoc +151 -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/rpm-format.adoc +108 -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 +114 -0
- data/docs/guides/compression-algorithms/deflate.adoc +313 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +394 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
- data/docs/guides/creating-archives.adoc +348 -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 +228 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +187 -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/rust-backend.md +0 -0
- data/docs/troubleshooting/index.adoc +207 -0
- data/docs/xar_format.md +216 -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 +176 -0
- data/lib/omnizip/algorithm_registry.rb +65 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
- data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
- data/lib/omnizip/algorithms/bzip2.rb +108 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
- data/lib/omnizip/algorithms/deflate.rb +135 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
- data/lib/omnizip/algorithms/deflate64.rb +118 -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 +146 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
- data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -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 +233 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
- data/lib/omnizip/algorithms/lzma.rb +266 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +133 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +146 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +122 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
- data/lib/omnizip/algorithms/registration.rb +28 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
- data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
- data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
- data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
- data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
- data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
- data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
- data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
- data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
- data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
- data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
- data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
- data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
- data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
- data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
- data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
- data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
- data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
- data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
- data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
- data/lib/omnizip/algorithms/zstandard.rb +210 -0
- data/lib/omnizip/algorithms.rb +35 -0
- data/lib/omnizip/archive/builder.rb +48 -0
- data/lib/omnizip/archive/reader_session.rb +67 -0
- data/lib/omnizip/archive.rb +86 -0
- data/lib/omnizip/archive_handler.rb +82 -0
- data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
- data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
- data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
- data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
- data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
- data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
- data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
- data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
- data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
- data/lib/omnizip/archive_handlers.rb +18 -0
- data/lib/omnizip/backends.rb +160 -0
- data/lib/omnizip/buffer/memory_archive.rb +246 -0
- data/lib/omnizip/buffer/memory_extractor.rb +234 -0
- data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
- data/lib/omnizip/buffer.rb +187 -0
- data/lib/omnizip/checksum_registry.rb +41 -0
- data/lib/omnizip/checksums/crc32.rb +101 -0
- data/lib/omnizip/checksums/crc64.rb +102 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/registration.rb +16 -0
- data/lib/omnizip/checksums/verifier.rb +130 -0
- data/lib/omnizip/checksums.rb +11 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +123 -0
- data/lib/omnizip/chunked.rb +123 -0
- data/lib/omnizip/cli/output_formatter.rb +112 -0
- data/lib/omnizip/cli.rb +604 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +245 -0
- data/lib/omnizip/commands/archive_extract_command.rb +231 -0
- data/lib/omnizip/commands/archive_list_command.rb +204 -0
- data/lib/omnizip/commands/archive_repair_command.rb +129 -0
- data/lib/omnizip/commands/archive_verify_command.rb +115 -0
- data/lib/omnizip/commands/compress_command.rb +115 -0
- data/lib/omnizip/commands/decompress_command.rb +149 -0
- data/lib/omnizip/commands/list_command.rb +51 -0
- data/lib/omnizip/commands/metadata_command.rb +215 -0
- data/lib/omnizip/commands/parity_create_command.rb +114 -0
- data/lib/omnizip/commands/parity_repair_command.rb +120 -0
- data/lib/omnizip/commands/parity_verify_command.rb +122 -0
- data/lib/omnizip/commands/profile_list_command.rb +54 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/commands.rb +21 -0
- data/lib/omnizip/convenience.rb +389 -0
- data/lib/omnizip/converter/conversion_registry.rb +50 -0
- data/lib/omnizip/converter/conversion_strategy.rb +108 -0
- data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
- data/lib/omnizip/converter.rb +124 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/crypto.rb +11 -0
- data/lib/omnizip/entry.rb +44 -0
- data/lib/omnizip/error.rb +110 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +96 -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 +68 -0
- data/lib/omnizip/extraction/filter_chain.rb +179 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +66 -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 +247 -0
- data/lib/omnizip/extraction.rb +115 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +117 -0
- data/lib/omnizip/filter.rb +141 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +113 -0
- data/lib/omnizip/filters/bcj.rb +277 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
- data/lib/omnizip/filters/bcj2.rb +93 -0
- data/lib/omnizip/filters/bcj_arm.rb +174 -0
- data/lib/omnizip/filters/bcj_arm64.rb +242 -0
- data/lib/omnizip/filters/bcj_ia64.rb +194 -0
- data/lib/omnizip/filters/bcj_ppc.rb +188 -0
- data/lib/omnizip/filters/bcj_sparc.rb +174 -0
- data/lib/omnizip/filters/bcj_x86.rb +191 -0
- data/lib/omnizip/filters/delta.rb +195 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/filters.rb +20 -0
- data/lib/omnizip/format_detector.rb +166 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +159 -0
- data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +389 -0
- data/lib/omnizip/formats/cpio/reader.rb +194 -0
- data/lib/omnizip/formats/cpio/writer.rb +232 -0
- data/lib/omnizip/formats/cpio.rb +132 -0
- data/lib/omnizip/formats/format_spec_loader.rb +228 -0
- data/lib/omnizip/formats/gzip.rb +236 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
- data/lib/omnizip/formats/iso/directory_record.rb +162 -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 +194 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +543 -0
- data/lib/omnizip/formats/iso.rb +133 -0
- data/lib/omnizip/formats/lzip.rb +161 -0
- data/lib/omnizip/formats/lzma_alone.rb +149 -0
- data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
- data/lib/omnizip/formats/msi/constants.rb +157 -0
- data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
- data/lib/omnizip/formats/msi/entry.rb +134 -0
- data/lib/omnizip/formats/msi/reader.rb +301 -0
- data/lib/omnizip/formats/msi/string_pool.rb +246 -0
- data/lib/omnizip/formats/msi/table_parser.rb +244 -0
- data/lib/omnizip/formats/msi.rb +73 -0
- data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
- data/lib/omnizip/formats/ole/constants.rb +61 -0
- data/lib/omnizip/formats/ole/dirent.rb +439 -0
- data/lib/omnizip/formats/ole/header.rb +199 -0
- data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
- data/lib/omnizip/formats/ole/storage.rb +482 -0
- data/lib/omnizip/formats/ole/types/variant.rb +338 -0
- data/lib/omnizip/formats/ole.rb +143 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
- data/lib/omnizip/formats/rar/block_parser.rb +282 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -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/lz77_huffman.rb +25 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
- data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
- data/lib/omnizip/formats/rar/compression.rb +17 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +88 -0
- data/lib/omnizip/formats/rar/decompressor.rb +316 -0
- data/lib/omnizip/formats/rar/external_writer.rb +311 -0
- data/lib/omnizip/formats/rar/header.rb +209 -0
- data/lib/omnizip/formats/rar/license_validator.rb +111 -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/models.rb +14 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -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 +96 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +208 -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 +260 -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 +176 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
- data/lib/omnizip/formats/rar/reader.rb +377 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
- data/lib/omnizip/formats/rar/writer.rb +437 -0
- data/lib/omnizip/formats/rar.rb +193 -0
- data/lib/omnizip/formats/rar3/compressor.rb +71 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar3/reader.rb +107 -0
- data/lib/omnizip/formats/rar3/writer.rb +220 -0
- data/lib/omnizip/formats/rar3.rb +15 -0
- data/lib/omnizip/formats/rar5/compressor.rb +71 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar5/reader.rb +130 -0
- data/lib/omnizip/formats/rar5/writer.rb +65 -0
- data/lib/omnizip/formats/rar5.rb +15 -0
- data/lib/omnizip/formats/rpm/constants.rb +58 -0
- data/lib/omnizip/formats/rpm/entry.rb +106 -0
- data/lib/omnizip/formats/rpm/header.rb +106 -0
- data/lib/omnizip/formats/rpm/lead.rb +132 -0
- data/lib/omnizip/formats/rpm/tag.rb +228 -0
- data/lib/omnizip/formats/rpm/writer.rb +652 -0
- data/lib/omnizip/formats/rpm.rb +458 -0
- data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
- data/lib/omnizip/formats/seven_zip/header.rb +102 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/models.rb +20 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
- data/lib/omnizip/formats/seven_zip.rb +179 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +98 -0
- data/lib/omnizip/formats/tar/header.rb +206 -0
- data/lib/omnizip/formats/tar/reader.rb +119 -0
- data/lib/omnizip/formats/tar/writer.rb +212 -0
- data/lib/omnizip/formats/tar.rb +74 -0
- data/lib/omnizip/formats/xar/constants.rb +119 -0
- data/lib/omnizip/formats/xar/entry.rb +268 -0
- data/lib/omnizip/formats/xar/header.rb +223 -0
- data/lib/omnizip/formats/xar/reader.rb +400 -0
- data/lib/omnizip/formats/xar/toc.rb +570 -0
- data/lib/omnizip/formats/xar/writer.rb +461 -0
- data/lib/omnizip/formats/xar.rb +145 -0
- data/lib/omnizip/formats/xz/reader.rb +121 -0
- data/lib/omnizip/formats/xz/writer.rb +416 -0
- data/lib/omnizip/formats/xz.rb +210 -0
- data/lib/omnizip/formats/xz_const.rb +49 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl.rb +52 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
- data/lib/omnizip/formats/zip/reader.rb +376 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +489 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/formats.rb +29 -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/base.rb +19 -0
- data/lib/omnizip/implementations/rust/archive.rb +93 -0
- data/lib/omnizip/implementations/rust/library.rb +221 -0
- data/lib/omnizip/implementations/rust.rb +26 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
- data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
- data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
- data/lib/omnizip/implementations/seven_zip.rb +11 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
- data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
- data/lib/omnizip/implementations/xz_utils.rb +10 -0
- data/lib/omnizip/implementations.rb +25 -0
- data/lib/omnizip/io/buffered_input.rb +147 -0
- data/lib/omnizip/io/buffered_output.rb +106 -0
- data/lib/omnizip/io/source.rb +143 -0
- data/lib/omnizip/io/stream_manager.rb +117 -0
- data/lib/omnizip/io.rb +15 -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 +129 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +153 -0
- data/lib/omnizip/metadata/metadata_editor.rb +169 -0
- data/lib/omnizip/metadata/metadata_registry.rb +71 -0
- data/lib/omnizip/metadata/metadata_validator.rb +101 -0
- data/lib/omnizip/metadata.rb +58 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +41 -0
- data/lib/omnizip/models/attribute_apply.rb +40 -0
- data/lib/omnizip/models/compression_options.rb +53 -0
- data/lib/omnizip/models/conversion_options.rb +79 -0
- data/lib/omnizip/models/conversion_result.rb +141 -0
- data/lib/omnizip/models/eta_result.rb +45 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +142 -0
- data/lib/omnizip/models/filter_config.rb +148 -0
- data/lib/omnizip/models/match_result.rb +141 -0
- data/lib/omnizip/models/optimization_suggestion.rb +95 -0
- data/lib/omnizip/models/parallel_options.rb +116 -0
- data/lib/omnizip/models/performance_result.rb +85 -0
- data/lib/omnizip/models/profile_report.rb +116 -0
- data/lib/omnizip/models/progress_options.rb +39 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +45 -0
- data/lib/omnizip/parallel/engine.rb +52 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +225 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
- data/lib/omnizip/parallel/thread_pool.rb +60 -0
- data/lib/omnizip/parallel/worker_pool.rb +227 -0
- data/lib/omnizip/parallel.rb +156 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +71 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
- data/lib/omnizip/parity/models/main_packet.rb +126 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +102 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
- data/lib/omnizip/parity/models.rb +27 -0
- data/lib/omnizip/parity/par2_creator.rb +496 -0
- data/lib/omnizip/parity/par2_repairer.rb +409 -0
- data/lib/omnizip/parity/par2_verifier.rb +373 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
- data/lib/omnizip/parity.rb +207 -0
- data/lib/omnizip/password/encryption_registry.rb +26 -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 +190 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
- data/lib/omnizip/password.rb +88 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
- data/lib/omnizip/pipe.rb +120 -0
- data/lib/omnizip/platform/ntfs_streams.rb +200 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +36 -0
- data/lib/omnizip/profile/balanced_profile.rb +31 -0
- data/lib/omnizip/profile/binary_profile.rb +33 -0
- data/lib/omnizip/profile/compression_profile.rb +157 -0
- data/lib/omnizip/profile/custom_profile.rb +155 -0
- data/lib/omnizip/profile/fast_profile.rb +31 -0
- data/lib/omnizip/profile/maximum_profile.rb +31 -0
- data/lib/omnizip/profile/profile_detector.rb +108 -0
- data/lib/omnizip/profile/profile_registry.rb +160 -0
- data/lib/omnizip/profile/text_profile.rb +33 -0
- data/lib/omnizip/profile.rb +261 -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 +158 -0
- data/lib/omnizip/profiler.rb +192 -0
- data/lib/omnizip/progress/callback_reporter.rb +34 -0
- data/lib/omnizip/progress/console_reporter.rb +59 -0
- data/lib/omnizip/progress/log_reporter.rb +89 -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 +215 -0
- data/lib/omnizip/progress/silent_reporter.rb +22 -0
- data/lib/omnizip/progress.rb +131 -0
- data/lib/omnizip/registry.rb +111 -0
- data/lib/omnizip/rubyzip_compat.rb +61 -0
- data/lib/omnizip/temp/safe_extract.rb +124 -0
- data/lib/omnizip/temp/temp_file.rb +123 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +184 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +160 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +270 -0
- data/lib/omnizip/zip/output_stream.rb +320 -0
- data/lib/omnizip/zip.rb +23 -0
- data/lib/omnizip.rb +157 -0
- data/lib/tasks/msi_test_files.rake +66 -0
- data/lib/tasks/platform_gems.rake +147 -0
- data/lib/tasks/rust_backend.rake +48 -0
- data/readme-docs/advanced-features.adoc +514 -0
- data/readme-docs/api-usage.adoc +445 -0
- data/readme-docs/architecture.adoc +450 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +446 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +316 -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/vendor/libomnizip_ffi.so +0 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- metadata +768 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Rubyzip Compatibility Layer
|
|
5
|
+
#
|
|
6
|
+
# This file provides a drop-in replacement for the 'zip' gem (rubyzip).
|
|
7
|
+
# Simply require 'omnizip/rubyzip_compat' instead of 'zip' to use Omnizip
|
|
8
|
+
# with existing rubyzip code.
|
|
9
|
+
#
|
|
10
|
+
# Usage:
|
|
11
|
+
# require 'omnizip/rubyzip_compat'
|
|
12
|
+
#
|
|
13
|
+
# Zip::File.open('archive.zip') do |zip|
|
|
14
|
+
# zip.each { |entry| puts entry.name }
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
|
|
18
|
+
# Create Zip namespace as alias for Omnizip::Zip
|
|
19
|
+
module Zip
|
|
20
|
+
# Rubyzip-compatible File class
|
|
21
|
+
File = Omnizip::Zip::File
|
|
22
|
+
|
|
23
|
+
# Rubyzip-compatible Entry class
|
|
24
|
+
Entry = Omnizip::Zip::Entry
|
|
25
|
+
|
|
26
|
+
# Rubyzip-compatible OutputStream class
|
|
27
|
+
OutputStream = Omnizip::Zip::OutputStream
|
|
28
|
+
|
|
29
|
+
# Rubyzip-compatible InputStream class
|
|
30
|
+
InputStream = Omnizip::Zip::InputStream
|
|
31
|
+
|
|
32
|
+
# Error classes for compatibility
|
|
33
|
+
Error = Omnizip::Error
|
|
34
|
+
FormatError = Omnizip::FormatError
|
|
35
|
+
CompressionError = Omnizip::CompressionError
|
|
36
|
+
DecompressionError = Omnizip::DecompressionError
|
|
37
|
+
ChecksumError = Omnizip::ChecksumError
|
|
38
|
+
|
|
39
|
+
# Version information
|
|
40
|
+
VERSION = Omnizip::VERSION
|
|
41
|
+
|
|
42
|
+
class << self
|
|
43
|
+
# Legacy compatibility method
|
|
44
|
+
# @deprecated Use Zip::File.open instead
|
|
45
|
+
def open(...)
|
|
46
|
+
File.open(...)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Legacy compatibility method
|
|
50
|
+
# @deprecated Use Zip::File.create instead
|
|
51
|
+
def create(...)
|
|
52
|
+
File.create(...)
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Compatibility note
|
|
58
|
+
if $VERBOSE
|
|
59
|
+
warn "Omnizip: Using Omnizip rubyzip compatibility layer. " \
|
|
60
|
+
"API is compatible with rubyzip, but implementation differs."
|
|
61
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
require "tmpdir"
|
|
5
|
+
|
|
6
|
+
module Omnizip
|
|
7
|
+
module Temp
|
|
8
|
+
# Safe extraction with atomic move to destination
|
|
9
|
+
# Provides rollback capability on failure
|
|
10
|
+
class SafeExtract
|
|
11
|
+
# Error raised when extraction verification fails
|
|
12
|
+
class VerificationError < Omnizip::Error; end
|
|
13
|
+
|
|
14
|
+
attr_reader :archive_path, :dest_path
|
|
15
|
+
|
|
16
|
+
# Create new safe extractor
|
|
17
|
+
# @param archive_path [String] Path to archive
|
|
18
|
+
# @param dest_path [String] Destination path
|
|
19
|
+
def initialize(archive_path, dest_path)
|
|
20
|
+
@archive_path = archive_path
|
|
21
|
+
@dest_path = dest_path
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Extract safely with verification
|
|
25
|
+
# @yield [temp_dir] Block for verification (return truthy to proceed)
|
|
26
|
+
# @return [String] Destination path
|
|
27
|
+
def extract
|
|
28
|
+
unless File.exist?(@archive_path)
|
|
29
|
+
raise Errno::ENOENT, "Archive not found: #{@archive_path}"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
Dir.mktmpdir("omniz_extract_") do |temp_dir|
|
|
33
|
+
# Extract to temp directory
|
|
34
|
+
extract_to_temp(temp_dir)
|
|
35
|
+
|
|
36
|
+
# User verification if block given
|
|
37
|
+
if block_given?
|
|
38
|
+
result = yield(temp_dir)
|
|
39
|
+
unless result
|
|
40
|
+
raise VerificationError, "Extraction verification failed"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Atomic move to destination
|
|
45
|
+
move_to_destination(temp_dir)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
@dest_path
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Extract with checksum verification
|
|
52
|
+
# @param expected_checksums [Hash] Map of filename => CRC32
|
|
53
|
+
# @return [String] Destination path
|
|
54
|
+
def extract_verified(expected_checksums)
|
|
55
|
+
extract do |temp_dir|
|
|
56
|
+
verify_checksums(temp_dir, expected_checksums)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Extract with file count verification
|
|
61
|
+
# @param expected_count [Integer] Expected number of files
|
|
62
|
+
# @return [String] Destination path
|
|
63
|
+
def extract_with_count(expected_count)
|
|
64
|
+
extract do |temp_dir|
|
|
65
|
+
actual_count = count_files(temp_dir)
|
|
66
|
+
actual_count == expected_count
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Class method for quick safe extraction
|
|
71
|
+
# @param archive_path [String] Archive to extract
|
|
72
|
+
# @param dest_path [String] Destination
|
|
73
|
+
# @yield [temp_dir] Verification block
|
|
74
|
+
# @return [String] Destination path
|
|
75
|
+
def self.extract_safe(archive_path, dest_path, &block)
|
|
76
|
+
new(archive_path, dest_path).extract(&block)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def extract_to_temp(temp_dir)
|
|
82
|
+
# Every routed format extracts through the handler registry,
|
|
83
|
+
# same as the convenience API
|
|
84
|
+
Omnizip.extract_archive(@archive_path, temp_dir)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def move_to_destination(temp_dir)
|
|
88
|
+
# Ensure parent directory exists
|
|
89
|
+
FileUtils.mkdir_p(File.dirname(@dest_path))
|
|
90
|
+
|
|
91
|
+
# Remove destination if it exists
|
|
92
|
+
FileUtils.rm_rf(@dest_path)
|
|
93
|
+
|
|
94
|
+
# Copy contents (can't move since Dir.mktmpdir will try to clean up)
|
|
95
|
+
FileUtils.cp_r(temp_dir, @dest_path)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def verify_checksums(dir, expected)
|
|
99
|
+
expected.all? do |file, expected_sum|
|
|
100
|
+
file_path = File.join(dir, file)
|
|
101
|
+
next false unless File.exist?(file_path)
|
|
102
|
+
|
|
103
|
+
# Calculate checksum
|
|
104
|
+
crc = Omnizip::Checksums::Crc32.new
|
|
105
|
+
File.open(file_path, "rb") do |f|
|
|
106
|
+
while (chunk = f.read(64 * 1024))
|
|
107
|
+
crc.update(chunk)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
crc.finalize == expected_sum
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def count_files(dir)
|
|
116
|
+
count = 0
|
|
117
|
+
Dir.glob(File.join(dir, "**", "*")) do |path|
|
|
118
|
+
count += 1 unless File.directory?(path)
|
|
119
|
+
end
|
|
120
|
+
count
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "tempfile"
|
|
4
|
+
|
|
5
|
+
module Omnizip
|
|
6
|
+
module Temp
|
|
7
|
+
# RAII-pattern temporary file with automatic cleanup
|
|
8
|
+
class TempFile
|
|
9
|
+
attr_reader :path
|
|
10
|
+
|
|
11
|
+
# Create new temporary file
|
|
12
|
+
# @param prefix [String] Filename prefix
|
|
13
|
+
# @param suffix [String] Filename suffix
|
|
14
|
+
# @param directory [String, nil] Directory (nil = system default)
|
|
15
|
+
def initialize(prefix: "omniz_", suffix: "", directory: nil)
|
|
16
|
+
@prefix = prefix
|
|
17
|
+
@suffix = suffix
|
|
18
|
+
@directory = directory
|
|
19
|
+
@tempfile = nil
|
|
20
|
+
@path = nil
|
|
21
|
+
@kept = false
|
|
22
|
+
@finalized = false
|
|
23
|
+
|
|
24
|
+
create
|
|
25
|
+
setup_finalizer
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Get the underlying Tempfile object
|
|
29
|
+
# @return [Tempfile] The tempfile
|
|
30
|
+
def file
|
|
31
|
+
@tempfile
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Write data to temp file
|
|
35
|
+
# @param data [String] Data to write
|
|
36
|
+
# @return [Integer] Bytes written
|
|
37
|
+
def write(data)
|
|
38
|
+
@tempfile.write(data)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Read data from temp file
|
|
42
|
+
# @param length [Integer, nil] Number of bytes to read
|
|
43
|
+
# @return [String, nil] Data read
|
|
44
|
+
def read(length = nil)
|
|
45
|
+
@tempfile.read(length)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Rewind to beginning of file
|
|
49
|
+
def rewind
|
|
50
|
+
@tempfile.rewind
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Close the temp file
|
|
54
|
+
def close
|
|
55
|
+
@tempfile.close if @tempfile && !@tempfile.closed?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Delete the temp file
|
|
59
|
+
def unlink
|
|
60
|
+
return if @finalized || @kept
|
|
61
|
+
|
|
62
|
+
if @tempfile
|
|
63
|
+
@tempfile.close unless @tempfile.closed?
|
|
64
|
+
@tempfile.unlink
|
|
65
|
+
@finalized = true
|
|
66
|
+
end
|
|
67
|
+
rescue StandardError
|
|
68
|
+
# Ignore errors during cleanup
|
|
69
|
+
nil
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Prevent automatic deletion
|
|
73
|
+
def keep!
|
|
74
|
+
@kept = true
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Check if file will be kept
|
|
78
|
+
# @return [Boolean] True if file won't be auto-deleted
|
|
79
|
+
def kept?
|
|
80
|
+
@kept
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Check if file has been finalized
|
|
84
|
+
# @return [Boolean] True if finalized
|
|
85
|
+
def finalized?
|
|
86
|
+
@finalized
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def create
|
|
92
|
+
@tempfile = if @directory
|
|
93
|
+
::Tempfile.new(
|
|
94
|
+
[@prefix, @suffix],
|
|
95
|
+
@directory,
|
|
96
|
+
binmode: true,
|
|
97
|
+
)
|
|
98
|
+
else
|
|
99
|
+
::Tempfile.new(
|
|
100
|
+
[@prefix, @suffix],
|
|
101
|
+
binmode: true,
|
|
102
|
+
)
|
|
103
|
+
end
|
|
104
|
+
@path = @tempfile.path
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def setup_finalizer
|
|
108
|
+
ObjectSpace.define_finalizer(self, self.class.finalizer(@tempfile))
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# rubocop:disable-next Lint/IneffectiveAccessModifier
|
|
112
|
+
def self.finalizer(tempfile)
|
|
113
|
+
proc do
|
|
114
|
+
tempfile.close unless tempfile.closed?
|
|
115
|
+
tempfile.unlink
|
|
116
|
+
rescue StandardError
|
|
117
|
+
# Ignore errors in finalizer
|
|
118
|
+
nil
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Temp
|
|
5
|
+
# Resource pool for managing reusable temp files
|
|
6
|
+
class TempFilePool
|
|
7
|
+
DEFAULT_POOL_SIZE = 10
|
|
8
|
+
|
|
9
|
+
attr_reader :size
|
|
10
|
+
|
|
11
|
+
# Create new temp file pool
|
|
12
|
+
# @param size [Integer] Maximum pool size
|
|
13
|
+
def initialize(size: DEFAULT_POOL_SIZE)
|
|
14
|
+
@size = size
|
|
15
|
+
@pool = []
|
|
16
|
+
@mutex = Mutex.new
|
|
17
|
+
@created_count = 0
|
|
18
|
+
@reuse_count = 0
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Acquire temp file from pool
|
|
22
|
+
# @yield [temp_file] Block called with temp file
|
|
23
|
+
# @return [Object] Block return value
|
|
24
|
+
def acquire(**options)
|
|
25
|
+
temp_file = get_or_create(**options)
|
|
26
|
+
|
|
27
|
+
begin
|
|
28
|
+
result = yield temp_file
|
|
29
|
+
release(temp_file)
|
|
30
|
+
result
|
|
31
|
+
rescue StandardError => e
|
|
32
|
+
# Ensure cleanup even on exception
|
|
33
|
+
temp_file.unlink
|
|
34
|
+
raise e
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Release temp file back to pool or delete if pool is full
|
|
39
|
+
# @param temp_file [TempFile] File to release
|
|
40
|
+
def release(temp_file)
|
|
41
|
+
@mutex.synchronize do
|
|
42
|
+
if @pool.size < @size
|
|
43
|
+
# Return to pool for reuse
|
|
44
|
+
temp_file.rewind
|
|
45
|
+
@pool << temp_file
|
|
46
|
+
@reuse_count += 1
|
|
47
|
+
else
|
|
48
|
+
# Pool full, delete it
|
|
49
|
+
temp_file.unlink
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Clear all files from pool
|
|
55
|
+
def clear
|
|
56
|
+
@mutex.synchronize do
|
|
57
|
+
@pool.each do |tf|
|
|
58
|
+
tf.unlink
|
|
59
|
+
rescue StandardError
|
|
60
|
+
nil
|
|
61
|
+
end
|
|
62
|
+
@pool.clear
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Get available file count in pool
|
|
67
|
+
# @return [Integer] Number of available files
|
|
68
|
+
def available_count
|
|
69
|
+
@mutex.synchronize { @pool.size }
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Get statistics
|
|
73
|
+
# @return [Hash] Pool statistics
|
|
74
|
+
def stats
|
|
75
|
+
@mutex.synchronize do
|
|
76
|
+
{
|
|
77
|
+
pool_size: @size,
|
|
78
|
+
available: @pool.size,
|
|
79
|
+
created: @created_count,
|
|
80
|
+
reused: @reuse_count,
|
|
81
|
+
efficiency: efficiency_ratio,
|
|
82
|
+
}
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
def get_or_create(**options)
|
|
89
|
+
@mutex.synchronize do
|
|
90
|
+
if @pool.empty?
|
|
91
|
+
# Create new temp file
|
|
92
|
+
@created_count += 1
|
|
93
|
+
TempFile.new(**options)
|
|
94
|
+
else
|
|
95
|
+
# Reuse from pool (LRU - take from front)
|
|
96
|
+
@pool.shift
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def efficiency_ratio
|
|
102
|
+
total = @created_count + @reuse_count
|
|
103
|
+
return 0.0 if total.zero?
|
|
104
|
+
|
|
105
|
+
(@reuse_count.to_f / total * 100).round(2)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
data/lib/omnizip/temp.rb
ADDED
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
# Temporary file management with automatic cleanup
|
|
5
|
+
# Provides safe, atomic operations with RAII pattern
|
|
6
|
+
module Temp
|
|
7
|
+
# Nested classes - autoloaded
|
|
8
|
+
autoload :TempFile, "omnizip/temp/temp_file"
|
|
9
|
+
autoload :TempFilePool, "omnizip/temp/temp_file_pool"
|
|
10
|
+
autoload :SafeExtract, "omnizip/temp/safe_extract"
|
|
11
|
+
|
|
12
|
+
# Configuration for temp file operations
|
|
13
|
+
class Configuration
|
|
14
|
+
attr_accessor :directory, :prefix, :cleanup_on_exit
|
|
15
|
+
|
|
16
|
+
def initialize
|
|
17
|
+
@directory = nil # Use system default (Dir.tmpdir)
|
|
18
|
+
@prefix = "omniz_"
|
|
19
|
+
@cleanup_on_exit = true
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class << self
|
|
24
|
+
# Global configuration
|
|
25
|
+
# @return [Configuration] Current configuration
|
|
26
|
+
def configuration
|
|
27
|
+
@configuration ||= Configuration.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Configure temp file operations
|
|
31
|
+
# @yield [config] Configuration block
|
|
32
|
+
def configure
|
|
33
|
+
yield configuration
|
|
34
|
+
setup_cleanup_hooks if configuration.cleanup_on_exit
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Create temporary file with automatic cleanup
|
|
38
|
+
# @param prefix [String] Filename prefix
|
|
39
|
+
# @param suffix [String] Filename suffix
|
|
40
|
+
# @yield [path] Block called with temp file path
|
|
41
|
+
# @return [Object] Block return value
|
|
42
|
+
def file(prefix: nil, suffix: "")
|
|
43
|
+
prefix ||= configuration.prefix
|
|
44
|
+
temp_file = TempFile.new(
|
|
45
|
+
prefix: prefix,
|
|
46
|
+
suffix: suffix,
|
|
47
|
+
directory: configuration.directory,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
registry.track(temp_file)
|
|
51
|
+
|
|
52
|
+
begin
|
|
53
|
+
yield(temp_file.path)
|
|
54
|
+
ensure
|
|
55
|
+
registry.untrack(temp_file)
|
|
56
|
+
temp_file.unlink unless temp_file.kept?
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Create temporary directory with automatic cleanup
|
|
61
|
+
# @param prefix [String] Directory prefix
|
|
62
|
+
# @yield [path] Block called with temp directory path
|
|
63
|
+
# @return [Object] Block return value
|
|
64
|
+
def directory(prefix: nil, &block)
|
|
65
|
+
require "tmpdir"
|
|
66
|
+
prefix ||= configuration.prefix
|
|
67
|
+
|
|
68
|
+
Dir.mktmpdir(prefix, configuration.directory, &block)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Create temporary archive with automatic cleanup
|
|
72
|
+
# @param format [Symbol] Archive format (:zip, :seven_zip)
|
|
73
|
+
# @yield [archive] Block called with archive helper
|
|
74
|
+
# @return [Object] Block return value
|
|
75
|
+
def with_archive(format: :zip)
|
|
76
|
+
suffix = format == :zip ? ".zip" : ".7z"
|
|
77
|
+
|
|
78
|
+
file(suffix: suffix) do |path|
|
|
79
|
+
archive = ArchiveHelper.new(path, format)
|
|
80
|
+
yield(archive)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Get temp file registry
|
|
85
|
+
# @return [TempFileRegistry] Registry instance
|
|
86
|
+
def registry
|
|
87
|
+
@registry ||= TempFileRegistry.new
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# Cleanup all tracked temp files
|
|
91
|
+
def cleanup_all
|
|
92
|
+
registry.cleanup_all
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def setup_cleanup_hooks
|
|
98
|
+
return if @hooks_installed
|
|
99
|
+
|
|
100
|
+
# AtExit handler for normal termination
|
|
101
|
+
at_exit { cleanup_all }
|
|
102
|
+
|
|
103
|
+
# Signal handlers for interruption
|
|
104
|
+
%w[INT TERM].each do |signal|
|
|
105
|
+
Signal.trap(signal) do
|
|
106
|
+
cleanup_all
|
|
107
|
+
exit(1)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
@hooks_installed = true
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Helper class for temp archive operations
|
|
116
|
+
class ArchiveHelper
|
|
117
|
+
attr_reader :path, :format
|
|
118
|
+
|
|
119
|
+
def initialize(path, format)
|
|
120
|
+
@path = path
|
|
121
|
+
@format = format
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Add file to archive
|
|
125
|
+
# @param name [String] Entry name
|
|
126
|
+
# @param data [String] Entry data
|
|
127
|
+
def add_file(name, data = nil, &block)
|
|
128
|
+
data = yield if block
|
|
129
|
+
|
|
130
|
+
case format
|
|
131
|
+
when :zip
|
|
132
|
+
# Native writer — the rubyzip-compat Omnizip::Zip seam is
|
|
133
|
+
# for library consumers migrating from rubyzip, not for
|
|
134
|
+
# internal use
|
|
135
|
+
writer = Omnizip::Formats::Zip::Writer.new(path)
|
|
136
|
+
writer.add_data(name, data.to_s)
|
|
137
|
+
writer.write
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Registry to track all temp files
|
|
143
|
+
class TempFileRegistry
|
|
144
|
+
def initialize
|
|
145
|
+
@temp_files = []
|
|
146
|
+
@mutex = Mutex.new
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Track a temp file
|
|
150
|
+
# @param temp_file [TempFile] File to track
|
|
151
|
+
def track(temp_file)
|
|
152
|
+
@mutex.synchronize do
|
|
153
|
+
@temp_files << temp_file
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# Untrack a temp file
|
|
158
|
+
# @param temp_file [TempFile] File to untrack
|
|
159
|
+
def untrack(temp_file)
|
|
160
|
+
@mutex.synchronize do
|
|
161
|
+
@temp_files.delete(temp_file)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# Cleanup all tracked files
|
|
166
|
+
def cleanup_all
|
|
167
|
+
@mutex.synchronize do
|
|
168
|
+
@temp_files.each do |temp_file|
|
|
169
|
+
temp_file.unlink
|
|
170
|
+
rescue StandardError
|
|
171
|
+
nil
|
|
172
|
+
end
|
|
173
|
+
@temp_files.clear
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Get count of tracked files
|
|
178
|
+
# @return [Integer] Number of tracked files
|
|
179
|
+
def count
|
|
180
|
+
@mutex.synchronize { @temp_files.size }
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|