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.
Files changed (632) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +293 -0
  5. data/CHANGELOG.md +1647 -0
  6. data/CONTEXT.md +68 -0
  7. data/COPYING +502 -0
  8. data/Gemfile +19 -0
  9. data/LICENSE +12 -0
  10. data/README.adoc +1327 -0
  11. data/Rakefile +15 -0
  12. data/TODO.refactor/00-overview.md +67 -0
  13. data/TODO.refactor/01-registry-base-class.md +81 -0
  14. data/TODO.refactor/02-error-hierarchy.md +57 -0
  15. data/TODO.refactor/03-autoload-entry-point.md +69 -0
  16. data/TODO.refactor/04-filter-base-consolidation.md +49 -0
  17. data/TODO.refactor/05-send-private-methods.md +64 -0
  18. data/TODO.refactor/06-instance-variable-access.md +69 -0
  19. data/TODO.refactor/07-respond-to-replacement.md +237 -0
  20. data/TODO.refactor/08-spec-doubles.md +27 -0
  21. data/TODO.refactor/09-cli-shared-module.md +35 -0
  22. data/TODO.refactor/10-format-detector-ocp.md +34 -0
  23. data/TODO.refactor/11-convenience-decoupling.md +38 -0
  24. data/TODO.refactor/12-thread-safety.md +8 -0
  25. data/TODO.refactor/13-lutaml-model-migration.md +158 -0
  26. data/TODO.refactor/14-add-missing-specs.md +25 -0
  27. data/benchmark/README.md +260 -0
  28. data/benchmark/benchmark_suite.rb +125 -0
  29. data/benchmark/compression_bench.rb +181 -0
  30. data/benchmark/filter_bench.rb +180 -0
  31. data/benchmark/models/benchmark_result.rb +59 -0
  32. data/benchmark/models/comparison_result.rb +69 -0
  33. data/benchmark/profile_suite.rb +167 -0
  34. data/benchmark/reporter.rb +150 -0
  35. data/benchmark/run_benchmarks.rb +66 -0
  36. data/benchmark/test_data.rb +137 -0
  37. data/config/formats/rar3_spec.yml +92 -0
  38. data/config/formats/rar5_spec.yml +102 -0
  39. data/docs/.github/workflows/docs.yml +142 -0
  40. data/docs/.gitignore +21 -0
  41. data/docs/.lychee.toml +67 -0
  42. data/docs/Gemfile +13 -0
  43. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  44. data/docs/README.md +101 -0
  45. data/docs/_config.yml +112 -0
  46. data/docs/assets/logo.svg +1 -0
  47. data/docs/assets/omnizip-logo.pdf +1540 -11
  48. data/docs/comparison/feature-matrix.adoc +694 -0
  49. data/docs/comparison/index.adoc +113 -0
  50. data/docs/comparison/vs-7zip.adoc +309 -0
  51. data/docs/comparison/vs-peazip.adoc +77 -0
  52. data/docs/comparison/vs-rubyzip.adoc +342 -0
  53. data/docs/comparison/vs-winrar.adoc +100 -0
  54. data/docs/compatibility.adoc +579 -0
  55. data/docs/concepts/index.adoc +129 -0
  56. data/docs/developer/architecture.adoc +256 -0
  57. data/docs/developer/contributing.adoc +158 -0
  58. data/docs/developer/index.adoc +25 -0
  59. data/docs/developer/testing.adoc +212 -0
  60. data/docs/getting-started/basic-usage.adoc +263 -0
  61. data/docs/getting-started/index.adoc +42 -0
  62. data/docs/getting-started/installation.adoc +138 -0
  63. data/docs/getting-started/quick-start.adoc +183 -0
  64. data/docs/getting-started/your-first-archive.adoc +219 -0
  65. data/docs/guides/advanced-features/encryption.adoc +277 -0
  66. data/docs/guides/advanced-features/index.adoc +59 -0
  67. data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
  68. data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
  69. data/docs/guides/advanced-features/streaming.adoc +142 -0
  70. data/docs/guides/archive-formats/gzip-format.adoc +105 -0
  71. data/docs/guides/archive-formats/index.adoc +160 -0
  72. data/docs/guides/archive-formats/ole-format.adoc +151 -0
  73. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  74. data/docs/guides/archive-formats/rar5.adoc +521 -0
  75. data/docs/guides/archive-formats/rpm-format.adoc +108 -0
  76. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  77. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  78. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  79. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  80. data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
  81. data/docs/guides/compression-algorithms/deflate.adoc +313 -0
  82. data/docs/guides/compression-algorithms/index.adoc +190 -0
  83. data/docs/guides/compression-algorithms/lzma.adoc +394 -0
  84. data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
  85. data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
  86. data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
  87. data/docs/guides/creating-archives.adoc +348 -0
  88. data/docs/guides/extracting-archives.adoc +53 -0
  89. data/docs/guides/format-conversion.adoc +64 -0
  90. data/docs/guides/index.adoc +49 -0
  91. data/docs/guides/migration-rubyzip.adoc +217 -0
  92. data/docs/guides/parity-archives.adoc +605 -0
  93. data/docs/guides/performance-tuning.adoc +88 -0
  94. data/docs/index.adoc +228 -0
  95. data/docs/lychee.toml +67 -0
  96. data/docs/reference/api/overview.adoc +187 -0
  97. data/docs/reference/cli/compress-command.adoc +114 -0
  98. data/docs/reference/cli/overview.adoc +140 -0
  99. data/docs/reference/index.adoc +26 -0
  100. data/docs/resources/faq.adoc +185 -0
  101. data/docs/resources/quick-reference.adoc +222 -0
  102. data/docs/rust-backend.md +0 -0
  103. data/docs/troubleshooting/index.adoc +207 -0
  104. data/docs/xar_format.md +216 -0
  105. data/examples/api_comparison.rb +205 -0
  106. data/examples/deflate64_example.rb +96 -0
  107. data/examples/par2_demo.rb +121 -0
  108. data/examples/quick_start_native.rb +150 -0
  109. data/examples/quick_start_rubyzip.rb +115 -0
  110. data/examples/rubyzip_compatibility_demo.rb +194 -0
  111. data/exe/omnizip +27 -0
  112. data/lib/omnizip/algorithm.rb +176 -0
  113. data/lib/omnizip/algorithm_registry.rb +65 -0
  114. data/lib/omnizip/algorithms/.keep +0 -0
  115. data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
  116. data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
  117. data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
  118. data/lib/omnizip/algorithms/bzip2.rb +108 -0
  119. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  120. data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
  121. data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
  122. data/lib/omnizip/algorithms/deflate.rb +135 -0
  123. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  124. data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
  125. data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
  126. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
  127. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
  128. data/lib/omnizip/algorithms/deflate64.rb +118 -0
  129. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  130. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  131. data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
  132. data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
  133. data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
  134. data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
  135. data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
  136. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
  137. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
  138. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
  139. data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
  140. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
  141. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  142. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  143. data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
  144. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  145. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
  146. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
  147. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  148. data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
  149. data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
  150. data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
  151. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  152. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
  153. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
  154. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
  155. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
  156. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
  157. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
  158. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  159. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
  160. data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
  161. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
  162. data/lib/omnizip/algorithms/lzma.rb +266 -0
  163. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
  164. data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
  165. data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
  166. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
  167. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  168. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
  169. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  170. data/lib/omnizip/algorithms/lzma2.rb +133 -0
  171. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  172. data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
  173. data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
  174. data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
  175. data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
  176. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  177. data/lib/omnizip/algorithms/ppmd7.rb +146 -0
  178. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  179. data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
  180. data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
  181. data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
  182. data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
  183. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  184. data/lib/omnizip/algorithms/ppmd8.rb +122 -0
  185. data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
  186. data/lib/omnizip/algorithms/registration.rb +28 -0
  187. data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
  188. data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
  189. data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
  190. data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
  191. data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
  192. data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
  193. data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
  194. data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
  195. data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
  196. data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
  197. data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
  198. data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
  199. data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
  200. data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
  201. data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
  202. data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
  203. data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
  204. data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
  205. data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
  206. data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
  207. data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
  208. data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
  209. data/lib/omnizip/algorithms/zstandard.rb +210 -0
  210. data/lib/omnizip/algorithms.rb +35 -0
  211. data/lib/omnizip/archive/builder.rb +48 -0
  212. data/lib/omnizip/archive/reader_session.rb +67 -0
  213. data/lib/omnizip/archive.rb +86 -0
  214. data/lib/omnizip/archive_handler.rb +82 -0
  215. data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
  216. data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
  217. data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
  218. data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
  219. data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
  220. data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
  221. data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
  222. data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
  223. data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
  224. data/lib/omnizip/archive_handlers.rb +18 -0
  225. data/lib/omnizip/backends.rb +160 -0
  226. data/lib/omnizip/buffer/memory_archive.rb +246 -0
  227. data/lib/omnizip/buffer/memory_extractor.rb +234 -0
  228. data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
  229. data/lib/omnizip/buffer.rb +187 -0
  230. data/lib/omnizip/checksum_registry.rb +41 -0
  231. data/lib/omnizip/checksums/crc32.rb +101 -0
  232. data/lib/omnizip/checksums/crc64.rb +102 -0
  233. data/lib/omnizip/checksums/crc_base.rb +158 -0
  234. data/lib/omnizip/checksums/registration.rb +16 -0
  235. data/lib/omnizip/checksums/verifier.rb +130 -0
  236. data/lib/omnizip/checksums.rb +11 -0
  237. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  238. data/lib/omnizip/chunked/reader.rb +78 -0
  239. data/lib/omnizip/chunked/writer.rb +123 -0
  240. data/lib/omnizip/chunked.rb +123 -0
  241. data/lib/omnizip/cli/output_formatter.rb +112 -0
  242. data/lib/omnizip/cli.rb +604 -0
  243. data/lib/omnizip/commands/.keep +0 -0
  244. data/lib/omnizip/commands/archive_create_command.rb +245 -0
  245. data/lib/omnizip/commands/archive_extract_command.rb +231 -0
  246. data/lib/omnizip/commands/archive_list_command.rb +204 -0
  247. data/lib/omnizip/commands/archive_repair_command.rb +129 -0
  248. data/lib/omnizip/commands/archive_verify_command.rb +115 -0
  249. data/lib/omnizip/commands/compress_command.rb +115 -0
  250. data/lib/omnizip/commands/decompress_command.rb +149 -0
  251. data/lib/omnizip/commands/list_command.rb +51 -0
  252. data/lib/omnizip/commands/metadata_command.rb +215 -0
  253. data/lib/omnizip/commands/parity_create_command.rb +114 -0
  254. data/lib/omnizip/commands/parity_repair_command.rb +120 -0
  255. data/lib/omnizip/commands/parity_verify_command.rb +122 -0
  256. data/lib/omnizip/commands/profile_list_command.rb +54 -0
  257. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  258. data/lib/omnizip/commands.rb +21 -0
  259. data/lib/omnizip/convenience.rb +389 -0
  260. data/lib/omnizip/converter/conversion_registry.rb +50 -0
  261. data/lib/omnizip/converter/conversion_strategy.rb +108 -0
  262. data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
  263. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
  264. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
  265. data/lib/omnizip/converter.rb +124 -0
  266. data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
  267. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  268. data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
  269. data/lib/omnizip/crypto/aes256.rb +102 -0
  270. data/lib/omnizip/crypto.rb +11 -0
  271. data/lib/omnizip/entry.rb +44 -0
  272. data/lib/omnizip/error.rb +110 -0
  273. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
  274. data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
  275. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  276. data/lib/omnizip/eta/sample_history.rb +143 -0
  277. data/lib/omnizip/eta/time_estimator.rb +106 -0
  278. data/lib/omnizip/eta.rb +68 -0
  279. data/lib/omnizip/extraction/filter_chain.rb +179 -0
  280. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  281. data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
  282. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  283. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  284. data/lib/omnizip/extraction/selective_extractor.rb +247 -0
  285. data/lib/omnizip/extraction.rb +115 -0
  286. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  287. data/lib/omnizip/file_type.rb +117 -0
  288. data/lib/omnizip/filter.rb +141 -0
  289. data/lib/omnizip/filter_pipeline.rb +108 -0
  290. data/lib/omnizip/filter_registry.rb +113 -0
  291. data/lib/omnizip/filters/bcj.rb +277 -0
  292. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  293. data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
  294. data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
  295. data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
  296. data/lib/omnizip/filters/bcj2.rb +93 -0
  297. data/lib/omnizip/filters/bcj_arm.rb +174 -0
  298. data/lib/omnizip/filters/bcj_arm64.rb +242 -0
  299. data/lib/omnizip/filters/bcj_ia64.rb +194 -0
  300. data/lib/omnizip/filters/bcj_ppc.rb +188 -0
  301. data/lib/omnizip/filters/bcj_sparc.rb +174 -0
  302. data/lib/omnizip/filters/bcj_x86.rb +191 -0
  303. data/lib/omnizip/filters/delta.rb +195 -0
  304. data/lib/omnizip/filters/xz_delta.rb +258 -0
  305. data/lib/omnizip/filters.rb +20 -0
  306. data/lib/omnizip/format_detector.rb +166 -0
  307. data/lib/omnizip/formats/.keep +0 -0
  308. data/lib/omnizip/formats/bzip2_file.rb +159 -0
  309. data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
  310. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  311. data/lib/omnizip/formats/cpio/entry.rb +389 -0
  312. data/lib/omnizip/formats/cpio/reader.rb +194 -0
  313. data/lib/omnizip/formats/cpio/writer.rb +232 -0
  314. data/lib/omnizip/formats/cpio.rb +132 -0
  315. data/lib/omnizip/formats/format_spec_loader.rb +228 -0
  316. data/lib/omnizip/formats/gzip.rb +236 -0
  317. data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
  318. data/lib/omnizip/formats/iso/directory_record.rb +162 -0
  319. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  320. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  321. data/lib/omnizip/formats/iso/reader.rb +194 -0
  322. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  323. data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
  324. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  325. data/lib/omnizip/formats/iso/writer.rb +543 -0
  326. data/lib/omnizip/formats/iso.rb +133 -0
  327. data/lib/omnizip/formats/lzip.rb +161 -0
  328. data/lib/omnizip/formats/lzma_alone.rb +149 -0
  329. data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
  330. data/lib/omnizip/formats/msi/constants.rb +157 -0
  331. data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
  332. data/lib/omnizip/formats/msi/entry.rb +134 -0
  333. data/lib/omnizip/formats/msi/reader.rb +301 -0
  334. data/lib/omnizip/formats/msi/string_pool.rb +246 -0
  335. data/lib/omnizip/formats/msi/table_parser.rb +244 -0
  336. data/lib/omnizip/formats/msi.rb +73 -0
  337. data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
  338. data/lib/omnizip/formats/ole/constants.rb +61 -0
  339. data/lib/omnizip/formats/ole/dirent.rb +439 -0
  340. data/lib/omnizip/formats/ole/header.rb +199 -0
  341. data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
  342. data/lib/omnizip/formats/ole/storage.rb +482 -0
  343. data/lib/omnizip/formats/ole/types/variant.rb +338 -0
  344. data/lib/omnizip/formats/ole.rb +143 -0
  345. data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
  346. data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
  347. data/lib/omnizip/formats/rar/block_parser.rb +282 -0
  348. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  349. data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
  350. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
  351. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
  352. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  353. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  354. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  355. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  356. data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
  357. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
  358. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
  359. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
  360. data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
  361. data/lib/omnizip/formats/rar/compression.rb +17 -0
  362. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  363. data/lib/omnizip/formats/rar/constants.rb +88 -0
  364. data/lib/omnizip/formats/rar/decompressor.rb +316 -0
  365. data/lib/omnizip/formats/rar/external_writer.rb +311 -0
  366. data/lib/omnizip/formats/rar/header.rb +209 -0
  367. data/lib/omnizip/formats/rar/license_validator.rb +111 -0
  368. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  369. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  370. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  371. data/lib/omnizip/formats/rar/models.rb +14 -0
  372. data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
  373. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
  374. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
  375. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  376. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  377. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
  378. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  379. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
  380. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  381. data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
  382. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  383. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  384. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  385. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  386. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  387. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
  388. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  389. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
  390. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
  391. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
  392. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  393. data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
  394. data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
  395. data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
  396. data/lib/omnizip/formats/rar/reader.rb +377 -0
  397. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  398. data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
  399. data/lib/omnizip/formats/rar/writer.rb +437 -0
  400. data/lib/omnizip/formats/rar.rb +193 -0
  401. data/lib/omnizip/formats/rar3/compressor.rb +71 -0
  402. data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
  403. data/lib/omnizip/formats/rar3/reader.rb +107 -0
  404. data/lib/omnizip/formats/rar3/writer.rb +220 -0
  405. data/lib/omnizip/formats/rar3.rb +15 -0
  406. data/lib/omnizip/formats/rar5/compressor.rb +71 -0
  407. data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
  408. data/lib/omnizip/formats/rar5/reader.rb +130 -0
  409. data/lib/omnizip/formats/rar5/writer.rb +65 -0
  410. data/lib/omnizip/formats/rar5.rb +15 -0
  411. data/lib/omnizip/formats/rpm/constants.rb +58 -0
  412. data/lib/omnizip/formats/rpm/entry.rb +106 -0
  413. data/lib/omnizip/formats/rpm/header.rb +106 -0
  414. data/lib/omnizip/formats/rpm/lead.rb +132 -0
  415. data/lib/omnizip/formats/rpm/tag.rb +228 -0
  416. data/lib/omnizip/formats/rpm/writer.rb +652 -0
  417. data/lib/omnizip/formats/rpm.rb +458 -0
  418. data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
  419. data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
  420. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  421. data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
  422. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
  423. data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
  424. data/lib/omnizip/formats/seven_zip/header.rb +102 -0
  425. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
  426. data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
  427. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  428. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
  429. data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
  430. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  431. data/lib/omnizip/formats/seven_zip/models.rb +20 -0
  432. data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
  433. data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
  434. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
  435. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
  436. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  437. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
  438. data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
  439. data/lib/omnizip/formats/seven_zip.rb +179 -0
  440. data/lib/omnizip/formats/tar/constants.rb +73 -0
  441. data/lib/omnizip/formats/tar/entry.rb +98 -0
  442. data/lib/omnizip/formats/tar/header.rb +206 -0
  443. data/lib/omnizip/formats/tar/reader.rb +119 -0
  444. data/lib/omnizip/formats/tar/writer.rb +212 -0
  445. data/lib/omnizip/formats/tar.rb +74 -0
  446. data/lib/omnizip/formats/xar/constants.rb +119 -0
  447. data/lib/omnizip/formats/xar/entry.rb +268 -0
  448. data/lib/omnizip/formats/xar/header.rb +223 -0
  449. data/lib/omnizip/formats/xar/reader.rb +400 -0
  450. data/lib/omnizip/formats/xar/toc.rb +570 -0
  451. data/lib/omnizip/formats/xar/writer.rb +461 -0
  452. data/lib/omnizip/formats/xar.rb +145 -0
  453. data/lib/omnizip/formats/xz/reader.rb +121 -0
  454. data/lib/omnizip/formats/xz/writer.rb +416 -0
  455. data/lib/omnizip/formats/xz.rb +210 -0
  456. data/lib/omnizip/formats/xz_const.rb +49 -0
  457. data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
  458. data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
  459. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  460. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
  461. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  462. data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
  463. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
  464. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
  465. data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
  466. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
  467. data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
  468. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
  469. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  470. data/lib/omnizip/formats/xz_impl.rb +52 -0
  471. data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
  472. data/lib/omnizip/formats/zip/constants.rb +69 -0
  473. data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
  474. data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
  475. data/lib/omnizip/formats/zip/reader.rb +376 -0
  476. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  477. data/lib/omnizip/formats/zip/writer.rb +489 -0
  478. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
  479. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
  480. data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
  481. data/lib/omnizip/formats/zip.rb +50 -0
  482. data/lib/omnizip/formats.rb +29 -0
  483. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  484. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  485. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  486. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  487. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  488. data/lib/omnizip/implementations/base.rb +19 -0
  489. data/lib/omnizip/implementations/rust/archive.rb +93 -0
  490. data/lib/omnizip/implementations/rust/library.rb +221 -0
  491. data/lib/omnizip/implementations/rust.rb +26 -0
  492. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
  493. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
  494. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
  495. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
  496. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
  497. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
  498. data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
  499. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
  500. data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
  501. data/lib/omnizip/implementations/seven_zip.rb +11 -0
  502. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
  503. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
  504. data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
  505. data/lib/omnizip/implementations/xz_utils.rb +10 -0
  506. data/lib/omnizip/implementations.rb +25 -0
  507. data/lib/omnizip/io/buffered_input.rb +147 -0
  508. data/lib/omnizip/io/buffered_output.rb +106 -0
  509. data/lib/omnizip/io/source.rb +143 -0
  510. data/lib/omnizip/io/stream_manager.rb +117 -0
  511. data/lib/omnizip/io.rb +15 -0
  512. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  513. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  514. data/lib/omnizip/link_handler.rb +129 -0
  515. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  516. data/lib/omnizip/metadata/entry_metadata.rb +153 -0
  517. data/lib/omnizip/metadata/metadata_editor.rb +169 -0
  518. data/lib/omnizip/metadata/metadata_registry.rb +71 -0
  519. data/lib/omnizip/metadata/metadata_validator.rb +101 -0
  520. data/lib/omnizip/metadata.rb +58 -0
  521. data/lib/omnizip/models/.keep +0 -0
  522. data/lib/omnizip/models/algorithm_metadata.rb +41 -0
  523. data/lib/omnizip/models/attribute_apply.rb +40 -0
  524. data/lib/omnizip/models/compression_options.rb +53 -0
  525. data/lib/omnizip/models/conversion_options.rb +79 -0
  526. data/lib/omnizip/models/conversion_result.rb +141 -0
  527. data/lib/omnizip/models/eta_result.rb +45 -0
  528. data/lib/omnizip/models/extraction_rule.rb +115 -0
  529. data/lib/omnizip/models/filter_chain.rb +142 -0
  530. data/lib/omnizip/models/filter_config.rb +148 -0
  531. data/lib/omnizip/models/match_result.rb +141 -0
  532. data/lib/omnizip/models/optimization_suggestion.rb +95 -0
  533. data/lib/omnizip/models/parallel_options.rb +116 -0
  534. data/lib/omnizip/models/performance_result.rb +85 -0
  535. data/lib/omnizip/models/profile_report.rb +116 -0
  536. data/lib/omnizip/models/progress_options.rb +39 -0
  537. data/lib/omnizip/models/split_options.rb +116 -0
  538. data/lib/omnizip/optimization_registry.rb +45 -0
  539. data/lib/omnizip/parallel/engine.rb +52 -0
  540. data/lib/omnizip/parallel/job_queue.rb +209 -0
  541. data/lib/omnizip/parallel/job_scheduler.rb +225 -0
  542. data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
  543. data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
  544. data/lib/omnizip/parallel/thread_pool.rb +60 -0
  545. data/lib/omnizip/parallel/worker_pool.rb +227 -0
  546. data/lib/omnizip/parallel.rb +156 -0
  547. data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
  548. data/lib/omnizip/parity/galois16.rb +145 -0
  549. data/lib/omnizip/parity/models/creator_packet.rb +71 -0
  550. data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
  551. data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
  552. data/lib/omnizip/parity/models/main_packet.rb +126 -0
  553. data/lib/omnizip/parity/models/packet.rb +156 -0
  554. data/lib/omnizip/parity/models/packet_registry.rb +102 -0
  555. data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
  556. data/lib/omnizip/parity/models.rb +27 -0
  557. data/lib/omnizip/parity/par2_creator.rb +496 -0
  558. data/lib/omnizip/parity/par2_repairer.rb +409 -0
  559. data/lib/omnizip/parity/par2_verifier.rb +373 -0
  560. data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
  561. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  562. data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
  563. data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
  564. data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
  565. data/lib/omnizip/parity.rb +207 -0
  566. data/lib/omnizip/password/encryption_registry.rb +26 -0
  567. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  568. data/lib/omnizip/password/password_validator.rb +129 -0
  569. data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
  570. data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
  571. data/lib/omnizip/password.rb +88 -0
  572. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  573. data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
  574. data/lib/omnizip/pipe.rb +120 -0
  575. data/lib/omnizip/platform/ntfs_streams.rb +200 -0
  576. data/lib/omnizip/platform.rb +189 -0
  577. data/lib/omnizip/profile/archive_profile.rb +36 -0
  578. data/lib/omnizip/profile/balanced_profile.rb +31 -0
  579. data/lib/omnizip/profile/binary_profile.rb +33 -0
  580. data/lib/omnizip/profile/compression_profile.rb +157 -0
  581. data/lib/omnizip/profile/custom_profile.rb +155 -0
  582. data/lib/omnizip/profile/fast_profile.rb +31 -0
  583. data/lib/omnizip/profile/maximum_profile.rb +31 -0
  584. data/lib/omnizip/profile/profile_detector.rb +108 -0
  585. data/lib/omnizip/profile/profile_registry.rb +160 -0
  586. data/lib/omnizip/profile/text_profile.rb +33 -0
  587. data/lib/omnizip/profile.rb +261 -0
  588. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  589. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  590. data/lib/omnizip/profiler/report_generator.rb +158 -0
  591. data/lib/omnizip/profiler.rb +192 -0
  592. data/lib/omnizip/progress/callback_reporter.rb +34 -0
  593. data/lib/omnizip/progress/console_reporter.rb +59 -0
  594. data/lib/omnizip/progress/log_reporter.rb +89 -0
  595. data/lib/omnizip/progress/operation_progress.rb +118 -0
  596. data/lib/omnizip/progress/progress_bar.rb +156 -0
  597. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  598. data/lib/omnizip/progress/progress_tracker.rb +215 -0
  599. data/lib/omnizip/progress/silent_reporter.rb +22 -0
  600. data/lib/omnizip/progress.rb +131 -0
  601. data/lib/omnizip/registry.rb +111 -0
  602. data/lib/omnizip/rubyzip_compat.rb +61 -0
  603. data/lib/omnizip/temp/safe_extract.rb +124 -0
  604. data/lib/omnizip/temp/temp_file.rb +123 -0
  605. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  606. data/lib/omnizip/temp.rb +184 -0
  607. data/lib/omnizip/version.rb +5 -0
  608. data/lib/omnizip/zip/entry.rb +160 -0
  609. data/lib/omnizip/zip/file.rb +485 -0
  610. data/lib/omnizip/zip/input_stream.rb +270 -0
  611. data/lib/omnizip/zip/output_stream.rb +320 -0
  612. data/lib/omnizip/zip.rb +23 -0
  613. data/lib/omnizip.rb +157 -0
  614. data/lib/tasks/msi_test_files.rake +66 -0
  615. data/lib/tasks/platform_gems.rake +147 -0
  616. data/lib/tasks/rust_backend.rake +48 -0
  617. data/readme-docs/advanced-features.adoc +514 -0
  618. data/readme-docs/api-usage.adoc +445 -0
  619. data/readme-docs/architecture.adoc +450 -0
  620. data/readme-docs/archive-formats.adoc +479 -0
  621. data/readme-docs/cli-usage.adoc +222 -0
  622. data/readme-docs/compression-algorithms.adoc +446 -0
  623. data/readme-docs/compression-profiles.adoc +247 -0
  624. data/readme-docs/encryption-checksums.adoc +328 -0
  625. data/readme-docs/format-converter.adoc +316 -0
  626. data/readme-docs/installation.adoc +228 -0
  627. data/readme-docs/par2-archives.adoc +608 -0
  628. data/readme-docs/performance-profiler.adoc +389 -0
  629. data/readme-docs/preprocessing-filters.adoc +280 -0
  630. data/vendor/libomnizip_ffi.so +0 -0
  631. data/xz-file-format-1.2.1.txt +1174 -0
  632. 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