omnizip 0.4.7-x86_64-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,160 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Profile
|
|
5
|
+
# Thread-safe registry for compression profiles
|
|
6
|
+
#
|
|
7
|
+
# This class manages both built-in and custom compression profiles,
|
|
8
|
+
# providing a central location for profile registration, lookup, and
|
|
9
|
+
# management.
|
|
10
|
+
class ProfileRegistry
|
|
11
|
+
# Initialize a new profile registry
|
|
12
|
+
def initialize
|
|
13
|
+
@profiles = {}
|
|
14
|
+
@mutex = Mutex.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Register a profile
|
|
18
|
+
#
|
|
19
|
+
# @param profile [CompressionProfile] Profile to register
|
|
20
|
+
# @raise [ArgumentError] if profile with same name already exists
|
|
21
|
+
# @return [CompressionProfile] The registered profile
|
|
22
|
+
def register(profile)
|
|
23
|
+
unless profile.is_a?(CompressionProfile)
|
|
24
|
+
raise ArgumentError,
|
|
25
|
+
"Profile must be a CompressionProfile instance"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@mutex.synchronize do
|
|
29
|
+
if @profiles.key?(profile.name)
|
|
30
|
+
raise ArgumentError,
|
|
31
|
+
"Profile '#{profile.name}' is already registered"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
@profiles[profile.name] = profile
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
profile
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Register a profile, replacing if it exists
|
|
41
|
+
#
|
|
42
|
+
# @param profile [CompressionProfile] Profile to register
|
|
43
|
+
# @return [CompressionProfile] The registered profile
|
|
44
|
+
def register!(profile)
|
|
45
|
+
unless profile.is_a?(CompressionProfile)
|
|
46
|
+
raise ArgumentError,
|
|
47
|
+
"Profile must be a CompressionProfile instance"
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
@mutex.synchronize do
|
|
51
|
+
@profiles[profile.name] = profile
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
profile
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Unregister a profile by name
|
|
58
|
+
#
|
|
59
|
+
# @param name [Symbol] Profile name
|
|
60
|
+
# @return [CompressionProfile, nil] The unregistered profile or nil
|
|
61
|
+
def unregister(name)
|
|
62
|
+
@mutex.synchronize do
|
|
63
|
+
@profiles.delete(name)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get a profile by name
|
|
68
|
+
#
|
|
69
|
+
# @param name [Symbol] Profile name
|
|
70
|
+
# @return [CompressionProfile, nil] Profile or nil if not found
|
|
71
|
+
def get(name)
|
|
72
|
+
@mutex.synchronize do
|
|
73
|
+
@profiles[name]
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Check if a profile is registered
|
|
78
|
+
#
|
|
79
|
+
# @param name [Symbol] Profile name
|
|
80
|
+
# @return [Boolean] true if profile exists
|
|
81
|
+
def registered?(name)
|
|
82
|
+
@mutex.synchronize do
|
|
83
|
+
@profiles.key?(name)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Get all registered profile names
|
|
88
|
+
#
|
|
89
|
+
# @return [Array<Symbol>] List of profile names
|
|
90
|
+
def names
|
|
91
|
+
@mutex.synchronize do
|
|
92
|
+
@profiles.keys
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Get all registered profiles
|
|
97
|
+
#
|
|
98
|
+
# @return [Array<CompressionProfile>] List of profiles
|
|
99
|
+
def all
|
|
100
|
+
@mutex.synchronize do
|
|
101
|
+
@profiles.values
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Find profiles suitable for a MIME type
|
|
106
|
+
#
|
|
107
|
+
# @param mime_type [String] MIME type string
|
|
108
|
+
# @return [Array<CompressionProfile>] Suitable profiles
|
|
109
|
+
def suitable_for(mime_type)
|
|
110
|
+
all.select { |profile| profile.suitable_for?(mime_type) }
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Clear all registered profiles
|
|
114
|
+
#
|
|
115
|
+
# @return [void]
|
|
116
|
+
def clear
|
|
117
|
+
@mutex.synchronize do
|
|
118
|
+
@profiles.clear
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Get the number of registered profiles
|
|
123
|
+
#
|
|
124
|
+
# @return [Integer] Profile count
|
|
125
|
+
def count
|
|
126
|
+
@mutex.synchronize do
|
|
127
|
+
@profiles.size
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Iterate over all profiles
|
|
132
|
+
#
|
|
133
|
+
# @yield [profile] Yields each profile
|
|
134
|
+
# @yieldparam profile [CompressionProfile] A registered profile
|
|
135
|
+
# @return [void]
|
|
136
|
+
# rubocop:disable-next Naming/BlockForwarding, Style/ArgumentsForwarding -- Ruby 3.0 compatibility
|
|
137
|
+
def each(&block)
|
|
138
|
+
all.each(&block)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# Get profile information as hash
|
|
142
|
+
#
|
|
143
|
+
# @return [Hash{Symbol => Hash}] Profiles indexed by name
|
|
144
|
+
def to_h
|
|
145
|
+
@mutex.synchronize do
|
|
146
|
+
@profiles.transform_values(&:to_h)
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# String representation
|
|
151
|
+
#
|
|
152
|
+
# @return [String]
|
|
153
|
+
def inspect
|
|
154
|
+
@mutex.synchronize do
|
|
155
|
+
"#<#{self.class.name} profiles=#{@profiles.keys.join(', ')}>"
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
module Profile
|
|
5
|
+
# Text compression profile
|
|
6
|
+
#
|
|
7
|
+
# Optimized for compressing text files.
|
|
8
|
+
# Uses PPMd7 which excels at text compression through context modeling.
|
|
9
|
+
class TextProfile < CompressionProfile
|
|
10
|
+
# Initialize text profile
|
|
11
|
+
def initialize
|
|
12
|
+
super(
|
|
13
|
+
name: :text,
|
|
14
|
+
algorithm: :ppmd7,
|
|
15
|
+
level: 6,
|
|
16
|
+
filter: nil,
|
|
17
|
+
solid: false,
|
|
18
|
+
description: "Optimized for text files"
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Check if this profile is suitable for a MIME type
|
|
23
|
+
#
|
|
24
|
+
# @param mime_type [String] MIME type string
|
|
25
|
+
# @return [Boolean] true if MIME type is text-based
|
|
26
|
+
def suitable_for?(mime_type)
|
|
27
|
+
return true unless mime_type
|
|
28
|
+
|
|
29
|
+
FileType::MimeClassifier.text?(mime_type)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
# Compression profile management
|
|
5
|
+
#
|
|
6
|
+
# This module provides a high-level API for working with compression
|
|
7
|
+
# profiles. Profiles encapsulate compression settings and allow users
|
|
8
|
+
# to easily select optimal compression strategies for different file types.
|
|
9
|
+
module Profile
|
|
10
|
+
# Nested classes - autoloaded
|
|
11
|
+
autoload :CompressionProfile, "omnizip/profile/compression_profile"
|
|
12
|
+
autoload :ProfileRegistry, "omnizip/profile/profile_registry"
|
|
13
|
+
autoload :ProfileDetector, "omnizip/profile/profile_detector"
|
|
14
|
+
autoload :CustomProfile, "omnizip/profile/custom_profile"
|
|
15
|
+
autoload :FastProfile, "omnizip/profile/fast_profile"
|
|
16
|
+
autoload :BalancedProfile, "omnizip/profile/balanced_profile"
|
|
17
|
+
autoload :MaximumProfile, "omnizip/profile/maximum_profile"
|
|
18
|
+
autoload :TextProfile, "omnizip/profile/text_profile"
|
|
19
|
+
autoload :BinaryProfile, "omnizip/profile/binary_profile"
|
|
20
|
+
autoload :ArchiveProfile, "omnizip/profile/archive_profile"
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
# Get the global profile registry
|
|
24
|
+
#
|
|
25
|
+
# @return [ProfileRegistry] The global registry
|
|
26
|
+
def registry
|
|
27
|
+
@registry ||= ProfileRegistry.new.tap do |reg|
|
|
28
|
+
register_built_in_profiles(reg)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Get a profile by name
|
|
33
|
+
#
|
|
34
|
+
# @param name [Symbol] Profile name
|
|
35
|
+
# @return [CompressionProfile, nil] The profile or nil
|
|
36
|
+
def get(name)
|
|
37
|
+
registry.get(name)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Define a custom profile
|
|
41
|
+
#
|
|
42
|
+
# @param name [Symbol] Profile name
|
|
43
|
+
# @param base [Symbol, nil] Base profile to extend
|
|
44
|
+
# @yield [builder] Yields a builder for profile configuration
|
|
45
|
+
# @yieldparam builder [CustomProfile::Builder] The profile builder
|
|
46
|
+
# @return [CustomProfile] The created profile
|
|
47
|
+
#
|
|
48
|
+
# @example Define a custom profile
|
|
49
|
+
# Omnizip::Profile.define(:my_profile) do |p|
|
|
50
|
+
# p.algorithm = :lzma2
|
|
51
|
+
# p.level = 7
|
|
52
|
+
# p.filter = :bcj_x86
|
|
53
|
+
# p.solid = true
|
|
54
|
+
# p.description = "My custom profile"
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
# @example Extend an existing profile
|
|
58
|
+
# Omnizip::Profile.define(:my_fast, base: :fast) do |p|
|
|
59
|
+
# p.level = 2
|
|
60
|
+
# p.description = "Slightly better than fast"
|
|
61
|
+
# end
|
|
62
|
+
def define(name, base: nil)
|
|
63
|
+
base_profile = base ? registry.get(base) : nil
|
|
64
|
+
builder = CustomProfile::Builder.new(name, base_profile)
|
|
65
|
+
|
|
66
|
+
yield builder if block_given?
|
|
67
|
+
|
|
68
|
+
builder.valid?
|
|
69
|
+
profile = builder.build
|
|
70
|
+
|
|
71
|
+
registry.register!(profile)
|
|
72
|
+
profile
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# List all available profile names
|
|
76
|
+
#
|
|
77
|
+
# @return [Array<Symbol>] List of profile names
|
|
78
|
+
def list
|
|
79
|
+
registry.names
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Get recommended profile for a file type
|
|
83
|
+
#
|
|
84
|
+
# @param file_type [String, Symbol] MIME type string or category symbol
|
|
85
|
+
# @return [CompressionProfile, nil] Recommended profile
|
|
86
|
+
def for_file_type(file_type)
|
|
87
|
+
# If file_type is a symbol (category), find first suitable profile
|
|
88
|
+
return find_profile_for_category(file_type) if file_type.is_a?(Symbol)
|
|
89
|
+
|
|
90
|
+
# If file_type is a MIME string, find suitable profiles
|
|
91
|
+
if file_type.is_a?(String)
|
|
92
|
+
suitable = registry.suitable_for(file_type)
|
|
93
|
+
return registry.get(:balanced) if suitable.empty?
|
|
94
|
+
|
|
95
|
+
return select_best_profile_for_mime(suitable, file_type)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Default to balanced
|
|
99
|
+
registry.get(:balanced)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Auto-detect optimal profile for a file
|
|
103
|
+
#
|
|
104
|
+
# @param file_path [String] Path to the file
|
|
105
|
+
# @param options [Hash] Detection options
|
|
106
|
+
# @return [CompressionProfile] Detected profile
|
|
107
|
+
def detect(file_path, options = {})
|
|
108
|
+
detector.detect(file_path, options)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Resolve a profile specification into a concrete profile.
|
|
112
|
+
# +:auto+ (or "auto") samples +first_file+ through detection and
|
|
113
|
+
# falls back to +:balanced+ without one; a CompressionProfile
|
|
114
|
+
# passes through unchanged; anything else names a registered
|
|
115
|
+
# profile, falling back to +:balanced+ when unknown.
|
|
116
|
+
#
|
|
117
|
+
# @param spec [Symbol, String, CompressionProfile] Profile spec
|
|
118
|
+
# @param first_file [String, nil] Sampling file for :auto
|
|
119
|
+
# @return [CompressionProfile] Resolved profile
|
|
120
|
+
def resolve(spec, first_file: nil)
|
|
121
|
+
case spec
|
|
122
|
+
when :auto, "auto"
|
|
123
|
+
first_file ? detect(first_file) : registry.get(:balanced)
|
|
124
|
+
when CompressionProfile
|
|
125
|
+
spec
|
|
126
|
+
else
|
|
127
|
+
registry.get(spec.to_sym) || registry.get(:balanced)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Resolve and apply the +:profile+ entry of +options+ into
|
|
132
|
+
# concrete compression settings. +:auto+ profiles sample the
|
|
133
|
+
# first readable file at or below +paths+. Returns a new
|
|
134
|
+
# options hash; +options+ itself is left untouched.
|
|
135
|
+
#
|
|
136
|
+
# @param options [Hash] Compression options carrying :profile
|
|
137
|
+
# @param paths [String, Array<String>] Inputs to sample
|
|
138
|
+
# @return [Hash] Options with the profile applied and removed
|
|
139
|
+
def apply(options, paths: [])
|
|
140
|
+
options = options.dup
|
|
141
|
+
spec = options.delete(:profile)
|
|
142
|
+
return options unless spec
|
|
143
|
+
|
|
144
|
+
resolve(spec, first_file: first_file_among(paths)).apply_to(options)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# The first regular file at or below any of +paths+ — the
|
|
148
|
+
# sampling target for +:auto+ profiles — or nil when nothing
|
|
149
|
+
# readable exists.
|
|
150
|
+
#
|
|
151
|
+
# @param paths [String, Array<String>] Files or directories
|
|
152
|
+
# @return [String, nil] Path of the first file found
|
|
153
|
+
def first_file_among(paths)
|
|
154
|
+
Array(paths).each do |path|
|
|
155
|
+
next unless ::File.exist?(path)
|
|
156
|
+
|
|
157
|
+
return path if ::File.file?(path)
|
|
158
|
+
|
|
159
|
+
if ::File.directory?(path)
|
|
160
|
+
found = first_file_within(path)
|
|
161
|
+
return found if found
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
nil
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Get the profile detector
|
|
168
|
+
#
|
|
169
|
+
# @return [ProfileDetector] The detector instance
|
|
170
|
+
def detector
|
|
171
|
+
@detector ||= ProfileDetector.new(registry)
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Reset the global registry (mainly for testing)
|
|
175
|
+
#
|
|
176
|
+
# @return [void]
|
|
177
|
+
def reset!
|
|
178
|
+
@registry = nil
|
|
179
|
+
@detector = nil
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
private
|
|
183
|
+
|
|
184
|
+
# Depth-first search for the first regular file under +dir+,
|
|
185
|
+
# in sorted child order — :auto sampling must not depend on
|
|
186
|
+
# the OS's directory iteration order.
|
|
187
|
+
def first_file_within(dir)
|
|
188
|
+
::Dir.children(dir).sort.each do |entry|
|
|
189
|
+
full_path = ::File.join(dir, entry)
|
|
190
|
+
return full_path if ::File.file?(full_path)
|
|
191
|
+
|
|
192
|
+
if ::File.directory?(full_path)
|
|
193
|
+
found = first_file_within(full_path)
|
|
194
|
+
return found if found
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
nil
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Register all built-in profiles
|
|
201
|
+
#
|
|
202
|
+
# @param registry [ProfileRegistry] Registry to populate
|
|
203
|
+
# @return [void]
|
|
204
|
+
def register_built_in_profiles(registry)
|
|
205
|
+
registry.register(FastProfile.new)
|
|
206
|
+
registry.register(BalancedProfile.new)
|
|
207
|
+
registry.register(MaximumProfile.new)
|
|
208
|
+
registry.register(TextProfile.new)
|
|
209
|
+
registry.register(BinaryProfile.new)
|
|
210
|
+
registry.register(ArchiveProfile.new)
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# Find profile for a category symbol
|
|
214
|
+
#
|
|
215
|
+
# @param category [Symbol] File category
|
|
216
|
+
# @return [CompressionProfile, nil] Recommended profile
|
|
217
|
+
def find_profile_for_category(category)
|
|
218
|
+
case category
|
|
219
|
+
when :text, :document, :code
|
|
220
|
+
registry.get(:text)
|
|
221
|
+
when :executable
|
|
222
|
+
registry.get(:binary)
|
|
223
|
+
when :archive, :compressed
|
|
224
|
+
registry.get(:archive)
|
|
225
|
+
else
|
|
226
|
+
registry.get(:balanced)
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Select best profile from suitable candidates based on MIME type
|
|
231
|
+
#
|
|
232
|
+
# @param profiles [Array<CompressionProfile>] Suitable profiles
|
|
233
|
+
# @param mime_type [String] MIME type string
|
|
234
|
+
# @return [CompressionProfile] Best profile
|
|
235
|
+
def select_best_profile_for_mime(profiles, mime_type)
|
|
236
|
+
# Determine category from MIME type
|
|
237
|
+
category = FileType::MimeClassifier.profile_category(mime_type)
|
|
238
|
+
|
|
239
|
+
priority = case category
|
|
240
|
+
when :archive
|
|
241
|
+
%i[archive fast balanced]
|
|
242
|
+
when :text
|
|
243
|
+
%i[text balanced]
|
|
244
|
+
when :binary
|
|
245
|
+
%i[binary maximum balanced]
|
|
246
|
+
else
|
|
247
|
+
[:balanced]
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
# Find first profile matching priority
|
|
251
|
+
priority.each do |name|
|
|
252
|
+
profile = profiles.find { |p| p.name == name }
|
|
253
|
+
return profile if profile
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
# Return first suitable profile if none matched priority
|
|
257
|
+
profiles.first
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Omnizip
|
|
4
|
+
class Profiler
|
|
5
|
+
# Profiles memory allocation and retention
|
|
6
|
+
class MemoryProfiler
|
|
7
|
+
def initialize
|
|
8
|
+
@call_counts = Hash.new(0)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def profile(operation_name)
|
|
12
|
+
GC.start
|
|
13
|
+
GC.disable
|
|
14
|
+
|
|
15
|
+
gc_stat_before = GC.stat
|
|
16
|
+
objspace_before = ObjectSpace.count_objects
|
|
17
|
+
|
|
18
|
+
yield
|
|
19
|
+
|
|
20
|
+
objspace_after = ObjectSpace.count_objects
|
|
21
|
+
gc_stat_after = GC.stat
|
|
22
|
+
|
|
23
|
+
GC.enable
|
|
24
|
+
|
|
25
|
+
@call_counts[operation_name] += 1
|
|
26
|
+
|
|
27
|
+
# Calculate memory metrics
|
|
28
|
+
total_allocated = gc_stat_after[:total_allocated_objects] -
|
|
29
|
+
gc_stat_before[:total_allocated_objects]
|
|
30
|
+
total_freed = gc_stat_after[:total_freed_objects] -
|
|
31
|
+
gc_stat_before[:total_freed_objects]
|
|
32
|
+
|
|
33
|
+
# Object allocation delta
|
|
34
|
+
objspace_after[:TOTAL]
|
|
35
|
+
objspace_before[:TOTAL]
|
|
36
|
+
|
|
37
|
+
# Estimate memory based on object allocations
|
|
38
|
+
# Average Ruby object is ~40 bytes
|
|
39
|
+
estimated_memory = total_allocated * 40
|
|
40
|
+
|
|
41
|
+
Models::PerformanceResult.new(
|
|
42
|
+
operation_name: operation_name,
|
|
43
|
+
memory_allocated: estimated_memory,
|
|
44
|
+
memory_retained: (total_allocated - total_freed) * 40,
|
|
45
|
+
object_allocations: total_allocated,
|
|
46
|
+
gc_runs: 0,
|
|
47
|
+
call_count: @call_counts[operation_name],
|
|
48
|
+
)
|
|
49
|
+
ensure
|
|
50
|
+
GC.enable
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def reset!
|
|
54
|
+
@call_counts.clear
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def call_count(operation_name)
|
|
58
|
+
@call_counts[operation_name]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def total_calls
|
|
62
|
+
@call_counts.values.sum
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "benchmark"
|
|
4
|
+
|
|
5
|
+
module Omnizip
|
|
6
|
+
class Profiler
|
|
7
|
+
# Profiles method execution time and call counts
|
|
8
|
+
class MethodProfiler
|
|
9
|
+
def initialize
|
|
10
|
+
@call_counts = Hash.new(0)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def profile(operation_name)
|
|
14
|
+
start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
15
|
+
gc_stat_before = GC.stat
|
|
16
|
+
|
|
17
|
+
yield
|
|
18
|
+
|
|
19
|
+
end_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
20
|
+
gc_stat_after = GC.stat
|
|
21
|
+
|
|
22
|
+
@call_counts[operation_name] += 1
|
|
23
|
+
|
|
24
|
+
wall_time = end_time - start_time
|
|
25
|
+
gc_runs = gc_stat_after[:count] - gc_stat_before[:count]
|
|
26
|
+
|
|
27
|
+
Models::PerformanceResult.new(
|
|
28
|
+
operation_name: operation_name,
|
|
29
|
+
total_time: wall_time,
|
|
30
|
+
wall_time: wall_time,
|
|
31
|
+
gc_runs: gc_runs,
|
|
32
|
+
call_count: @call_counts[operation_name],
|
|
33
|
+
)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def reset!
|
|
37
|
+
@call_counts.clear
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def call_count(operation_name)
|
|
41
|
+
@call_counts[operation_name]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def total_calls
|
|
45
|
+
@call_counts.values.sum
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|