omnizip 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/.rubocop.yml +32 -0
  4. data/.rubocop_todo.yml +754 -0
  5. data/COPYING +502 -0
  6. data/Gemfile +17 -0
  7. data/LICENSE +12 -0
  8. data/README.adoc +1045 -0
  9. data/Rakefile +12 -0
  10. data/benchmark/README.md +260 -0
  11. data/benchmark/benchmark_suite.rb +125 -0
  12. data/benchmark/compression_bench.rb +181 -0
  13. data/benchmark/filter_bench.rb +180 -0
  14. data/benchmark/models/benchmark_result.rb +59 -0
  15. data/benchmark/models/comparison_result.rb +69 -0
  16. data/benchmark/profile_suite.rb +167 -0
  17. data/benchmark/reporter.rb +150 -0
  18. data/benchmark/run_benchmarks.rb +66 -0
  19. data/benchmark/test_data.rb +137 -0
  20. data/config/formats/rar3_spec.yml +91 -0
  21. data/config/formats/rar5_spec.yml +102 -0
  22. data/docs/.github/workflows/docs.yml +142 -0
  23. data/docs/.gitignore +21 -0
  24. data/docs/.lychee.toml +67 -0
  25. data/docs/Gemfile +13 -0
  26. data/docs/RAR_WRITE_SUPPORT.md +26 -0
  27. data/docs/README.md +101 -0
  28. data/docs/_config.yml +112 -0
  29. data/docs/assets/logo.svg +1 -0
  30. data/docs/assets/omnizip-logo.pdf +1540 -11
  31. data/docs/comparison/feature-matrix.adoc +694 -0
  32. data/docs/comparison/index.adoc +113 -0
  33. data/docs/comparison/vs-7zip.adoc +309 -0
  34. data/docs/comparison/vs-peazip.adoc +77 -0
  35. data/docs/comparison/vs-rubyzip.adoc +342 -0
  36. data/docs/comparison/vs-winrar.adoc +100 -0
  37. data/docs/compatibility.adoc +579 -0
  38. data/docs/concepts/index.adoc +129 -0
  39. data/docs/developer/architecture.adoc +256 -0
  40. data/docs/developer/contributing.adoc +158 -0
  41. data/docs/developer/index.adoc +25 -0
  42. data/docs/developer/testing.adoc +212 -0
  43. data/docs/getting-started/basic-usage.adoc +271 -0
  44. data/docs/getting-started/index.adoc +42 -0
  45. data/docs/getting-started/installation.adoc +138 -0
  46. data/docs/getting-started/quick-start.adoc +185 -0
  47. data/docs/getting-started/your-first-archive.adoc +218 -0
  48. data/docs/guides/advanced-features/encryption.adoc +300 -0
  49. data/docs/guides/advanced-features/index.adoc +49 -0
  50. data/docs/guides/advanced-features/parallel-processing.adoc +246 -0
  51. data/docs/guides/advanced-features/progress-tracking.adoc +320 -0
  52. data/docs/guides/advanced-features/streaming.adoc +212 -0
  53. data/docs/guides/archive-formats/gzip-format.adoc +107 -0
  54. data/docs/guides/archive-formats/index.adoc +130 -0
  55. data/docs/guides/archive-formats/rar-format.adoc +104 -0
  56. data/docs/guides/archive-formats/rar5.adoc +521 -0
  57. data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
  58. data/docs/guides/archive-formats/tar-format.adoc +106 -0
  59. data/docs/guides/archive-formats/xz-format.adoc +118 -0
  60. data/docs/guides/archive-formats/zip-format.adoc +35 -0
  61. data/docs/guides/compression-algorithms/bzip2.adoc +113 -0
  62. data/docs/guides/compression-algorithms/deflate.adoc +319 -0
  63. data/docs/guides/compression-algorithms/index.adoc +190 -0
  64. data/docs/guides/compression-algorithms/lzma.adoc +398 -0
  65. data/docs/guides/compression-algorithms/lzma2.adoc +327 -0
  66. data/docs/guides/compression-algorithms/ppmd.adoc +316 -0
  67. data/docs/guides/compression-algorithms/zstandard.adoc +361 -0
  68. data/docs/guides/creating-archives.adoc +354 -0
  69. data/docs/guides/extracting-archives.adoc +53 -0
  70. data/docs/guides/format-conversion.adoc +64 -0
  71. data/docs/guides/index.adoc +49 -0
  72. data/docs/guides/migration-rubyzip.adoc +217 -0
  73. data/docs/guides/parity-archives.adoc +605 -0
  74. data/docs/guides/performance-tuning.adoc +88 -0
  75. data/docs/index.adoc +218 -0
  76. data/docs/lychee.toml +67 -0
  77. data/docs/reference/api/overview.adoc +188 -0
  78. data/docs/reference/cli/compress-command.adoc +114 -0
  79. data/docs/reference/cli/overview.adoc +140 -0
  80. data/docs/reference/index.adoc +26 -0
  81. data/docs/resources/faq.adoc +185 -0
  82. data/docs/resources/quick-reference.adoc +222 -0
  83. data/docs/troubleshooting/index.adoc +208 -0
  84. data/examples/api_comparison.rb +205 -0
  85. data/examples/deflate64_example.rb +96 -0
  86. data/examples/par2_demo.rb +121 -0
  87. data/examples/quick_start_native.rb +150 -0
  88. data/examples/quick_start_rubyzip.rb +115 -0
  89. data/examples/rubyzip_compatibility_demo.rb +194 -0
  90. data/exe/omnizip +27 -0
  91. data/lib/omnizip/algorithm.rb +130 -0
  92. data/lib/omnizip/algorithm_registry.rb +86 -0
  93. data/lib/omnizip/algorithms/.keep +0 -0
  94. data/lib/omnizip/algorithms/bzip2/bwt.rb +225 -0
  95. data/lib/omnizip/algorithms/bzip2/decoder.rb +193 -0
  96. data/lib/omnizip/algorithms/bzip2/encoder.rb +237 -0
  97. data/lib/omnizip/algorithms/bzip2/huffman.rb +206 -0
  98. data/lib/omnizip/algorithms/bzip2/mtf.rb +101 -0
  99. data/lib/omnizip/algorithms/bzip2/rle.rb +151 -0
  100. data/lib/omnizip/algorithms/bzip2.rb +130 -0
  101. data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
  102. data/lib/omnizip/algorithms/deflate/decoder.rb +38 -0
  103. data/lib/omnizip/algorithms/deflate/encoder.rb +46 -0
  104. data/lib/omnizip/algorithms/deflate.rb +128 -0
  105. data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
  106. data/lib/omnizip/algorithms/deflate64/decoder.rb +153 -0
  107. data/lib/omnizip/algorithms/deflate64/encoder.rb +98 -0
  108. data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +354 -0
  109. data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +142 -0
  110. data/lib/omnizip/algorithms/deflate64.rb +109 -0
  111. data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
  112. data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
  113. data/lib/omnizip/algorithms/lzma/decoder.rb +148 -0
  114. data/lib/omnizip/algorithms/lzma/dictionary.rb +69 -0
  115. data/lib/omnizip/algorithms/lzma/distance_coder.rb +415 -0
  116. data/lib/omnizip/algorithms/lzma/encoder.rb +142 -0
  117. data/lib/omnizip/algorithms/lzma/length_coder.rb +260 -0
  118. data/lib/omnizip/algorithms/lzma/literal_decoder.rb +320 -0
  119. data/lib/omnizip/algorithms/lzma/literal_encoder.rb +210 -0
  120. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +341 -0
  121. data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +192 -0
  122. data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
  123. data/lib/omnizip/algorithms/lzma/match.rb +32 -0
  124. data/lib/omnizip/algorithms/lzma/match_finder.rb +205 -0
  125. data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
  126. data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +88 -0
  127. data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +130 -0
  128. data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
  129. data/lib/omnizip/algorithms/lzma/range_coder.rb +85 -0
  130. data/lib/omnizip/algorithms/lzma/range_decoder.rb +434 -0
  131. data/lib/omnizip/algorithms/lzma/range_encoder.rb +194 -0
  132. data/lib/omnizip/algorithms/lzma/state.rb +127 -0
  133. data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +325 -0
  134. data/lib/omnizip/algorithms/lzma/xz_encoder.rb +426 -0
  135. data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +645 -0
  136. data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +227 -0
  137. data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +169 -0
  138. data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +261 -0
  139. data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
  140. data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +331 -0
  141. data/lib/omnizip/algorithms/lzma/xz_state.rb +116 -0
  142. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +2055 -0
  143. data/lib/omnizip/algorithms/lzma.rb +238 -0
  144. data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +182 -0
  145. data/lib/omnizip/algorithms/lzma2/constants.rb +41 -0
  146. data/lib/omnizip/algorithms/lzma2/encoder.rb +147 -0
  147. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +161 -0
  148. data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
  149. data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +127 -0
  150. data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
  151. data/lib/omnizip/algorithms/lzma2.rb +141 -0
  152. data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
  153. data/lib/omnizip/algorithms/ppmd7/context.rb +154 -0
  154. data/lib/omnizip/algorithms/ppmd7/decoder.rb +126 -0
  155. data/lib/omnizip/algorithms/ppmd7/encoder.rb +163 -0
  156. data/lib/omnizip/algorithms/ppmd7/model.rb +248 -0
  157. data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
  158. data/lib/omnizip/algorithms/ppmd7.rb +116 -0
  159. data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
  160. data/lib/omnizip/algorithms/ppmd8/context.rb +34 -0
  161. data/lib/omnizip/algorithms/ppmd8/decoder.rb +107 -0
  162. data/lib/omnizip/algorithms/ppmd8/encoder.rb +138 -0
  163. data/lib/omnizip/algorithms/ppmd8/model.rb +250 -0
  164. data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
  165. data/lib/omnizip/algorithms/ppmd8.rb +82 -0
  166. data/lib/omnizip/algorithms/ppmd_base.rb +138 -0
  167. data/lib/omnizip/algorithms/sevenzip_lzma2.rb +123 -0
  168. data/lib/omnizip/algorithms/xz_lzma2.rb +118 -0
  169. data/lib/omnizip/algorithms/zstandard/constants.rb +25 -0
  170. data/lib/omnizip/algorithms/zstandard/decoder.rb +46 -0
  171. data/lib/omnizip/algorithms/zstandard/encoder.rb +51 -0
  172. data/lib/omnizip/algorithms/zstandard.rb +138 -0
  173. data/lib/omnizip/buffer/memory_archive.rb +251 -0
  174. data/lib/omnizip/buffer/memory_extractor.rb +224 -0
  175. data/lib/omnizip/buffer.rb +176 -0
  176. data/lib/omnizip/checksum_registry.rb +114 -0
  177. data/lib/omnizip/checksums/crc32.rb +100 -0
  178. data/lib/omnizip/checksums/crc64.rb +101 -0
  179. data/lib/omnizip/checksums/crc_base.rb +158 -0
  180. data/lib/omnizip/checksums/verifier.rb +131 -0
  181. data/lib/omnizip/chunked/memory_manager.rb +194 -0
  182. data/lib/omnizip/chunked/reader.rb +78 -0
  183. data/lib/omnizip/chunked/writer.rb +120 -0
  184. data/lib/omnizip/chunked.rb +129 -0
  185. data/lib/omnizip/cli/output_formatter.rb +104 -0
  186. data/lib/omnizip/cli.rb +572 -0
  187. data/lib/omnizip/commands/.keep +0 -0
  188. data/lib/omnizip/commands/archive_create_command.rb +427 -0
  189. data/lib/omnizip/commands/archive_extract_command.rb +272 -0
  190. data/lib/omnizip/commands/archive_list_command.rb +218 -0
  191. data/lib/omnizip/commands/archive_repair_command.rb +131 -0
  192. data/lib/omnizip/commands/archive_verify_command.rb +117 -0
  193. data/lib/omnizip/commands/compress_command.rb +117 -0
  194. data/lib/omnizip/commands/decompress_command.rb +120 -0
  195. data/lib/omnizip/commands/list_command.rb +53 -0
  196. data/lib/omnizip/commands/metadata_command.rb +153 -0
  197. data/lib/omnizip/commands/parity_create_command.rb +122 -0
  198. data/lib/omnizip/commands/parity_repair_command.rb +122 -0
  199. data/lib/omnizip/commands/parity_verify_command.rb +124 -0
  200. data/lib/omnizip/commands/profile_list_command.rb +56 -0
  201. data/lib/omnizip/commands/profile_show_command.rb +44 -0
  202. data/lib/omnizip/convenience.rb +359 -0
  203. data/lib/omnizip/converter/conversion_registry.rb +49 -0
  204. data/lib/omnizip/converter/conversion_strategy.rb +121 -0
  205. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +97 -0
  206. data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +112 -0
  207. data/lib/omnizip/converter.rb +105 -0
  208. data/lib/omnizip/crypto/aes256/cipher.rb +100 -0
  209. data/lib/omnizip/crypto/aes256/constants.rb +28 -0
  210. data/lib/omnizip/crypto/aes256/key_derivation.rb +101 -0
  211. data/lib/omnizip/crypto/aes256.rb +102 -0
  212. data/lib/omnizip/error.rb +106 -0
  213. data/lib/omnizip/eta/exponential_smoothing_estimator.rb +98 -0
  214. data/lib/omnizip/eta/moving_average_estimator.rb +99 -0
  215. data/lib/omnizip/eta/rate_calculator.rb +104 -0
  216. data/lib/omnizip/eta/sample_history.rb +143 -0
  217. data/lib/omnizip/eta/time_estimator.rb +106 -0
  218. data/lib/omnizip/eta.rb +63 -0
  219. data/lib/omnizip/extraction/filter_chain.rb +177 -0
  220. data/lib/omnizip/extraction/glob_pattern.rb +140 -0
  221. data/lib/omnizip/extraction/pattern_matcher.rb +70 -0
  222. data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
  223. data/lib/omnizip/extraction/regex_pattern.rb +50 -0
  224. data/lib/omnizip/extraction/selective_extractor.rb +240 -0
  225. data/lib/omnizip/extraction.rb +111 -0
  226. data/lib/omnizip/file_type/mime_classifier.rb +144 -0
  227. data/lib/omnizip/file_type.rb +113 -0
  228. data/lib/omnizip/filter.rb +139 -0
  229. data/lib/omnizip/filter_pipeline.rb +108 -0
  230. data/lib/omnizip/filter_registry.rb +166 -0
  231. data/lib/omnizip/filters/bcj.rb +279 -0
  232. data/lib/omnizip/filters/bcj2/constants.rb +53 -0
  233. data/lib/omnizip/filters/bcj2/decoder.rb +200 -0
  234. data/lib/omnizip/filters/bcj2/encoder.rb +61 -0
  235. data/lib/omnizip/filters/bcj2/stream_data.rb +93 -0
  236. data/lib/omnizip/filters/bcj2.rb +99 -0
  237. data/lib/omnizip/filters/bcj_arm.rb +176 -0
  238. data/lib/omnizip/filters/bcj_arm64.rb +244 -0
  239. data/lib/omnizip/filters/bcj_ia64.rb +196 -0
  240. data/lib/omnizip/filters/bcj_ppc.rb +190 -0
  241. data/lib/omnizip/filters/bcj_sparc.rb +176 -0
  242. data/lib/omnizip/filters/bcj_x86.rb +193 -0
  243. data/lib/omnizip/filters/delta.rb +196 -0
  244. data/lib/omnizip/filters/filter_base.rb +72 -0
  245. data/lib/omnizip/filters/registry.rb +123 -0
  246. data/lib/omnizip/filters/xz_delta.rb +258 -0
  247. data/lib/omnizip/format_detector.rb +162 -0
  248. data/lib/omnizip/format_registry.rb +59 -0
  249. data/lib/omnizip/formats/.keep +0 -0
  250. data/lib/omnizip/formats/bzip2_file.rb +172 -0
  251. data/lib/omnizip/formats/cpio/constants.rb +55 -0
  252. data/lib/omnizip/formats/cpio/entry.rb +385 -0
  253. data/lib/omnizip/formats/cpio/reader.rb +196 -0
  254. data/lib/omnizip/formats/cpio/writer.rb +234 -0
  255. data/lib/omnizip/formats/cpio.rb +140 -0
  256. data/lib/omnizip/formats/format_spec_loader.rb +230 -0
  257. data/lib/omnizip/formats/gzip.rb +238 -0
  258. data/lib/omnizip/formats/iso/directory_builder.rb +297 -0
  259. data/lib/omnizip/formats/iso/directory_record.rb +152 -0
  260. data/lib/omnizip/formats/iso/joliet.rb +204 -0
  261. data/lib/omnizip/formats/iso/path_table.rb +125 -0
  262. data/lib/omnizip/formats/iso/reader.rb +197 -0
  263. data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
  264. data/lib/omnizip/formats/iso/volume_builder.rb +320 -0
  265. data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
  266. data/lib/omnizip/formats/iso/writer.rb +530 -0
  267. data/lib/omnizip/formats/iso.rb +140 -0
  268. data/lib/omnizip/formats/lzip.rb +175 -0
  269. data/lib/omnizip/formats/lzma_alone.rb +171 -0
  270. data/lib/omnizip/formats/rar/archive_repairer.rb +243 -0
  271. data/lib/omnizip/formats/rar/archive_verifier.rb +195 -0
  272. data/lib/omnizip/formats/rar/block_parser.rb +243 -0
  273. data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
  274. data/lib/omnizip/formats/rar/compression/dispatcher.rb +217 -0
  275. data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +216 -0
  276. data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +158 -0
  277. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
  278. data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
  279. data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
  280. data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
  281. data/lib/omnizip/formats/rar/compression/ppmd/context.rb +105 -0
  282. data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +219 -0
  283. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +262 -0
  284. data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
  285. data/lib/omnizip/formats/rar/constants.rb +82 -0
  286. data/lib/omnizip/formats/rar/decompressor.rb +238 -0
  287. data/lib/omnizip/formats/rar/external_writer.rb +312 -0
  288. data/lib/omnizip/formats/rar/header.rb +192 -0
  289. data/lib/omnizip/formats/rar/license_validator.rb +109 -0
  290. data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
  291. data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
  292. data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
  293. data/lib/omnizip/formats/rar/parity_handler.rb +292 -0
  294. data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +202 -0
  295. data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +578 -0
  296. data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
  297. data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
  298. data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +97 -0
  299. data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
  300. data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +166 -0
  301. data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
  302. data/lib/omnizip/formats/rar/rar5/header.rb +187 -0
  303. data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
  304. data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
  305. data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
  306. data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
  307. data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
  308. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +264 -0
  309. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
  310. data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +194 -0
  311. data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +109 -0
  312. data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +142 -0
  313. data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
  314. data/lib/omnizip/formats/rar/rar5/vint.rb +65 -0
  315. data/lib/omnizip/formats/rar/rar5/writer.rb +466 -0
  316. data/lib/omnizip/formats/rar/rar_format_base.rb +241 -0
  317. data/lib/omnizip/formats/rar/reader.rb +366 -0
  318. data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
  319. data/lib/omnizip/formats/rar/volume_manager.rb +168 -0
  320. data/lib/omnizip/formats/rar/writer.rb +431 -0
  321. data/lib/omnizip/formats/rar.rb +205 -0
  322. data/lib/omnizip/formats/rar3/compressor.rb +73 -0
  323. data/lib/omnizip/formats/rar3/decompressor.rb +66 -0
  324. data/lib/omnizip/formats/rar3/reader.rb +386 -0
  325. data/lib/omnizip/formats/rar3/writer.rb +219 -0
  326. data/lib/omnizip/formats/rar5/compressor.rb +73 -0
  327. data/lib/omnizip/formats/rar5/decompressor.rb +66 -0
  328. data/lib/omnizip/formats/rar5/reader.rb +342 -0
  329. data/lib/omnizip/formats/rar5/writer.rb +214 -0
  330. data/lib/omnizip/formats/seven_zip/coder_chain.rb +150 -0
  331. data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
  332. data/lib/omnizip/formats/seven_zip/encoded_header.rb +114 -0
  333. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +142 -0
  334. data/lib/omnizip/formats/seven_zip/file_collector.rb +144 -0
  335. data/lib/omnizip/formats/seven_zip/header.rb +106 -0
  336. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +134 -0
  337. data/lib/omnizip/formats/seven_zip/header_writer.rb +466 -0
  338. data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
  339. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +58 -0
  340. data/lib/omnizip/formats/seven_zip/models/folder.rb +69 -0
  341. data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
  342. data/lib/omnizip/formats/seven_zip/parser.rb +660 -0
  343. data/lib/omnizip/formats/seven_zip/reader.rb +458 -0
  344. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +632 -0
  345. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +315 -0
  346. data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
  347. data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +162 -0
  348. data/lib/omnizip/formats/seven_zip/writer.rb +740 -0
  349. data/lib/omnizip/formats/seven_zip.rb +93 -0
  350. data/lib/omnizip/formats/tar/constants.rb +73 -0
  351. data/lib/omnizip/formats/tar/entry.rb +94 -0
  352. data/lib/omnizip/formats/tar/header.rb +168 -0
  353. data/lib/omnizip/formats/tar/reader.rb +121 -0
  354. data/lib/omnizip/formats/tar/writer.rb +216 -0
  355. data/lib/omnizip/formats/tar.rb +84 -0
  356. data/lib/omnizip/formats/xz/reader.rb +116 -0
  357. data/lib/omnizip/formats/xz.rb +237 -0
  358. data/lib/omnizip/formats/xz_impl/block_decoder.rb +754 -0
  359. data/lib/omnizip/formats/xz_impl/block_encoder.rb +306 -0
  360. data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
  361. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +186 -0
  362. data/lib/omnizip/formats/xz_impl/constants.rb +49 -0
  363. data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
  364. data/lib/omnizip/formats/xz_impl/index_encoder.rb +122 -0
  365. data/lib/omnizip/formats/xz_impl/stream_decoder.rb +468 -0
  366. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +99 -0
  367. data/lib/omnizip/formats/xz_impl/stream_footer.rb +81 -0
  368. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +117 -0
  369. data/lib/omnizip/formats/xz_impl/stream_header.rb +55 -0
  370. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +108 -0
  371. data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
  372. data/lib/omnizip/formats/xz_impl/writer.rb +421 -0
  373. data/lib/omnizip/formats/zip/central_directory_header.rb +195 -0
  374. data/lib/omnizip/formats/zip/constants.rb +69 -0
  375. data/lib/omnizip/formats/zip/end_of_central_directory.rb +133 -0
  376. data/lib/omnizip/formats/zip/local_file_header.rb +138 -0
  377. data/lib/omnizip/formats/zip/reader.rb +250 -0
  378. data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
  379. data/lib/omnizip/formats/zip/writer.rb +375 -0
  380. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +104 -0
  381. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +66 -0
  382. data/lib/omnizip/formats/zip/zip64_extra_field.rb +114 -0
  383. data/lib/omnizip/formats/zip.rb +50 -0
  384. data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
  385. data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
  386. data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
  387. data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
  388. data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
  389. data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +421 -0
  390. data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +465 -0
  391. data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +288 -0
  392. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +200 -0
  393. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +197 -0
  394. data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +141 -0
  395. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +519 -0
  396. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +723 -0
  397. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +750 -0
  398. data/lib/omnizip/io/buffered_input.rb +146 -0
  399. data/lib/omnizip/io/buffered_output.rb +105 -0
  400. data/lib/omnizip/io/stream_manager.rb +115 -0
  401. data/lib/omnizip/link_handler/hard_link.rb +79 -0
  402. data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
  403. data/lib/omnizip/link_handler.rb +124 -0
  404. data/lib/omnizip/metadata/archive_metadata.rb +114 -0
  405. data/lib/omnizip/metadata/entry_metadata.rb +146 -0
  406. data/lib/omnizip/metadata/metadata_editor.rb +171 -0
  407. data/lib/omnizip/metadata/metadata_registry.rb +64 -0
  408. data/lib/omnizip/metadata/metadata_validator.rb +99 -0
  409. data/lib/omnizip/metadata.rb +57 -0
  410. data/lib/omnizip/models/.keep +0 -0
  411. data/lib/omnizip/models/algorithm_metadata.rb +73 -0
  412. data/lib/omnizip/models/compression_options.rb +71 -0
  413. data/lib/omnizip/models/conversion_options.rb +87 -0
  414. data/lib/omnizip/models/conversion_result.rb +135 -0
  415. data/lib/omnizip/models/eta_result.rb +46 -0
  416. data/lib/omnizip/models/extraction_rule.rb +115 -0
  417. data/lib/omnizip/models/filter_chain.rb +144 -0
  418. data/lib/omnizip/models/filter_config.rb +183 -0
  419. data/lib/omnizip/models/match_result.rb +124 -0
  420. data/lib/omnizip/models/optimization_suggestion.rb +91 -0
  421. data/lib/omnizip/models/parallel_options.rb +104 -0
  422. data/lib/omnizip/models/performance_result.rb +79 -0
  423. data/lib/omnizip/models/profile_report.rb +82 -0
  424. data/lib/omnizip/models/progress_options.rb +38 -0
  425. data/lib/omnizip/models/split_options.rb +116 -0
  426. data/lib/omnizip/optimization_registry.rb +81 -0
  427. data/lib/omnizip/parallel/job_queue.rb +209 -0
  428. data/lib/omnizip/parallel/job_scheduler.rb +203 -0
  429. data/lib/omnizip/parallel/parallel_compressor.rb +347 -0
  430. data/lib/omnizip/parallel/parallel_extractor.rb +329 -0
  431. data/lib/omnizip/parallel/worker_pool.rb +223 -0
  432. data/lib/omnizip/parallel.rb +149 -0
  433. data/lib/omnizip/parity/chunked_block_processor.rb +196 -0
  434. data/lib/omnizip/parity/galois16.rb +145 -0
  435. data/lib/omnizip/parity/models/creator_packet.rb +73 -0
  436. data/lib/omnizip/parity/models/file_description_packet.rb +133 -0
  437. data/lib/omnizip/parity/models/ifsc_packet.rb +123 -0
  438. data/lib/omnizip/parity/models/main_packet.rb +128 -0
  439. data/lib/omnizip/parity/models/packet.rb +156 -0
  440. data/lib/omnizip/parity/models/packet_registry.rb +109 -0
  441. data/lib/omnizip/parity/models/recovery_slice_packet.rb +78 -0
  442. data/lib/omnizip/parity/par2_creator.rb +531 -0
  443. data/lib/omnizip/parity/par2_repairer.rb +407 -0
  444. data/lib/omnizip/parity/par2_verifier.rb +364 -0
  445. data/lib/omnizip/parity/par2cmdline_algorithm.rb +110 -0
  446. data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
  447. data/lib/omnizip/parity/reed_solomon_decoder.rb +266 -0
  448. data/lib/omnizip/parity/reed_solomon_encoder.rb +111 -0
  449. data/lib/omnizip/parity/reed_solomon_matrix.rb +342 -0
  450. data/lib/omnizip/parity.rb +186 -0
  451. data/lib/omnizip/password/encryption_registry.rb +65 -0
  452. data/lib/omnizip/password/encryption_strategy.rb +96 -0
  453. data/lib/omnizip/password/password_validator.rb +129 -0
  454. data/lib/omnizip/password/winzip_aes_strategy.rb +192 -0
  455. data/lib/omnizip/password/zip_crypto_strategy.rb +141 -0
  456. data/lib/omnizip/password.rb +87 -0
  457. data/lib/omnizip/pipe/stream_compressor.rb +124 -0
  458. data/lib/omnizip/pipe/stream_decompressor.rb +174 -0
  459. data/lib/omnizip/pipe.rb +121 -0
  460. data/lib/omnizip/platform/ntfs_streams.rb +201 -0
  461. data/lib/omnizip/platform.rb +189 -0
  462. data/lib/omnizip/profile/archive_profile.rb +39 -0
  463. data/lib/omnizip/profile/balanced_profile.rb +33 -0
  464. data/lib/omnizip/profile/binary_profile.rb +36 -0
  465. data/lib/omnizip/profile/compression_profile.rb +158 -0
  466. data/lib/omnizip/profile/custom_profile.rb +157 -0
  467. data/lib/omnizip/profile/fast_profile.rb +33 -0
  468. data/lib/omnizip/profile/maximum_profile.rb +33 -0
  469. data/lib/omnizip/profile/profile_detector.rb +110 -0
  470. data/lib/omnizip/profile/profile_registry.rb +161 -0
  471. data/lib/omnizip/profile/text_profile.rb +36 -0
  472. data/lib/omnizip/profile.rb +190 -0
  473. data/lib/omnizip/profiler/memory_profiler.rb +66 -0
  474. data/lib/omnizip/profiler/method_profiler.rb +49 -0
  475. data/lib/omnizip/profiler/report_generator.rb +169 -0
  476. data/lib/omnizip/profiler.rb +204 -0
  477. data/lib/omnizip/progress/callback_reporter.rb +36 -0
  478. data/lib/omnizip/progress/console_reporter.rb +62 -0
  479. data/lib/omnizip/progress/log_reporter.rb +91 -0
  480. data/lib/omnizip/progress/operation_progress.rb +118 -0
  481. data/lib/omnizip/progress/progress_bar.rb +156 -0
  482. data/lib/omnizip/progress/progress_reporter.rb +40 -0
  483. data/lib/omnizip/progress/progress_tracker.rb +190 -0
  484. data/lib/omnizip/progress/silent_reporter.rb +24 -0
  485. data/lib/omnizip/progress.rb +127 -0
  486. data/lib/omnizip/rubyzip_compat.rb +63 -0
  487. data/lib/omnizip/temp/safe_extract.rb +168 -0
  488. data/lib/omnizip/temp/temp_file.rb +124 -0
  489. data/lib/omnizip/temp/temp_file_pool.rb +109 -0
  490. data/lib/omnizip/temp.rb +181 -0
  491. data/lib/omnizip/version.rb +5 -0
  492. data/lib/omnizip/zip/entry.rb +156 -0
  493. data/lib/omnizip/zip/file.rb +485 -0
  494. data/lib/omnizip/zip/input_stream.rb +273 -0
  495. data/lib/omnizip/zip/output_stream.rb +324 -0
  496. data/lib/omnizip.rb +156 -0
  497. data/readme-docs/advanced-features.adoc +515 -0
  498. data/readme-docs/api-usage.adoc +444 -0
  499. data/readme-docs/architecture.adoc +449 -0
  500. data/readme-docs/archive-formats.adoc +479 -0
  501. data/readme-docs/cli-usage.adoc +222 -0
  502. data/readme-docs/compression-algorithms.adoc +442 -0
  503. data/readme-docs/compression-profiles.adoc +247 -0
  504. data/readme-docs/encryption-checksums.adoc +328 -0
  505. data/readme-docs/format-converter.adoc +325 -0
  506. data/readme-docs/installation.adoc +228 -0
  507. data/readme-docs/par2-archives.adoc +608 -0
  508. data/readme-docs/performance-profiler.adoc +389 -0
  509. data/readme-docs/preprocessing-filters.adoc +280 -0
  510. data/xz-file-format-1.2.1.txt +1174 -0
  511. metadata +617 -0
data/lib/omnizip.rb ADDED
@@ -0,0 +1,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # Copyright (C) 2024 Ribose Inc.
5
+ #
6
+ # This file is part of Omnizip.
7
+ #
8
+ # Omnizip is a pure Ruby port of 7-Zip compression algorithms.
9
+ # Based on the 7-Zip LZMA SDK by Igor Pavlov.
10
+ #
11
+ # This library is free software; you can redistribute it and/or
12
+ # modify it under the terms of the GNU Lesser General Public
13
+ # License as published by the Free Software Foundation; either
14
+ # version 2.1 of the License, or (at your option) any later version.
15
+ #
16
+ # See the COPYING file for the complete text of the license.
17
+ #
18
+
19
+ require_relative "omnizip/version"
20
+ require_relative "omnizip/error"
21
+ require_relative "omnizip/models/algorithm_metadata"
22
+ require_relative "omnizip/models/compression_options"
23
+ require_relative "omnizip/models/performance_result"
24
+ require_relative "omnizip/models/profile_report"
25
+ require_relative "omnizip/models/optimization_suggestion"
26
+ require_relative "omnizip/models/progress_options"
27
+ require_relative "omnizip/models/eta_result"
28
+ require_relative "omnizip/models/filter_config"
29
+ require_relative "omnizip/models/filter_chain"
30
+ require_relative "omnizip/algorithm"
31
+ require_relative "omnizip/algorithm_registry"
32
+ require_relative "omnizip/format_registry"
33
+ require_relative "omnizip/optimization_registry"
34
+
35
+ # Algorithms
36
+ require_relative "omnizip/algorithms/ppmd_base"
37
+ require_relative "omnizip/algorithms/lzma"
38
+ require_relative "omnizip/algorithms/lzma2"
39
+ require_relative "omnizip/algorithms/ppmd7"
40
+ require_relative "omnizip/algorithms/ppmd8"
41
+ require_relative "omnizip/algorithms/bzip2"
42
+ require_relative "omnizip/algorithms/deflate"
43
+ require_relative "omnizip/algorithms/deflate64"
44
+ require_relative "omnizip/algorithms/zstandard"
45
+
46
+ # Filter components
47
+ require_relative "omnizip/filter"
48
+ require_relative "omnizip/filter_registry"
49
+ require_relative "omnizip/filter_pipeline"
50
+ require_relative "omnizip/filters/filter_base"
51
+ require_relative "omnizip/filters/bcj"
52
+ require_relative "omnizip/filters/bcj_x86"
53
+ require_relative "omnizip/filters/bcj2"
54
+ require_relative "omnizip/filters/bcj_arm"
55
+ require_relative "omnizip/filters/bcj_arm64"
56
+ require_relative "omnizip/filters/bcj_ppc"
57
+ require_relative "omnizip/filters/bcj_sparc"
58
+ require_relative "omnizip/filters/bcj_ia64"
59
+ require_relative "omnizip/filters/delta"
60
+
61
+ # Register filters with format-aware registration
62
+ require_relative "omnizip/filters/registry"
63
+
64
+ # Checksum implementations
65
+ require_relative "omnizip/checksum_registry"
66
+ require_relative "omnizip/checksums/crc_base"
67
+ require_relative "omnizip/checksums/crc32"
68
+ require_relative "omnizip/checksums/crc64"
69
+
70
+ # I/O utilities
71
+ require_relative "omnizip/io/buffered_input"
72
+ require_relative "omnizip/io/buffered_output"
73
+ require_relative "omnizip/io/stream_manager"
74
+
75
+ # Register checksum algorithms
76
+ Omnizip::ChecksumRegistry.register(:crc32, Omnizip::Checksums::Crc32)
77
+ Omnizip::ChecksumRegistry.register(:crc64, Omnizip::Checksums::Crc64)
78
+
79
+ # Crypto implementations
80
+ require_relative "omnizip/crypto/aes256"
81
+
82
+ # Archive format support
83
+ require_relative "omnizip/formats/seven_zip"
84
+ require_relative "omnizip/formats/zip"
85
+ require_relative "omnizip/formats/rar"
86
+
87
+ # Container formats (Weeks 7-10)
88
+ require_relative "omnizip/formats/tar"
89
+ require_relative "omnizip/formats/gzip"
90
+ require_relative "omnizip/formats/bzip2_file"
91
+ require_relative "omnizip/formats/xz"
92
+ require_relative "omnizip/formats/lzma_alone"
93
+ require_relative "omnizip/formats/lzip"
94
+
95
+ # ISO 9660 CD-ROM format (Weeks 11-14)
96
+ require_relative "omnizip/formats/iso"
97
+
98
+ # Platform-specific features (Weeks 11-14)
99
+ require_relative "omnizip/platform"
100
+ require_relative "omnizip/platform/ntfs_streams"
101
+
102
+ # Rubyzip-compatible API
103
+ require_relative "omnizip/zip/entry"
104
+ require_relative "omnizip/zip/file"
105
+ require_relative "omnizip/zip/output_stream"
106
+ require_relative "omnizip/zip/input_stream"
107
+
108
+ # Streaming and in-memory operations (v1.2)
109
+ require_relative "omnizip/buffer"
110
+ require_relative "omnizip/pipe"
111
+ require_relative "omnizip/chunked"
112
+ require_relative "omnizip/temp"
113
+
114
+ # File type detection (v1.3)
115
+ require_relative "omnizip/file_type"
116
+
117
+ # Compression profiles (v1.3)
118
+ require_relative "omnizip/profile"
119
+
120
+ # Progress tracking and ETA calculation (v1.3)
121
+ require_relative "omnizip/eta"
122
+ require_relative "omnizip/progress"
123
+
124
+ # Metadata editing (v1.3 Phase 2 Week 6)
125
+ require_relative "omnizip/metadata"
126
+
127
+ # Password support (v1.3 Phase 2 Week 7)
128
+ require_relative "omnizip/password"
129
+
130
+ # Format conversion (v1.3 Phase 2 Week 8)
131
+ require_relative "omnizip/converter"
132
+
133
+ # Link handler for symbolic and hard links (v2.0 Phase 1 Weeks 2-3)
134
+ require_relative "omnizip/link_handler"
135
+
136
+ # Parallel processing (v2.0 Phase 4 Weeks 11-12)
137
+ # NOTE: Not auto-loaded to avoid loading fractor unnecessarily.
138
+ # Users who need parallel processing should explicitly require it:
139
+ # require "omnizip/parallel"
140
+ require_relative "omnizip/models/parallel_options"
141
+ # require_relative "omnizip/parallel" # Lazy-load only when needed
142
+
143
+ # Performance profiling components
144
+ require_relative "omnizip/profiler"
145
+ require_relative "omnizip/profiler/method_profiler"
146
+ require_relative "omnizip/profiler/memory_profiler"
147
+ require_relative "omnizip/profiler/report_generator"
148
+
149
+ # PAR2 parity archive support
150
+ require_relative "omnizip/parity"
151
+
152
+ # CLI components (cli.rb will require output_formatter itself)
153
+ require_relative "omnizip/cli"
154
+
155
+ # Convenience methods for native API
156
+ require_relative "omnizip/convenience"
@@ -0,0 +1,515 @@
1
+ = Advanced Features
2
+ :toc:
3
+ :toclevels: 3
4
+
5
+ == Purpose
6
+
7
+ This document covers advanced Omnizip features including progress tracking, selective extraction, parallel processing, and metadata management.
8
+
9
+ == Progress Tracking
10
+
11
+ === Progress Reporters
12
+
13
+ Omnizip provides multiple progress reporter types:
14
+
15
+ [cols="30,70",options="header"]
16
+ |===
17
+ |Reporter |Description
18
+
19
+ |**ConsoleReporter**
20
+ |Displays progress bar in terminal
21
+
22
+ |**CallbackReporter**
23
+ |Calls custom callback function
24
+
25
+ |**LogReporter**
26
+ |Writes progress to log file
27
+
28
+ |**SilentReporter**
29
+ |No output (default)
30
+ |===
31
+
32
+ === Using Progress Callbacks
33
+
34
+ [source,ruby]
35
+ ----
36
+ # Console progress bar
37
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
38
+ progress: :console
39
+ ) do |zip|
40
+ zip.add_directory('large_folder/')
41
+ end
42
+
43
+ # Custom callback
44
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
45
+ progress: ->(current, total, file) do
46
+ percentage = (current.to_f / total * 100).round(1)
47
+ puts "#{percentage}%: Processing #{file}"
48
+ end
49
+ ) do |zip|
50
+ zip.add_directory('data/')
51
+ end
52
+
53
+ # Log to file
54
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
55
+ progress: Omnizip::Progress::LogReporter.new('progress.log')
56
+ ) do |zip|
57
+ zip.add_file('large_file.dat')
58
+ end
59
+ ----
60
+
61
+ == ETA Calculation
62
+
63
+ === Estimated Time of Arrival
64
+
65
+ Smart completion time estimation with exponential smoothing:
66
+
67
+ [source,ruby]
68
+ ----
69
+ # ETA with progress tracking
70
+ progress = Omnizip::Progress::OperationProgress.new(
71
+ total_items: 1000,
72
+ enable_eta: true
73
+ )
74
+
75
+ 1000.times do |i|
76
+ # Simulate work
77
+ sleep(0.01)
78
+
79
+ # Update progress
80
+ progress.increment
81
+
82
+ # Get ETA
83
+ eta = progress.eta_result
84
+ if eta
85
+ puts "Progress: #{progress.percentage}%, ETA: #{eta.formatted_remaining}"
86
+ end
87
+ end
88
+ ----
89
+
90
+ === ETA Configuration
91
+
92
+ [source,ruby]
93
+ ----
94
+ # Configure ETA calculation
95
+ eta_calculator = Omnizip::Eta::TimeEstimator.new(
96
+ smoothing_factor: 0.3, # Exponential smoothing
97
+ min_samples: 5 # Minimum samples before showing ETA
98
+ )
99
+
100
+ progress = Omnizip::Progress::OperationProgress.new(
101
+ total_items: 500,
102
+ eta_calculator: eta_calculator
103
+ )
104
+ ----
105
+
106
+ == Selective Extraction
107
+
108
+ === Glob Pattern Matching
109
+
110
+ [source,ruby]
111
+ ----
112
+ # Extract only specific file patterns
113
+ Omnizip::Formats::SevenZip::Reader.open('archive.7z') do |zip|
114
+ # Extract all .txt files
115
+ zip.extract_matching('*.txt', 'output/')
116
+
117
+ # Extract all files in docs/ directory
118
+ zip.extract_matching('docs/**/*', 'output/')
119
+
120
+ # Extract with multiple patterns
121
+ zip.extract_matching(['*.pdf', '*.doc'], 'output/')
122
+ end
123
+ ----
124
+
125
+ === Regex Pattern Matching
126
+
127
+ [source,ruby]
128
+ ----
129
+ # Extract files matching regex
130
+ Omnizip::Formats::SevenZip::Reader.open('archive.7z') do |zip|
131
+ # Extract all image files
132
+ zip.extract_regex(/\.(jpg|png|gif)$/i, 'images/')
133
+
134
+ # Extract files containing "report" in name
135
+ zip.extract_regex(/report.*\.pdf$/i, 'reports/')
136
+ end
137
+ ----
138
+
139
+ === Predicate-based Extraction
140
+
141
+ [source,ruby]
142
+ ----
143
+ # Extract files matching custom criteria
144
+ Omnizip::Formats::SevenZip::Reader.open('archive.7z') do |zip|
145
+ # Extract large files only
146
+ zip.extract_if('output/') do |entry|
147
+ entry.size > 1_000_000 # > 1MB
148
+ end
149
+
150
+ # Extract recent files
151
+ zip.extract_if('output/') do |entry|
152
+ entry.mtime > Time.now - 86400 # Last 24 hours
153
+ end
154
+ end
155
+ ----
156
+
157
+ == Parallel Processing
158
+
159
+ === Multi-threaded Compression
160
+
161
+ [source,ruby]
162
+ ----
163
+ # Enable parallel compression using Ractors
164
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
165
+ parallel: true,
166
+ threads: 4
167
+ ) do |zip|
168
+ # Files will be compressed in parallel
169
+ Dir.glob('data/**/*').each { |f| zip.add_file(f) }
170
+ end
171
+ ----
172
+
173
+ === Parallel Options
174
+
175
+ [source,ruby]
176
+ ----
177
+ parallel_opts = Omnizip::Models::ParallelOptions.new(
178
+ enabled: true,
179
+ max_threads: 4,
180
+ chunk_size: 1024 * 1024, # 1MB chunks
181
+ queue_size: 10
182
+ )
183
+
184
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
185
+ parallel_options: parallel_opts
186
+ ) do |zip|
187
+ zip.add_directory('large_dataset/')
188
+ end
189
+ ----
190
+
191
+ == Chunked Processing
192
+
193
+ === Memory-efficient Large Files
194
+
195
+ [source,ruby]
196
+ ----
197
+ # Process files in chunks to reduce memory usage
198
+ chunked_reader = Omnizip::Chunked::Reader.new(
199
+ 'huge_file.dat',
200
+ chunk_size: 64 * 1024 * 1024 # 64MB chunks
201
+ )
202
+
203
+ chunked_reader.each_chunk do |chunk|
204
+ # Process chunk without loading entire file
205
+ process_data(chunk)
206
+ end
207
+ ----
208
+
209
+ === Chunked Writing
210
+
211
+ [source,ruby]
212
+ ----
213
+ # Write large files in chunks
214
+ chunked_writer = Omnizip::Chunked::Writer.new(
215
+ 'output.dat',
216
+ chunk_size: 32 * 1024 * 1024 # 32MB chunks
217
+ )
218
+
219
+ loop do
220
+ data = generate_data # Generate data dynamically
221
+ break if data.nil?
222
+
223
+ chunked_writer.write_chunk(data)
224
+ end
225
+
226
+ chunked_writer.finalize
227
+ ----
228
+
229
+ == Metadata Management
230
+
231
+ === Reading Archive Metadata
232
+
233
+ [source,ruby]
234
+ ----
235
+ # Read archive metadata
236
+ metadata = Omnizip::Metadata::ArchiveMetadata.new('archive.7z')
237
+
238
+ puts "Created: #{metadata.created_at}"
239
+ puts "Modified: #{metadata.modified_at}"
240
+ puts "Creator: #{metadata.creator}"
241
+ puts "Comment: #{metadata.comment}"
242
+ puts "Encrypted: #{metadata.encrypted?}"
243
+ ----
244
+
245
+ === Editing Archive Metadata
246
+
247
+ [source,ruby]
248
+ ----
249
+ # Edit archive metadata
250
+ editor = Omnizip::Metadata::MetadataEditor.new('archive.7z')
251
+
252
+ editor.update do |meta|
253
+ meta.comment = "Updated backup archive"
254
+ meta.creator = "Backup System v2.0"
255
+ meta.custom_fields[:backup_id] = "20240115-001"
256
+ end
257
+
258
+ editor.save
259
+ ----
260
+
261
+ === Entry Metadata
262
+
263
+ [source,ruby]
264
+ ----
265
+ # Read and modify entry metadata
266
+ Omnizip::Formats::SevenZip::Reader.open('archive.7z') do |zip|
267
+ zip.entries.each do |entry|
268
+ meta = entry.metadata
269
+
270
+ puts "Name: #{meta.name}"
271
+ puts "Size: #{meta.size}"
272
+ puts "Compressed: #{meta.compressed_size}"
273
+ puts "Modified: #{meta.mtime}"
274
+ puts "Permissions: #{meta.permissions.to_s(8)}"
275
+ end
276
+ end
277
+ ----
278
+
279
+ == Link Handling
280
+
281
+ === Symbolic Links
282
+
283
+ [source,ruby]
284
+ ----
285
+ # Create archive with symbolic links
286
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
287
+ preserve_symlinks: true
288
+ ) do |zip|
289
+ zip.add_file('link_to_file') # Preserves as symlink
290
+ zip.add_directory('folder_with_links/', recursive: true)
291
+ end
292
+
293
+ # Extract preserving symlinks
294
+ Omnizip::Formats::SevenZip::Reader.open('archive.7z') do |zip|
295
+ zip.extract_all('output/', preserve_symlinks: true)
296
+ end
297
+ ----
298
+
299
+ === Hard Links
300
+
301
+ [source,ruby]
302
+ ----
303
+ # Detect and preserve hard links
304
+ handler = Omnizip::LinkHandler::HardLink.new
305
+
306
+ # Add files with hard link detection
307
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z') do |zip|
308
+ files = Dir.glob('data/**/*')
309
+
310
+ files.each do |file|
311
+ if handler.is_hardlink?(file)
312
+ # Store as link reference
313
+ zip.add_hardlink(file, handler.link_target(file))
314
+ else
315
+ zip.add_file(file)
316
+ end
317
+ end
318
+ end
319
+ ----
320
+
321
+ == Stream Processing
322
+
323
+ === Pipe-based Compression
324
+
325
+ [source,ruby]
326
+ ----
327
+ # Compress from stdin to stdout
328
+ Omnizip::Pipe::StreamCompressor.new(:lzma2, level: 9) do |compressor|
329
+ STDIN.each_line do |line|
330
+ compressed = compressor.compress(line)
331
+ STDOUT.write(compressed)
332
+ end
333
+ end
334
+ ----
335
+
336
+ === Stream Decompression
337
+
338
+ [source,ruby]
339
+ ----
340
+ # Decompress from stdin to stdout
341
+ Omnizip::Pipe::StreamDecompressor.new(:lzma2) do |decompressor|
342
+ while (chunk = STDIN.read(8192))
343
+ decompressed = decompressor.decompress(chunk)
344
+ STDOUT.write(decompressed)
345
+ end
346
+ end
347
+ ----
348
+
349
+ == Temporary File Management
350
+
351
+ === Automatic Cleanup
352
+
353
+ [source,ruby]
354
+ ----
355
+ # Temp files automatically cleaned up
356
+ Omnizip::Temp.with_tmpfile('archive') do |temp_path|
357
+ # Create temporary archive
358
+ Omnizip::Formats::SevenZip::Writer.new(temp_path) do |zip|
359
+ zip.add_file('data.txt')
360
+ end
361
+
362
+ # Process archive
363
+ process_archive(temp_path)
364
+
365
+ # Temp file automatically deleted after block
366
+ end
367
+ ----
368
+
369
+ === Temp Directory Management
370
+
371
+ [source,ruby]
372
+ ----
373
+ # Temporary directory with cleanup
374
+ Omnizip::Temp.with_tmpdir do |temp_dir|
375
+ # Extract to temp directory
376
+ Omnizip::Formats::SevenZip::Reader.open('archive.7z') do |zip|
377
+ zip.extract_all(temp_dir)
378
+ end
379
+
380
+ # Process files
381
+ process_files(temp_dir)
382
+
383
+ # Directory and contents deleted after block
384
+ end
385
+ ----
386
+
387
+ == Platform-specific Features
388
+
389
+ === NTFS Alternate Data Streams (Windows)
390
+
391
+ [source,ruby]
392
+ ----
393
+ # Preserve NTFS streams on Windows
394
+ if Omnizip::Platform.windows?
395
+ Omnizip::Formats::SevenZip::Writer.new('archive.7z',
396
+ preserve_ntfs_streams: true
397
+ ) do |zip|
398
+ zip.add_file('file_with_streams.txt')
399
+ end
400
+ end
401
+ ----
402
+
403
+ === Extended Attributes (Unix)
404
+
405
+ [source,ruby]
406
+ ----
407
+ # Preserve extended attributes on Unix
408
+ if Omnizip::Platform.unix?
409
+ Omnizip::Formats::Tar::Writer.open('archive.tar',
410
+ preserve_xattr: true
411
+ ) do |tar|
412
+ tar.add_file('file_with_xattr')
413
+ end
414
+ end
415
+ ----
416
+
417
+ == Examples
418
+
419
+ === Example 1: Selective Backup with Progress
420
+
421
+ [source,ruby]
422
+ ----
423
+ def selective_backup(source_dir, archive_path)
424
+ total_files = Dir.glob("#{source_dir}/**/*").count { |f| File.file?(f) }
425
+ current = 0
426
+
427
+ Omnizip::Formats::SevenZip::Writer.new(archive_path,
428
+ progress: ->(cur, tot, file) do
429
+ pct = (cur.to_f / tot * 100).round(1)
430
+ puts "\r[#{pct}%] #{file}".ljust(80)
431
+ end
432
+ ) do |zip|
433
+ Dir.glob("#{source_dir}/**/*") do |file|
434
+ next if File.directory?(file)
435
+
436
+ # Skip temporary and cache files
437
+ next if file =~ /\.(tmp|cache|log)$/
438
+
439
+ # Skip if file is too large
440
+ next if File.size(file) > 100 * 1024 * 1024 # > 100MB
441
+
442
+ zip.add_file(file)
443
+ current += 1
444
+ end
445
+ end
446
+
447
+ puts "\nBackup complete: #{current}/#{total_files} files archived"
448
+ end
449
+
450
+ selective_backup('my_project/', 'backup.7z')
451
+ ----
452
+
453
+ === Example 2: Parallel Archive Processing
454
+
455
+ [source,ruby]
456
+ ----
457
+ def parallel_process_archives(archive_paths)
458
+ require 'parallel'
459
+
460
+ Parallel.each(archive_paths, in_threads: 4) do |archive_path|
461
+ begin
462
+ # Extract with progress
463
+ output_dir = "extracted_#{File.basename(archive_path, '.*')}"
464
+
465
+ Omnizip::Formats::SevenZip::Reader.open(archive_path,
466
+ parallel: true
467
+ ) do |zip|
468
+ zip.extract_all(output_dir)
469
+ end
470
+
471
+ puts "āœ“ Processed: #{archive_path}"
472
+ rescue => e
473
+ puts "āœ— Failed: #{archive_path} - #{e.message}"
474
+ end
475
+ end
476
+ end
477
+
478
+ archives = Dir.glob('archives/*.7z')
479
+ parallel_process_archives(archives)
480
+ ----
481
+
482
+ === Example 3: Streaming Large File Compression
483
+
484
+ [source,ruby]
485
+ ----
486
+ def stream_compress_large_file(input_path, output_path)
487
+ chunk_size = 64 * 1024 * 1024 # 64MB chunks
488
+
489
+ # Setup chunked reader and compressor
490
+ reader = Omnizip::Chunked::Reader.new(input_path, chunk_size: chunk_size)
491
+ compressor = Omnizip::Pipe::StreamCompressor.new(:lzma2, level: 9)
492
+
493
+ File.open(output_path, 'wb') do |output|
494
+ reader.each_chunk.with_index do |chunk, idx|
495
+ compressed = compressor.compress(chunk)
496
+ output.write(compressed)
497
+
498
+ # Progress
499
+ progress = ((idx + 1).to_f / reader.chunk_count * 100).round(1)
500
+ print "\rCompressing: #{progress}%"
501
+ end
502
+ end
503
+
504
+ puts "\nāœ“ Compression complete"
505
+ end
506
+
507
+ stream_compress_large_file('huge_file.dat', 'huge_file.dat.lzma')
508
+ ----
509
+
510
+ == See Also
511
+
512
+ * link:compression-profiles.adoc[Compression Profiles]
513
+ * link:format-converter.adoc[Format Converter]
514
+ * link:performance-profiler.adoc[Performance Profiler]
515
+ * link:../README.adoc[Main README]