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,96 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require "bundler/setup"
|
|
5
|
+
require "omnizip"
|
|
6
|
+
|
|
7
|
+
# Example: Using Deflate64 compression algorithm
|
|
8
|
+
#
|
|
9
|
+
# Deflate64 (Enhanced Deflate) extends standard Deflate with:
|
|
10
|
+
# - 64KB sliding window (vs 32KB)
|
|
11
|
+
# - Better compression for large files
|
|
12
|
+
# - ZIP compression method 9
|
|
13
|
+
|
|
14
|
+
puts "=" * 60
|
|
15
|
+
puts "Deflate64 Algorithm Example"
|
|
16
|
+
puts "=" * 60
|
|
17
|
+
puts
|
|
18
|
+
|
|
19
|
+
# Example 1: Basic Deflate64 compression
|
|
20
|
+
puts "1. Basic Deflate64 compression"
|
|
21
|
+
puts "-" * 60
|
|
22
|
+
|
|
23
|
+
original_data = "Hello, World! " * 1000
|
|
24
|
+
puts "Original size: #{original_data.bytesize} bytes"
|
|
25
|
+
|
|
26
|
+
# Compress using Deflate64
|
|
27
|
+
compressed = StringIO.new
|
|
28
|
+
algorithm = Omnizip::Algorithms::Deflate64.new
|
|
29
|
+
algorithm.compress(StringIO.new(original_data), compressed)
|
|
30
|
+
|
|
31
|
+
puts "Compressed size: #{compressed.string.bytesize} bytes"
|
|
32
|
+
puts "Compression ratio: #{(compressed.string.bytesize.to_f / original_data.bytesize * 100).round(2)}%"
|
|
33
|
+
|
|
34
|
+
# Decompress
|
|
35
|
+
decompressed = StringIO.new
|
|
36
|
+
algorithm.decompress(StringIO.new(compressed.string), decompressed)
|
|
37
|
+
|
|
38
|
+
puts "Decompressed size: #{decompressed.string.bytesize} bytes"
|
|
39
|
+
puts "Data integrity: #{decompressed.string == original_data ? '✓ OK' : '✗ FAILED'}"
|
|
40
|
+
puts
|
|
41
|
+
|
|
42
|
+
# Example 2: Deflate64 with large data (benefits from 64KB window)
|
|
43
|
+
puts "2. Deflate64 with large repetitive data"
|
|
44
|
+
puts "-" * 60
|
|
45
|
+
|
|
46
|
+
large_data = ("Pattern#{rand(1000)} " * 100) * 500
|
|
47
|
+
puts "Original size: #{large_data.bytesize} bytes"
|
|
48
|
+
|
|
49
|
+
compressed_large = StringIO.new
|
|
50
|
+
algorithm.compress(StringIO.new(large_data), compressed_large)
|
|
51
|
+
|
|
52
|
+
puts "Compressed size: #{compressed_large.string.bytesize} bytes"
|
|
53
|
+
puts "Compression ratio: #{(compressed_large.string.bytesize.to_f / large_data.bytesize * 100).round(2)}%"
|
|
54
|
+
puts
|
|
55
|
+
|
|
56
|
+
# Example 3: Creating a ZIP archive with Deflate64
|
|
57
|
+
puts "3. Creating ZIP archive with Deflate64"
|
|
58
|
+
puts "-" * 60
|
|
59
|
+
|
|
60
|
+
# Note: This requires ZIP format integration
|
|
61
|
+
# Once integrated, usage would be:
|
|
62
|
+
#
|
|
63
|
+
# Omnizip::Archive.create("test.zip") do |archive|
|
|
64
|
+
# archive.compression_method = :deflate64
|
|
65
|
+
# archive.add_file("example.txt", "Large file content...")
|
|
66
|
+
# end
|
|
67
|
+
|
|
68
|
+
puts "ZIP integration: Coming in v2.0"
|
|
69
|
+
puts "Deflate64 will be available as compression method 9"
|
|
70
|
+
puts
|
|
71
|
+
|
|
72
|
+
# Example 4: Algorithm metadata
|
|
73
|
+
puts "4. Deflate64 algorithm metadata"
|
|
74
|
+
puts "-" * 60
|
|
75
|
+
|
|
76
|
+
metadata = Omnizip::Algorithms::Deflate64.metadata
|
|
77
|
+
puts "Name: #{metadata[:name]}"
|
|
78
|
+
puts "Type: #{metadata[:type]}"
|
|
79
|
+
puts "Dictionary size: #{metadata[:dictionary_size]} bytes (#{metadata[:dictionary_size] / 1024}KB)"
|
|
80
|
+
puts "ZIP method ID: #{metadata[:compression_method]}"
|
|
81
|
+
puts "Streaming: #{metadata[:streaming_supported] ? 'Yes' : 'No'}"
|
|
82
|
+
puts
|
|
83
|
+
|
|
84
|
+
# Example 5: Comparison with standard Deflate
|
|
85
|
+
puts "5. Deflate64 advantages"
|
|
86
|
+
puts "-" * 60
|
|
87
|
+
puts "✓ 64KB dictionary (2x larger than standard Deflate)"
|
|
88
|
+
puts "✓ Better compression for files > 32KB"
|
|
89
|
+
puts "✓ Fully compatible with 7-Zip and PKZip"
|
|
90
|
+
puts "✓ Streaming support for large files"
|
|
91
|
+
puts "✓ Same Huffman coding as standard Deflate"
|
|
92
|
+
puts
|
|
93
|
+
|
|
94
|
+
puts "=" * 60
|
|
95
|
+
puts "Example complete!"
|
|
96
|
+
puts "=" * 60
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# PAR2 Parity Archive Demo
|
|
5
|
+
# Demonstrates creating, verifying, and repairing files with PAR2 error correction
|
|
6
|
+
|
|
7
|
+
require "bundler/setup"
|
|
8
|
+
require "omnizip/parity"
|
|
9
|
+
require "tempfile"
|
|
10
|
+
require "fileutils"
|
|
11
|
+
|
|
12
|
+
def demo_par2_workflow
|
|
13
|
+
puts "=== PAR2 Parity Archive Demo ==="
|
|
14
|
+
puts
|
|
15
|
+
|
|
16
|
+
# Create temporary directory for demo
|
|
17
|
+
temp_dir = Dir.mktmpdir("par2_demo")
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
# Step 1: Create test files
|
|
21
|
+
puts "Step 1: Creating test files..."
|
|
22
|
+
file1 = File.join(temp_dir, "important_data.txt")
|
|
23
|
+
file2 = File.join(temp_dir, "documents.txt")
|
|
24
|
+
|
|
25
|
+
File.write(file1, "This is important data! " * 100)
|
|
26
|
+
File.write(file2, "These are valuable documents. " * 100)
|
|
27
|
+
puts " ✓ Created test files (#{File.size(file1) + File.size(file2)} bytes total)"
|
|
28
|
+
puts
|
|
29
|
+
|
|
30
|
+
# Step 2: Create PAR2 protection
|
|
31
|
+
puts "Step 2: Creating PAR2 recovery files with 10% redundancy..."
|
|
32
|
+
creator = Omnizip::Parity::Par2Creator.new(
|
|
33
|
+
redundancy: 10,
|
|
34
|
+
block_size: 1024,
|
|
35
|
+
progress: ->(pct, msg) { puts " [#{pct}%] #{msg}" },
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
creator.add_file(file1)
|
|
39
|
+
creator.add_file(file2)
|
|
40
|
+
|
|
41
|
+
par2_files = creator.create(File.join(temp_dir, "backup"))
|
|
42
|
+
puts " ✓ Created #{par2_files.size} PAR2 files"
|
|
43
|
+
par2_files.each { |f| puts " - #{File.basename(f)}" }
|
|
44
|
+
puts
|
|
45
|
+
|
|
46
|
+
# Step 3: Verify intact files
|
|
47
|
+
puts "Step 3: Verifying file integrity..."
|
|
48
|
+
verifier = Omnizip::Parity::Par2Verifier.new(par2_files.first)
|
|
49
|
+
result = verifier.verify
|
|
50
|
+
|
|
51
|
+
if result.all_ok?
|
|
52
|
+
puts " ✓ All files intact!"
|
|
53
|
+
puts " Total blocks: #{result.total_blocks}"
|
|
54
|
+
puts " Recovery blocks: #{result.recovery_blocks}"
|
|
55
|
+
else
|
|
56
|
+
puts " ✗ Verification failed (unexpected!)"
|
|
57
|
+
end
|
|
58
|
+
puts
|
|
59
|
+
|
|
60
|
+
# Step 4: Simulate corruption
|
|
61
|
+
puts "Step 4: Simulating file corruption..."
|
|
62
|
+
corrupted_content = "CORRUPTED DATA! " * 100
|
|
63
|
+
File.write(file1, corrupted_content)
|
|
64
|
+
puts " ✓ Corrupted #{File.basename(file1)}"
|
|
65
|
+
puts
|
|
66
|
+
|
|
67
|
+
# Step 5: Verify corrupted file
|
|
68
|
+
puts "Step 5: Verifying corrupted files..."
|
|
69
|
+
result2 = verifier.verify
|
|
70
|
+
|
|
71
|
+
if result2.all_ok?
|
|
72
|
+
puts " ✗ No corruption detected (unexpected!)"
|
|
73
|
+
else
|
|
74
|
+
puts " ✓ Detected corruption:"
|
|
75
|
+
puts " Damaged files: #{result2.damaged_files.join(', ')}"
|
|
76
|
+
puts " Damaged blocks: #{result2.damaged_blocks.size}"
|
|
77
|
+
puts " Repairable: #{result2.repairable?}"
|
|
78
|
+
end
|
|
79
|
+
puts
|
|
80
|
+
|
|
81
|
+
# Step 6: Repair damaged file
|
|
82
|
+
if result2.repairable?
|
|
83
|
+
puts "Step 6: Repairing corrupted files..."
|
|
84
|
+
repairer = Omnizip::Parity::Par2Repairer.new(
|
|
85
|
+
par2_files.first,
|
|
86
|
+
progress: ->(pct, msg) { puts " [#{pct}%] #{msg}" },
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
repair_result = repairer.repair
|
|
90
|
+
|
|
91
|
+
if repair_result.success?
|
|
92
|
+
puts " ✓ Repair successful!"
|
|
93
|
+
puts " Recovered files: #{repair_result.recovered_files.join(', ')}"
|
|
94
|
+
puts " Recovered blocks: #{repair_result.recovered_blocks}"
|
|
95
|
+
|
|
96
|
+
# Verify repair worked
|
|
97
|
+
result3 = verifier.verify
|
|
98
|
+
if result3.all_ok?
|
|
99
|
+
puts " ✓ Verification after repair: All files intact!"
|
|
100
|
+
else
|
|
101
|
+
puts " ✗ Verification after repair failed"
|
|
102
|
+
end
|
|
103
|
+
else
|
|
104
|
+
puts " ✗ Repair failed: #{repair_result.error_message}"
|
|
105
|
+
end
|
|
106
|
+
else
|
|
107
|
+
puts "Step 6: Cannot repair - insufficient recovery blocks"
|
|
108
|
+
end
|
|
109
|
+
ensure
|
|
110
|
+
# Cleanup
|
|
111
|
+
puts
|
|
112
|
+
puts "Cleaning up temporary files..."
|
|
113
|
+
FileUtils.rm_rf(temp_dir)
|
|
114
|
+
puts "Demo complete!"
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Run the demo
|
|
119
|
+
if __FILE__ == $PROGRAM_NAME
|
|
120
|
+
demo_par2_workflow
|
|
121
|
+
end
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Native Omnizip API Demo
|
|
6
|
+
# Shows how to use Omnizip's native convenience methods
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
require "omnizip"
|
|
10
|
+
|
|
11
|
+
puts "=== Native Omnizip API Demo ==="
|
|
12
|
+
puts "Using Omnizip's native convenience methods"
|
|
13
|
+
puts
|
|
14
|
+
|
|
15
|
+
# Create a temporary directory for examples
|
|
16
|
+
require "tmpdir"
|
|
17
|
+
tmpdir = Dir.mktmpdir("omnizip_native_demo")
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
# Example 1: Compress a single file
|
|
21
|
+
puts "1. Compressing a single file..."
|
|
22
|
+
source_file = File.join(tmpdir, "document.txt")
|
|
23
|
+
File.write(source_file, "This is a sample document with some content.")
|
|
24
|
+
|
|
25
|
+
zip_file = File.join(tmpdir, "document.zip")
|
|
26
|
+
Omnizip.compress_file(source_file, zip_file)
|
|
27
|
+
|
|
28
|
+
puts " Compressed: #{source_file} -> #{zip_file}"
|
|
29
|
+
puts " Original size: #{File.size(source_file)} bytes"
|
|
30
|
+
puts " Compressed size: #{File.size(zip_file)} bytes"
|
|
31
|
+
puts
|
|
32
|
+
|
|
33
|
+
# Example 2: Compress a directory
|
|
34
|
+
puts "2. Compressing a directory..."
|
|
35
|
+
source_dir = File.join(tmpdir, "project")
|
|
36
|
+
FileUtils.mkdir_p(File.join(source_dir, "src"))
|
|
37
|
+
FileUtils.mkdir_p(File.join(source_dir, "docs"))
|
|
38
|
+
File.write(File.join(source_dir, "README.md"), "# Project README")
|
|
39
|
+
File.write(File.join(source_dir, "src", "main.rb"), "puts 'Hello, World!'")
|
|
40
|
+
File.write(File.join(source_dir, "docs", "guide.txt"), "User Guide")
|
|
41
|
+
|
|
42
|
+
backup_zip = File.join(tmpdir, "project_backup.zip")
|
|
43
|
+
Omnizip.compress_directory(source_dir, backup_zip)
|
|
44
|
+
|
|
45
|
+
puts " Compressed directory: #{source_dir}"
|
|
46
|
+
puts " Archive created: #{backup_zip}"
|
|
47
|
+
puts
|
|
48
|
+
|
|
49
|
+
# Example 3: List archive contents
|
|
50
|
+
puts "3. Listing archive contents..."
|
|
51
|
+
names = Omnizip.list_archive(backup_zip)
|
|
52
|
+
puts " Archive contains #{names.size} entries:"
|
|
53
|
+
names.each { |name| puts " - #{name}" }
|
|
54
|
+
puts
|
|
55
|
+
|
|
56
|
+
# Example 4: List with details
|
|
57
|
+
puts "4. Listing with detailed information..."
|
|
58
|
+
details = Omnizip.list_archive(backup_zip, details: true)
|
|
59
|
+
details.each do |entry|
|
|
60
|
+
type = entry[:directory] ? "[DIR]" : "[FILE]"
|
|
61
|
+
ratio = entry[:size].positive? ? (100 * entry[:compressed_size].to_f / entry[:size]).round(1) : 0
|
|
62
|
+
puts " #{type} #{entry[:name]}"
|
|
63
|
+
puts " Size: #{entry[:size]} bytes, Compressed: #{entry[:compressed_size]} bytes (#{ratio}%)"
|
|
64
|
+
end
|
|
65
|
+
puts
|
|
66
|
+
|
|
67
|
+
# Example 5: Read a file from archive
|
|
68
|
+
puts "5. Reading file from archive..."
|
|
69
|
+
content = Omnizip.read_from_archive(backup_zip, "README.md")
|
|
70
|
+
puts " README.md content:"
|
|
71
|
+
puts " #{content}"
|
|
72
|
+
puts
|
|
73
|
+
|
|
74
|
+
# Example 6: Extract archive
|
|
75
|
+
puts "6. Extracting archive..."
|
|
76
|
+
extract_dir = File.join(tmpdir, "extracted")
|
|
77
|
+
extracted_files = Omnizip.extract_archive(backup_zip, extract_dir)
|
|
78
|
+
|
|
79
|
+
puts " Extracted #{extracted_files.size} entries to: #{extract_dir}"
|
|
80
|
+
extracted_files.each { |f| puts " - #{f}" }
|
|
81
|
+
puts
|
|
82
|
+
|
|
83
|
+
# Example 7: Add file to existing archive
|
|
84
|
+
puts "7. Adding file to existing archive..."
|
|
85
|
+
new_file = File.join(tmpdir, "changelog.txt")
|
|
86
|
+
File.write(new_file, "v1.0.0 - Initial release")
|
|
87
|
+
|
|
88
|
+
Omnizip.add_to_archive(backup_zip, "CHANGELOG.txt", new_file)
|
|
89
|
+
|
|
90
|
+
updated_names = Omnizip.list_archive(backup_zip)
|
|
91
|
+
puts " Added CHANGELOG.txt to archive"
|
|
92
|
+
puts " Archive now has #{updated_names.size} entries"
|
|
93
|
+
puts
|
|
94
|
+
|
|
95
|
+
# Example 8: Remove file from archive
|
|
96
|
+
puts "8. Removing file from archive..."
|
|
97
|
+
Omnizip.remove_from_archive(backup_zip, "docs/guide.txt")
|
|
98
|
+
|
|
99
|
+
final_names = Omnizip.list_archive(backup_zip)
|
|
100
|
+
puts " Removed docs/guide.txt"
|
|
101
|
+
puts " Archive now has #{final_names.size} entries"
|
|
102
|
+
puts
|
|
103
|
+
|
|
104
|
+
# Example 9: Using low-level API for advanced features
|
|
105
|
+
puts "9. Using low-level API for advanced control..."
|
|
106
|
+
advanced_zip = File.join(tmpdir, "advanced.zip")
|
|
107
|
+
|
|
108
|
+
Omnizip::Zip::File.create(advanced_zip) do |zip|
|
|
109
|
+
zip.add("data.txt") { "Some data" }
|
|
110
|
+
zip.add("more_data.txt") { "More data" }
|
|
111
|
+
|
|
112
|
+
# Set archive comment
|
|
113
|
+
zip.comment = "Created with Omnizip native API"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
Omnizip::Zip::File.open(advanced_zip) do |zip|
|
|
117
|
+
puts " Archive comment: #{zip.comment}"
|
|
118
|
+
puts " Contains #{zip.size} entries"
|
|
119
|
+
end
|
|
120
|
+
puts
|
|
121
|
+
|
|
122
|
+
# Example 10: Streaming API
|
|
123
|
+
puts "10. Using streaming API..."
|
|
124
|
+
stream_zip = File.join(tmpdir, "streamed.zip")
|
|
125
|
+
|
|
126
|
+
Omnizip::Zip::OutputStream.open(stream_zip) do |zos|
|
|
127
|
+
zos.put_next_entry("log.txt")
|
|
128
|
+
zos.puts("Log entry 1")
|
|
129
|
+
zos.puts("Log entry 2")
|
|
130
|
+
zos.puts("Log entry 3")
|
|
131
|
+
|
|
132
|
+
zos.put_next_entry("data.bin")
|
|
133
|
+
zos.write([1, 2, 3, 4, 5].pack("C*"))
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
puts " Created streaming archive: #{stream_zip}"
|
|
137
|
+
puts
|
|
138
|
+
|
|
139
|
+
puts "=== Demo Complete ==="
|
|
140
|
+
puts "All files created in: #{tmpdir}"
|
|
141
|
+
puts
|
|
142
|
+
puts "Key advantages of native API:"
|
|
143
|
+
puts " - Simple convenience methods for common operations"
|
|
144
|
+
puts " - Automatic resource management"
|
|
145
|
+
puts " - Clear, readable code"
|
|
146
|
+
puts " - Full control when needed via low-level API"
|
|
147
|
+
|
|
148
|
+
# Cleanup (optional - tmpdir usually handles this)
|
|
149
|
+
# FileUtils.rm_rf(tmpdir)
|
|
150
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Rubyzip Compatibility Demo
|
|
6
|
+
# Shows how to use Omnizip as a drop-in replacement for rubyzip
|
|
7
|
+
#
|
|
8
|
+
|
|
9
|
+
require "omnizip/rubyzip_compat"
|
|
10
|
+
|
|
11
|
+
puts "=== Rubyzip Compatibility Demo ==="
|
|
12
|
+
puts "Using Omnizip with rubyzip-compatible API"
|
|
13
|
+
puts
|
|
14
|
+
|
|
15
|
+
# Create a temporary directory for examples
|
|
16
|
+
require "tmpdir"
|
|
17
|
+
tmpdir = Dir.mktmpdir("omnizip_rubyzip_demo")
|
|
18
|
+
|
|
19
|
+
begin
|
|
20
|
+
# Example 1: Create a ZIP archive using Zip::File
|
|
21
|
+
puts "1. Creating ZIP archive with Zip::File..."
|
|
22
|
+
zip_path = File.join(tmpdir, "example.zip")
|
|
23
|
+
|
|
24
|
+
Zip::File.open(zip_path, create: true) do |zipfile|
|
|
25
|
+
# Add files from block
|
|
26
|
+
zipfile.add("readme.txt") { "This is a README file" }
|
|
27
|
+
zipfile.add("config.yml") { "version: 1.0\nname: example" }
|
|
28
|
+
|
|
29
|
+
# Add directory
|
|
30
|
+
zipfile.add("data/")
|
|
31
|
+
zipfile.add("data/values.txt") { "value1\nvalue2\nvalue3" }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
puts " Created: #{zip_path}"
|
|
35
|
+
puts
|
|
36
|
+
|
|
37
|
+
# Example 2: Read archive contents
|
|
38
|
+
puts "2. Reading archive contents..."
|
|
39
|
+
Zip::File.open(zip_path) do |zipfile|
|
|
40
|
+
puts " Archive contains #{zipfile.entries.size} entries:"
|
|
41
|
+
zipfile.each do |entry|
|
|
42
|
+
type = entry.directory? ? "[DIR]" : "[FILE]"
|
|
43
|
+
puts " #{type} #{entry.name} (#{entry.size} bytes)"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
puts
|
|
47
|
+
|
|
48
|
+
# Example 3: Extract specific file
|
|
49
|
+
puts "3. Extracting specific file..."
|
|
50
|
+
Zip::File.open(zip_path) do |zipfile|
|
|
51
|
+
content = zipfile.read("readme.txt")
|
|
52
|
+
puts " readme.txt content: #{content}"
|
|
53
|
+
end
|
|
54
|
+
puts
|
|
55
|
+
|
|
56
|
+
# Example 4: Use streaming API with Zip::OutputStream
|
|
57
|
+
puts "4. Creating archive with streaming API..."
|
|
58
|
+
stream_zip = File.join(tmpdir, "stream.zip")
|
|
59
|
+
|
|
60
|
+
Zip::OutputStream.open(stream_zip) do |zos|
|
|
61
|
+
zos.put_next_entry("stream1.txt")
|
|
62
|
+
zos.write("First streamed entry")
|
|
63
|
+
|
|
64
|
+
zos.put_next_entry("stream2.txt")
|
|
65
|
+
zos << "Second"
|
|
66
|
+
zos << " entry"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
puts " Created: #{stream_zip}"
|
|
70
|
+
puts
|
|
71
|
+
|
|
72
|
+
# Example 5: Extract all files
|
|
73
|
+
puts "5. Extracting all files..."
|
|
74
|
+
output_dir = File.join(tmpdir, "extracted")
|
|
75
|
+
|
|
76
|
+
Zip::File.open(zip_path) do |zipfile|
|
|
77
|
+
zipfile.each do |entry|
|
|
78
|
+
next if entry.directory?
|
|
79
|
+
|
|
80
|
+
dest_path = File.join(output_dir, entry.name)
|
|
81
|
+
FileUtils.mkdir_p(File.dirname(dest_path))
|
|
82
|
+
zipfile.extract(entry, dest_path) { true } # Overwrite if exists
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
puts " Extracted to: #{output_dir}"
|
|
87
|
+
extracted_files = Dir.glob(File.join(output_dir, "**/*")).select do |f|
|
|
88
|
+
File.file?(f)
|
|
89
|
+
end
|
|
90
|
+
puts " Extracted #{extracted_files.size} files"
|
|
91
|
+
puts
|
|
92
|
+
|
|
93
|
+
# Example 6: Modify existing archive
|
|
94
|
+
puts "6. Modifying existing archive..."
|
|
95
|
+
Zip::File.open(zip_path) do |zipfile|
|
|
96
|
+
# Add new file
|
|
97
|
+
zipfile.add("new_file.txt") { "Added later" }
|
|
98
|
+
|
|
99
|
+
# Remove a file
|
|
100
|
+
zipfile.remove("config.yml")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
Zip::File.open(zip_path) do |zipfile|
|
|
104
|
+
puts " Archive now contains:"
|
|
105
|
+
zipfile.each { |e| puts " - #{e.name}" }
|
|
106
|
+
end
|
|
107
|
+
puts
|
|
108
|
+
|
|
109
|
+
puts "=== Demo Complete ==="
|
|
110
|
+
puts "All files created in: #{tmpdir}"
|
|
111
|
+
puts "Note: Temporary directory will be cleaned up automatically"
|
|
112
|
+
|
|
113
|
+
# Cleanup (optional - tmpdir usually handles this)
|
|
114
|
+
# FileUtils.rm_rf(tmpdir)
|
|
115
|
+
end
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Rubyzip Compatibility Demo
|
|
6
|
+
#
|
|
7
|
+
# This example demonstrates that Omnizip provides a 100% compatible API
|
|
8
|
+
# with rubyzip for common operations.
|
|
9
|
+
#
|
|
10
|
+
|
|
11
|
+
require_relative "../lib/omnizip/rubyzip_compat"
|
|
12
|
+
require "tempfile"
|
|
13
|
+
require "fileutils"
|
|
14
|
+
|
|
15
|
+
puts "=" * 80
|
|
16
|
+
puts "Omnizip Rubyzip Compatibility Demo"
|
|
17
|
+
puts "=" * 80
|
|
18
|
+
puts
|
|
19
|
+
|
|
20
|
+
# Create temp directory for demo
|
|
21
|
+
temp_dir = Dir.mktmpdir("omnizip_demo")
|
|
22
|
+
puts "Working directory: #{temp_dir}"
|
|
23
|
+
puts
|
|
24
|
+
|
|
25
|
+
begin
|
|
26
|
+
# Demo 1: Basic File Operations
|
|
27
|
+
puts "Demo 1: Basic File Operations"
|
|
28
|
+
puts "-" * 40
|
|
29
|
+
|
|
30
|
+
zip_path = File.join(temp_dir, "demo.zip")
|
|
31
|
+
|
|
32
|
+
Zip::File.open(zip_path, create: true) do |zip|
|
|
33
|
+
zip.add("readme.txt") { "Hello from Omnizip!" }
|
|
34
|
+
zip.add("data.txt") { "Sample data\nLine 2\nLine 3" }
|
|
35
|
+
zip.add("dir/")
|
|
36
|
+
zip.add("dir/nested.txt") { "Nested file content" }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
puts "✓ Created archive with 4 entries"
|
|
40
|
+
|
|
41
|
+
# Read back
|
|
42
|
+
Zip::File.open(zip_path) do |zip|
|
|
43
|
+
puts "✓ Archive contains #{zip.size} entries:"
|
|
44
|
+
zip.each do |entry|
|
|
45
|
+
puts " - #{entry.name} (#{entry.size} bytes)"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
puts
|
|
49
|
+
|
|
50
|
+
# Demo 2: Streaming Write
|
|
51
|
+
puts "Demo 2: Streaming Write"
|
|
52
|
+
puts "-" * 40
|
|
53
|
+
|
|
54
|
+
stream_path = File.join(temp_dir, "stream.zip")
|
|
55
|
+
|
|
56
|
+
Zip::OutputStream.open(stream_path) do |zos|
|
|
57
|
+
zos.put_next_entry("file1.txt")
|
|
58
|
+
zos.write("Content 1")
|
|
59
|
+
|
|
60
|
+
zos.put_next_entry("file2.txt")
|
|
61
|
+
zos.write("Content 2")
|
|
62
|
+
|
|
63
|
+
zos.put_next_entry("file3.txt")
|
|
64
|
+
zos.write("Content 3")
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
puts "✓ Created streaming archive with 3 entries"
|
|
68
|
+
puts
|
|
69
|
+
|
|
70
|
+
# Demo 3: Streaming Read
|
|
71
|
+
puts "Demo 3: Streaming Read"
|
|
72
|
+
puts "-" * 40
|
|
73
|
+
|
|
74
|
+
Zip::InputStream.open(stream_path) do |zis|
|
|
75
|
+
count = 0
|
|
76
|
+
while entry = zis.get_next_entry
|
|
77
|
+
content = zis.read
|
|
78
|
+
puts "✓ Read #{entry.name}: #{content.inspect}"
|
|
79
|
+
count += 1
|
|
80
|
+
end
|
|
81
|
+
puts "✓ Total entries read: #{count}"
|
|
82
|
+
end
|
|
83
|
+
puts
|
|
84
|
+
|
|
85
|
+
# Demo 4: Entry Info and Metadata
|
|
86
|
+
puts "Demo 4: Entry Info and Metadata"
|
|
87
|
+
puts "-" * 40
|
|
88
|
+
|
|
89
|
+
Zip::InputStream.open(stream_path) do |zis|
|
|
90
|
+
entry = zis.get_next_entry
|
|
91
|
+
puts "✓ Entry metadata:"
|
|
92
|
+
puts " - Name: #{entry.name}"
|
|
93
|
+
puts " - Size: #{entry.size} bytes"
|
|
94
|
+
puts " - Compressed: #{entry.compressed_size} bytes"
|
|
95
|
+
puts " - Time: #{entry.time}"
|
|
96
|
+
puts " - Directory: #{entry.directory?}"
|
|
97
|
+
puts " - File: #{entry.file?}"
|
|
98
|
+
puts " - Compression: #{entry.compression_method}"
|
|
99
|
+
end
|
|
100
|
+
puts
|
|
101
|
+
|
|
102
|
+
# Demo 5: Batch Operations
|
|
103
|
+
puts "Demo 5: Batch Operations"
|
|
104
|
+
puts "-" * 40
|
|
105
|
+
|
|
106
|
+
batch_path = File.join(temp_dir, "batch.zip")
|
|
107
|
+
|
|
108
|
+
Zip::OutputStream.open(batch_path) do |zos|
|
|
109
|
+
5.times do |i|
|
|
110
|
+
zos.put_next_entry("batch_#{i}.txt")
|
|
111
|
+
zos.write("Batch content #{i}")
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
count = 0
|
|
116
|
+
Zip::InputStream.open(batch_path) do |zis|
|
|
117
|
+
while zis.get_next_entry
|
|
118
|
+
count += 1
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
puts "✓ Created and read #{count} batch entries"
|
|
122
|
+
puts
|
|
123
|
+
|
|
124
|
+
# Demo 6: Directory Entries
|
|
125
|
+
puts "Demo 6: Directory Entries"
|
|
126
|
+
puts "-" * 40
|
|
127
|
+
|
|
128
|
+
dir_path = File.join(temp_dir, "with_dirs.zip")
|
|
129
|
+
|
|
130
|
+
Zip::OutputStream.open(dir_path) do |zos|
|
|
131
|
+
zos.put_next_entry("folder/")
|
|
132
|
+
zos.put_next_entry("folder/subfolder/")
|
|
133
|
+
zos.put_next_entry("folder/file.txt")
|
|
134
|
+
zos.write("In folder")
|
|
135
|
+
zos.put_next_entry("folder/subfolder/deep.txt")
|
|
136
|
+
zos.write("Deep file")
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
Zip::InputStream.open(dir_path) do |zis|
|
|
140
|
+
while entry = zis.get_next_entry
|
|
141
|
+
type = entry.directory? ? "[DIR]" : "[FILE]"
|
|
142
|
+
puts "✓ #{type} #{entry.name}"
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
puts
|
|
146
|
+
|
|
147
|
+
# Demo 7: Compression Methods
|
|
148
|
+
puts "Demo 7: Compression Methods"
|
|
149
|
+
puts "-" * 40
|
|
150
|
+
|
|
151
|
+
test_data = "Test data " * 100
|
|
152
|
+
|
|
153
|
+
%i[store deflate].each do |method|
|
|
154
|
+
comp_path = File.join(temp_dir, "#{method}.zip")
|
|
155
|
+
|
|
156
|
+
Zip::OutputStream.open(comp_path) do |zos|
|
|
157
|
+
zos.put_next_entry("test.txt", compression: method)
|
|
158
|
+
zos.write(test_data)
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
Zip::InputStream.open(comp_path) do |zis|
|
|
162
|
+
entry = zis.get_next_entry
|
|
163
|
+
ratio = entry.size.positive? ? (100 - (entry.compressed_size * 100 / entry.size)) : 0
|
|
164
|
+
puts "✓ #{method.to_s.capitalize}: #{entry.compressed_size}/#{entry.size} bytes (#{ratio}% savings)"
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
puts
|
|
168
|
+
|
|
169
|
+
# Summary
|
|
170
|
+
puts "=" * 80
|
|
171
|
+
puts "All demos completed successfully!"
|
|
172
|
+
puts "=" * 80
|
|
173
|
+
puts
|
|
174
|
+
puts "Key Features Demonstrated:"
|
|
175
|
+
puts " ✓ Zip::OutputStream (streaming write with put_next_entry)"
|
|
176
|
+
puts " ✓ Zip::InputStream (streaming read with get_next_entry)"
|
|
177
|
+
puts " ✓ Zip::Entry metadata (name, size, time, compression, etc.)"
|
|
178
|
+
puts " ✓ Directory entries"
|
|
179
|
+
puts " ✓ Batch operations"
|
|
180
|
+
puts " ✓ Multiple compression methods (Store, Deflate)"
|
|
181
|
+
puts " ✓ Content reading from streams"
|
|
182
|
+
puts
|
|
183
|
+
puts "Rubyzip API Compatibility: Streaming API ✓"
|
|
184
|
+
puts "Note: File-based API (Zip::File) works for creation and basic reads."
|
|
185
|
+
puts " Full round-trip with Zip::File will be completed in v1.2."
|
|
186
|
+
puts
|
|
187
|
+
rescue StandardError => e
|
|
188
|
+
puts "❌ Error: #{e.message}"
|
|
189
|
+
puts e.backtrace.first(5)
|
|
190
|
+
exit 1
|
|
191
|
+
ensure
|
|
192
|
+
# Cleanup
|
|
193
|
+
FileUtils.rm_rf(temp_dir) if temp_dir
|
|
194
|
+
end
|
data/exe/omnizip
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2024 Ribose Inc.
|
|
6
|
+
#
|
|
7
|
+
# This file is part of Omnizip.
|
|
8
|
+
#
|
|
9
|
+
# Omnizip is a pure Ruby port of 7-Zip compression algorithms.
|
|
10
|
+
# Based on the 7-Zip LZMA SDK by Igor Pavlov.
|
|
11
|
+
#
|
|
12
|
+
# This library is free software; you can redistribute it and/or
|
|
13
|
+
# modify it under the terms of the GNU Lesser General Public
|
|
14
|
+
# License as published by the Free Software Foundation; either
|
|
15
|
+
# version 2.1 of the License, or (at your option) any later version.
|
|
16
|
+
#
|
|
17
|
+
# See the COPYING file for the complete text of the license.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
require_relative "../lib/omnizip"
|
|
21
|
+
|
|
22
|
+
begin
|
|
23
|
+
Omnizip::Cli.start(ARGV)
|
|
24
|
+
rescue StandardError => e
|
|
25
|
+
warn "Error: #{e.message}"
|
|
26
|
+
exit 1
|
|
27
|
+
end
|