omnizip 0.4.7-x86_64-linux

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,219 @@
1
+ ---
2
+ title: Your First Archive
3
+ nav_order: 4
4
+ parent: Getting Started
5
+ ---
6
+
7
+ == Your First Archive
8
+
9
+ === General
10
+
11
+ This guide walks you through creating your first archive with Omnizip, covering both .7z and ZIP formats.
12
+
13
+ === Creating a Simple 7z Archive
14
+
15
+ ==== Command Line
16
+
17
+ [source,bash]
18
+ ----
19
+ # Create a 7z archive with default settings
20
+ omnizip archive create backup.7z document.txt photo.jpg
21
+ ----
22
+
23
+ This creates a new archive using LZMA2 compression at level 5 (default).
24
+
25
+ ==== Ruby API
26
+
27
+ [source,ruby]
28
+ ----
29
+ require 'omnizip'
30
+
31
+ # Create archive with default settings
32
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z')
33
+ writer.add_file('document.txt')
34
+ writer.add_file('photo.jpg')
35
+ writer.close
36
+
37
+ puts "Archive created successfully!"
38
+ ----
39
+
40
+ === Customizing Compression
41
+
42
+ ==== Higher Compression
43
+
44
+ [source,bash]
45
+ ----
46
+ omnizip archive create backup.7z documents/ \
47
+ --algorithm lzma2 --level 9
48
+ ----
49
+
50
+ [source,ruby]
51
+ ----
52
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z',
53
+ algorithm: :lzma2,
54
+ level: 9
55
+ )
56
+ writer.add_directory('documents/')
57
+ writer.close
58
+ ----
59
+
60
+ ==== Faster Compression
61
+
62
+ [source,bash]
63
+ ----
64
+ omnizip archive create backup.7z data/ \
65
+ --algorithm lzma2 --level 1
66
+ ----
67
+
68
+ [source,ruby]
69
+ ----
70
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z',
71
+ algorithm: :lzma2,
72
+ level: 1
73
+ )
74
+ writer.add_directory('data/')
75
+ writer.close
76
+ ----
77
+
78
+ === Creating a ZIP Archive
79
+
80
+ ==== Command Line
81
+
82
+ [source,bash]
83
+ ----
84
+ # Create a ZIP archive
85
+ omnizip archive create backup.zip documents/ \
86
+ --format zip
87
+ ----
88
+
89
+ ==== Ruby API
90
+
91
+ [source,ruby]
92
+ ----
93
+ require 'omnizip'
94
+
95
+ writer = Omnizip::Formats::Zip::Writer.new('backup.zip')
96
+ writer.add_directory('documents/')
97
+ writer.close
98
+ ----
99
+
100
+ === Using Filters for Executables
101
+
102
+ BCJ filters improve compression of executable files:
103
+
104
+ [source,bash]
105
+ ----
106
+ omnizip archive create binaries.7z app.exe \
107
+ --filters bcj_x86
108
+ ----
109
+
110
+ [source,ruby]
111
+ ----
112
+ writer = Omnizip::Formats::SevenZip::Writer.new('binaries.7z',
113
+ filters: [:bcj_x86]
114
+ )
115
+ writer.add_file('app.exe')
116
+ writer.close
117
+ ----
118
+
119
+ === Creating Multi-Volume Archives
120
+
121
+ Split large archives into multiple volumes:
122
+
123
+ [source,bash]
124
+ ----
125
+ # Create volumes of 100MB each
126
+ omnizip archive create backup.7z.001 large_data/ \
127
+ --volume-size 100M
128
+ ----
129
+
130
+ [source,ruby]
131
+ ----
132
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z.001',
133
+ volume_size: 100 * 1024 * 1024
134
+ )
135
+ writer.add_directory('large_data/')
136
+ writer.close
137
+ ----
138
+
139
+ === Encrypting Archives
140
+
141
+ Protect your archives with a password:
142
+
143
+ [source,bash]
144
+ ----
145
+ omnizip archive create secure.7z documents/ \
146
+ --password "MySecurePassword123!"
147
+ ----
148
+
149
+ [source,ruby]
150
+ ----
151
+ writer = Omnizip::Formats::SevenZip::Writer.new('secure.7z',
152
+ password: 'MySecurePassword123!'
153
+ )
154
+ writer.add_directory('documents/')
155
+ writer.close
156
+ ----
157
+
158
+ === Complete Example
159
+
160
+ Here's a complete example that creates a backup archive:
161
+
162
+ [source,ruby]
163
+ ----
164
+ require 'omnizip'
165
+
166
+ # Create encrypted backup with high compression
167
+ writer = Omnizip::Formats::SevenZip::Writer.new('backup.7z',
168
+ algorithm: :lzma2,
169
+ level: 7,
170
+ password: ENV['BACKUP_PASSWORD'],
171
+ solid: true
172
+ )
173
+
174
+ # Add directories
175
+ writer.add_directory('/home/user/documents')
176
+ writer.add_directory('/home/user/projects')
177
+ writer.add_directory('/home/user/photos')
178
+
179
+ # Write the archive
180
+ writer.close
181
+
182
+ # Get statistics
183
+ entries = Omnizip.list_archive('backup.7z', details: true)
184
+ files = entries.reject { |e| e[:directory] }
185
+ uncompressed = files.sum { |e| e[:size] }
186
+ compressed = File.size('backup.7z')
187
+ puts "Archive created:"
188
+ puts " Files: #{files.size}"
189
+ puts " Size: #{uncompressed} bytes"
190
+ puts " Compressed: #{compressed} bytes"
191
+ puts " Ratio: #{(compressed.to_f / uncompressed * 100).round(1)}%"
192
+ ----
193
+
194
+ === Verifying Your Archive
195
+
196
+ Always verify your archive after creation:
197
+
198
+ [source,bash]
199
+ ----
200
+ omnizip archive list backup.7z
201
+ ----
202
+
203
+ [source,ruby]
204
+ ----
205
+ require 'omnizip'
206
+
207
+ reader = Omnizip::Formats::SevenZip::Reader.new('backup.7z')
208
+ puts "Archive contents:"
209
+ reader.entries.each do |entry|
210
+ puts " #{entry.name} (#{entry.size} bytes)"
211
+ end
212
+ ----
213
+
214
+ === Next Steps
215
+
216
+ * link:../guides/basic-usage/creating-archives[Creating Archives Guide] - More archive options
217
+ * link:../guides/advanced-usage/solid-compression[Solid Archives] - Better compression for similar files
218
+ * link:../guides/advanced-usage/encryption[Encryption Guide] - Password protection details
219
+ * link:../guides/basic-usage/extracting-archives[Extracting Archives] - How to extract your archives
@@ -0,0 +1,277 @@
1
+ ---
2
+ title: Encryption
3
+ nav_order: 4
4
+ parent: Advanced Features
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == Purpose
9
+
10
+ Protect sensitive data in your archives with industry-standard AES-256 encryption. Omnizip supports multiple encryption methods across different archive formats.
11
+
12
+ == Benefits
13
+
14
+ * **Strong Security**: AES-256 encryption with secure key derivation
15
+ * **Format**: Encryption available for 7z archives (ZIP encryption is unsupported)
16
+ * **Header Protection**: Encrypt filenames and metadata (7z format)
17
+ * **Password Validation**: Built-in password strength checking
18
+ * **Compatibility**: Works with archives from other tools
19
+
20
+ == Encryption Methods
21
+
22
+ === AES-256 (7z Format)
23
+
24
+ The strongest encryption option with header protection:
25
+
26
+ [source,ruby]
27
+ ----
28
+ # Create encrypted 7z archive
29
+ Omnizip::Archive.create(
30
+ 'secure.7z',
31
+ format: :seven_zip,
32
+ password: 'MyStr0ngP@ssw0rd',
33
+ encrypt_headers: true # Hide filenames
34
+ ) do |archive|
35
+ archive.add_file('confidential.pdf', 'documents/confidential.pdf')
36
+ archive.add_directory('sensitive_data/')
37
+ end
38
+ ----
39
+
40
+ **Features**:
41
+
42
+ * AES-256-CBC encryption
43
+ * PBKDF2-HMAC-SHA256 key derivation (524,288 iterations)
44
+ * Optional header encryption (hides filenames)
45
+ * HMAC-SHA-256 authentication
46
+
47
+ === ZIP Encryption: not supported
48
+
49
+ Omnizip can neither create nor decrypt encrypted ZIP archives —
50
+ neither WinZip AES nor traditional ZipCrypto. Encrypted 7z is the
51
+ supported path; extract encrypted ZIPs with 7-Zip/unzip.
52
+
53
+ The convenience API raises rather than silently ignoring a
54
+ password for zip:
55
+
56
+ [source,ruby]
57
+ ----
58
+ Omnizip::Archive.create('secure.zip', password: 'x')
59
+ # => Omnizip::UnsupportedFormatError:
60
+ # password is only supported for seven_zip; :zip has no encryption support
61
+ ----
62
+
63
+ == Decrypting Archives
64
+
65
+ === Provide Password at Open
66
+
67
+ [source,ruby]
68
+ ----
69
+ # Decrypt 7z archive
70
+ Omnizip::Archive.open('secure.7z', password: 'MyStr0ngP@ssw0rd') do |archive|
71
+ archive.extract_all('decrypted/')
72
+ end
73
+
74
+ # ZIP encryption: Omnizip can neither create nor decrypt
75
+ # password-protected ZIP archives; extract them with 7-Zip/unzip
76
+ ----
77
+
78
+ === Password via Environment Variable
79
+
80
+ [source,ruby]
81
+ ----
82
+ # Set password in environment
83
+ ENV['OMNIZIP_PASSWORD'] = 'MyStr0ngP@ssw0rd'
84
+
85
+ # Opens without explicit password parameter
86
+ Omnizip::Archive.open('secure.7z') do |archive|
87
+ archive.extract_all('output/')
88
+ end
89
+ ----
90
+
91
+ == Password Management
92
+
93
+ === Password Strength Validation
94
+
95
+ Ensure strong passwords before encryption:
96
+
97
+ [source,ruby]
98
+ ----
99
+ validator = Omnizip::PasswordValidator.new(
100
+ min_length: 12,
101
+ require_uppercase: true,
102
+ require_lowercase: true,
103
+ require_numbers: true,
104
+ require_special: true
105
+ )
106
+
107
+ begin
108
+ validator.validate('weak')
109
+ rescue Omnizip::WeakPasswordError => e
110
+ puts "Password too weak: #{e.message}"
111
+ # Password must be at least 12 characters with uppercase, lowercase, numbers, and special characters
112
+ end
113
+
114
+ # Use validated password
115
+ validator.validate('MyStr0ng!P@ssw0rd2024') # ✅ Passes
116
+ ----
117
+
118
+ === Secure Password Input
119
+
120
+ Prompt for passwords without echo:
121
+
122
+ [source,ruby]
123
+ ----
124
+ require 'io/console'
125
+
126
+ def get_password
127
+ print "Enter password: "
128
+ password = STDIN.noecho(&:gets).chomp
129
+ puts # New line after password entry
130
+ password
131
+ end
132
+
133
+ password = get_password
134
+ Omnizip::Archive.create('secure.7z', password: password) do |archive|
135
+ # Create encrypted archive
136
+ end
137
+ ----
138
+
139
+ == Security Best Practices
140
+
141
+ . **Use Strong Passwords**: Minimum 12 characters with mixed case, numbers, and symbols
142
+ . **Prefer 7z Format**: Header encryption hides filenames and structure
143
+ . **Avoid Traditional Encryption**: Use WinZip AES or 7z AES-256 instead
144
+ . **Secure Password Storage**: Never hardcode passwords in source code
145
+ . **Key Derivation**: Use default iterations (524,288) or higher
146
+ . **Test Decryption**: Always verify encrypted archives can be decrypted
147
+
148
+ == Encryption Comparison
149
+
150
+ [cols="2,1,1,1,1"]
151
+ |===
152
+ |Feature |7z AES-256 |WinZip AES |Traditional |Recommendation
153
+
154
+ |**Security Level**
155
+ |Excellent
156
+ |Very Good
157
+ |Weak
158
+ |Use 7z or WinZip AES
159
+
160
+ |**Header Encryption**
161
+ |✅
162
+ |❌
163
+ |❌
164
+ |7z for privacy
165
+
166
+ |**Key Derivation**
167
+ |PBKDF2-SHA256
168
+ |PBKDF2-SHA1
169
+ |CRC check
170
+ |Modern algorithms
171
+
172
+ |**Authentication**
173
+ |HMAC-SHA-256
174
+ |HMAC-SHA-1
175
+ |None
176
+ |Detects tampering
177
+
178
+ |**Compatibility**
179
+ |7-Zip, PeaZip
180
+ |Most tools
181
+ |Universal
182
+ |Consider audience
183
+ |===
184
+
185
+ == Command-Line Usage
186
+
187
+ [source,bash]
188
+ ----
189
+ # Create encrypted archive
190
+ omnizip archive create secure.7z files/ \
191
+ --password 'MyStr0ngP@ssw0rd' \
192
+ --encrypt-headers
193
+
194
+ # Extract with password
195
+ omnizip archive extract secure.7z output/ \
196
+ --password 'MyStr0ngP@ssw0rd'
197
+
198
+ # Or prompt for password
199
+ omnizip archive create secure.7z files/ --password
200
+ Enter password: ********
201
+ ----
202
+
203
+ == Common Use Cases
204
+
205
+ === Protect Sensitive Documents
206
+
207
+ [source,ruby]
208
+ ----
209
+ # Encrypt sensitive files before cloud storage
210
+ Omnizip::Archive.create(
211
+ 'confidential-docs.7z',
212
+ format: :seven_zip,
213
+ password: secure_password,
214
+ encrypt_headers: true,
215
+ compression: :lzma2,
216
+ level: 9
217
+ ) do |archive|
218
+ archive.add_directory('contracts/')
219
+ archive.add_directory('financial-records/')
220
+ end
221
+
222
+ # Upload to cloud storage
223
+ cloud_storage.upload('confidential-docs.7z')
224
+ ----
225
+
226
+ === Secure Backups
227
+
228
+ [source,ruby]
229
+ ----
230
+ # Create encrypted backup with timestamp
231
+ timestamp = Time.now.strftime('%Y%m%d_%H%M%S')
232
+ backup_file = "backup_#{timestamp}.7z"
233
+
234
+ Omnizip::Archive.create(
235
+ backup_file,
236
+ format: :seven_zip,
237
+ password: ENV['BACKUP_PASSWORD'],
238
+ encrypt_headers: true
239
+ ) do |archive|
240
+ archive.add_directory('/var/www/app/')
241
+ archive.add_directory('/etc/app-config/')
242
+ end
243
+ ----
244
+
245
+ == Troubleshooting
246
+
247
+ === Wrong Password Error
248
+
249
+ [source,ruby]
250
+ ----
251
+ begin
252
+ Omnizip::Archive.open('secure.7z', password: 'wrong') do |archive|
253
+ archive.extract_all('output/')
254
+ end
255
+ rescue Omnizip::DecryptionError => e
256
+ puts "Incorrect password: #{e.message}"
257
+ end
258
+ ----
259
+
260
+ === Unsupported Encryption Method
261
+
262
+ Some older archives may use unsupported encryption:
263
+
264
+ [source,ruby]
265
+ ----
266
+ begin
267
+ Omnizip::Archive.open('old-archive.7z', password: 'wrong') do |archive|
268
+ archive.read('secret.txt')
269
+ end
270
+ rescue Omnizip::FormatError => e
271
+ puts "Archive damaged or password wrong: #{e.message}"
272
+ end
273
+ ----
274
+
275
+ == See Also
276
+
277
+ * link:../../compatibility.html[Compatibility] - Encryption support across formats
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: Advanced Features
3
+ nav_order: 30
4
+ parent: Guides
5
+ has_children: true
6
+ ---
7
+
8
+ == Advanced Features Overview
9
+
10
+ Omnizip provides several advanced features for power users and production deployments.
11
+
12
+ == Available Features
13
+
14
+ [cols="1,3"]
15
+ |===
16
+ |Feature |Description
17
+
18
+ |link:streaming.html[Streaming Operations]
19
+ |Process archives without loading entire files into memory
20
+
21
+ |link:parallel-processing.html[Parallel Processing]
22
+ |Leverage multiple CPU cores for faster compression
23
+
24
+ |link:progress-tracking.html[Progress Tracking]
25
+ |Real-time progress monitoring for long operations
26
+
27
+ |link:encryption.html[Encryption]
28
+ |AES-256 password protection for archives
29
+ |===
30
+
31
+ == Feature Combinations
32
+
33
+ These features can be combined for maximum efficiency:
34
+
35
+ [source,ruby]
36
+ ----
37
+ # Streaming writes + a progress tracker
38
+ require 'omnizip/zip/output_stream'
39
+
40
+ files = Dir.glob('large_data/**/*').select { |f| File.file?(f) }
41
+ tracker = Omnizip::Progress.track(
42
+ total_files: files.size,
43
+ total_bytes: files.sum { |f| File.size(f) },
44
+ reporter: :console
45
+ )
46
+
47
+ Omnizip::Zip::OutputStream.open('backup.zip') do |stream|
48
+ files.each do |file|
49
+ stream.put_next_entry(file.delete_prefix('large_data/'))
50
+ stream.write(File.binread(file))
51
+ tracker.update(files: 1, bytes: File.size(file))
52
+ end
53
+ end
54
+ ----
55
+
56
+ == See Also
57
+
58
+ * link:../compression-algorithms/[Compression Algorithms] - Algorithm-specific features
59
+ * link:../performance-tuning.html[Performance Tuning] - Optimize for your workload
@@ -0,0 +1,144 @@
1
+ ---
2
+ title: Parallel Processing
3
+ nav_order: 2
4
+ parent: Advanced Features
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == Purpose
9
+
10
+ Omnizip's codecs are pure Ruby and single-threaded: a single archive
11
+ is always compressed or extracted by one CPU core. To use multiple
12
+ cores, run independent archive operations in parallel — across
13
+ processes for CPU-bound compression, or across threads for
14
+ I/O-bound extraction of separate archives.
15
+
16
+ == When It Helps
17
+
18
+ [cols="1,3"]
19
+ |===
20
+ |Scenario |Approach
21
+
22
+ |Many archives to compress
23
+ |One process per archive
24
+
25
+ |Many archives to extract
26
+ |One thread per archive (I/O releases the GVL)
27
+
28
+ |One large archive
29
+ |No parallelism available; pick an appropriate +level:+
30
+ |===
31
+
32
+ == Parallel Compression (Processes)
33
+
34
+ Compression is CPU-bound, so use processes — MRI's GVL prevents
35
+ in-thread parallelism:
36
+
37
+ [source,ruby]
38
+ ----
39
+ # Compress each directory in its own process
40
+ dirs = %w[project_a project_b project_c]
41
+
42
+ pids = dirs.map do |dir|
43
+ Process.fork do
44
+ Omnizip.compress_directory(dir, "#{dir}.7z", format: :seven_zip)
45
+ end
46
+ end
47
+ pids.each { |pid| Process.wait(pid) }
48
+ ----
49
+
50
+ Or drive the CLI from your shell or job scheduler:
51
+
52
+ [source,bash]
53
+ ----
54
+ ls -d project_*/ | xargs -P 8 -I{} omnizip archive create {}.7z {}
55
+ ----
56
+
57
+ == Parallel Extraction (Threads)
58
+
59
+ Extracting separate archives is I/O-bound, so threads work:
60
+
61
+ [source,ruby]
62
+ ----
63
+ archives = Dir.glob('downloads/*.zip')
64
+
65
+ threads = archives.map do |archive|
66
+ Thread.new do
67
+ Omnizip.extract_archive(
68
+ archive,
69
+ "extracted/#{File.basename(archive, '.zip')}/"
70
+ )
71
+ end
72
+ end
73
+
74
+ threads.each(&:join)
75
+ ----
76
+
77
+ Note: a single archive's extraction still uses one thread.
78
+
79
+ == Use Cases
80
+
81
+ === Server Deployments
82
+
83
+ [source,ruby]
84
+ ----
85
+ # One process per site on a multi-core backup server
86
+ sites = Dir.children('/var/www')
87
+
88
+ pids = sites.map do |site|
89
+ Process.fork do
90
+ Omnizip.compress_directory(
91
+ File.join('/var/www', site),
92
+ "/backups/#{site}.7z",
93
+ format: :seven_zip, algorithm: :lzma2, level: 9
94
+ )
95
+ end
96
+ end
97
+ pids.each { |pid| Process.wait(pid) }
98
+ ----
99
+
100
+ === Batch Processing
101
+
102
+ Process multiple archives efficiently:
103
+
104
+ [source,ruby]
105
+ ----
106
+ # Extract multiple archives in parallel
107
+ archives = Dir.glob('downloads/*.zip')
108
+
109
+ archives.each_slice(4) do |batch|
110
+ threads = batch.map do |archive|
111
+ Thread.new do
112
+ Omnizip.extract_archive(
113
+ archive,
114
+ "extracted/#{File.basename(archive, '.zip')}/"
115
+ )
116
+ end
117
+ end
118
+
119
+ threads.each(&:join)
120
+ end
121
+ ----
122
+
123
+ == Best Practices
124
+
125
+ . **One process per archive** for compression; threads only help I/O
126
+ . **Consider disk I/O**: more parallelism may not help on slow disks
127
+ . **Monitor memory**: each process/thread adds overhead
128
+ . **Test your workload**: measure the real speedup
129
+
130
+ == Limitations
131
+
132
+ * No intra-archive parallelism: a single archive uses one core
133
+ * MRI's GVL blocks in-thread CPU parallelism — use processes
134
+ * Memory usage grows with process/thread count
135
+
136
+ == Platform Considerations
137
+
138
+ `Process.fork` is unavailable on Windows — use `Process.spawn` with
139
+ the +omnizip+ CLI there, or a job scheduler.
140
+
141
+ == See Also
142
+
143
+ * link:streaming.html[Streaming] - Memory efficiency
144
+ * link:../compression-algorithms/lzma2.html[LZMA2] - Default 7z algorithm