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
@@ -0,0 +1,361 @@
1
+ ---
2
+ title: Zstandard
3
+ nav_order: 8
4
+ parent: Compression Algorithms
5
+ grand_parent: Guides
6
+ ---
7
+
8
+ == Purpose
9
+
10
+ Zstandard (zstd) is a modern, fast compression algorithm developed by Facebook that offers an excellent balance between compression ratio and speed. It significantly outperforms Deflate in both speed and compression ratio.
11
+
12
+ == Key Characteristics
13
+
14
+ [cols="1,3"]
15
+ |===
16
+ |Property |Value
17
+
18
+ |Compression Ratio
19
+ |Very good (better than Deflate)
20
+
21
+ |Compression Speed
22
+ |Very fast (3-4x faster than Deflate)
23
+
24
+ |Decompression Speed
25
+ |Extremely fast (4-5x faster than Deflate)
26
+
27
+ |Memory Usage
28
+ |Low to medium
29
+
30
+ |Best For
31
+ |Real-time compression, high-throughput applications, modern systems
32
+ |===
33
+
34
+ == When to Use Zstandard
35
+
36
+ **Choose Zstandard when**:
37
+
38
+ * Need fast compression with good ratios
39
+ * Real-time compression requirements
40
+ * High throughput is critical
41
+ * Working with modern systems and tools
42
+ * Want better performance than Deflate without LZMA's slowness
43
+
44
+ **Consider alternatives when**:
45
+
46
+ * Maximum compatibility is required (use Deflate)
47
+ * Best compression ratio needed (use LZMA2)
48
+ * Working with legacy systems
49
+
50
+ == Basic Usage
51
+
52
+ === Create Zstandard Archive
53
+
54
+ [source,ruby]
55
+ ----
56
+ # Create with Zstandard compression
57
+ Omnizip::Archive.create('fast-backup.7z', format: :seven_zip) do |archive|
58
+ archive.compression = :zstandard
59
+ archive.level = 3 # Default level
60
+ archive.add_directory('data/')
61
+ end
62
+ ----
63
+
64
+ === Quick Compression
65
+
66
+ [source,ruby]
67
+ ----
68
+ # Fast compression for temporary archives
69
+ Omnizip.compress_file(
70
+ 'logfile.log',
71
+ 'logs.7z',
72
+ compression: :zstandard,
73
+ level: 1 # Fastest compression
74
+ )
75
+ ----
76
+
77
+ == Compression Levels
78
+
79
+ Zstandard offers levels 1-22 with fine-grained control:
80
+
81
+ [cols="1,2,2,2"]
82
+ |===
83
+ |Level Range |Speed |Ratio |Typical Use
84
+
85
+ |1-3
86
+ |Very Fast
87
+ |Good
88
+ |Real-time, temporary files
89
+
90
+ |3-7
91
+ |Fast
92
+ |Very Good
93
+ |**Default** - general use
94
+
95
+ |8-15
96
+ |Medium
97
+ |Excellent
98
+ |Distribution, important data
99
+
100
+ |16-22
101
+ |Slow
102
+ |Excellent+
103
+ |Archival (approaches LZMA)
104
+ |===
105
+
106
+ .Level Performance Example
107
+ [source,ruby]
108
+ ----
109
+ # Compare different Zstandard levels
110
+ [1, 3, 10, 19].each do |level|
111
+ time = Benchmark.measure do
112
+ Omnizip.compress_file('data.bin', "zstd-#{level}.7z",
113
+ compression: :zstandard,
114
+ level: level
115
+ )
116
+ end
117
+
118
+ size = File.size("zstd-#{level}.7z")
119
+ puts "Level #{level}: #{size / 1024} KB in #{time.real.round(3)}s"
120
+ end
121
+
122
+ # Output:
123
+ # Level 1: 145 KB in 0.052s (fastest)
124
+ # Level 3: 128 KB in 0.089s (default)
125
+ # Level 10: 105 KB in 0.425s (better compression)
126
+ # Level 19: 98 KB in 2.156s (approaching LZMA quality)
127
+ ----
128
+
129
+ == Performance Comparison
130
+
131
+ === Speed vs Deflate
132
+
133
+ [cols="2,1,1,1"]
134
+ |===
135
+ |Operation |Deflate |Zstandard |Improvement
136
+
137
+ |Compress 100 MB
138
+ |10s
139
+ |3s
140
+ |3.3x faster
141
+
142
+ |Decompress 100 MB
143
+ |5s
144
+ |1.2s
145
+ |4.2x faster
146
+
147
+ |Compression Ratio
148
+ |68%
149
+ |72%
150
+ |4% better
151
+ |===
152
+
153
+ === Speed vs LZMA
154
+
155
+ [cols="2,1,1,1"]
156
+ |===
157
+ |Operation |LZMA |Zstandard |Trade-off
158
+
159
+ |Compress 100 MB
160
+ |60s
161
+ |3s
162
+ |20x faster, slightly worse ratio
163
+
164
+ |Decompress 100 MB
165
+ |8s
166
+ |1.2s
167
+ |6.7x faster
168
+
169
+ |Compression Ratio
170
+ |78%
171
+ |72%
172
+ |LZMA ~6% better
173
+ |===
174
+
175
+ == Advanced Features
176
+
177
+ === Dictionary Training
178
+
179
+ Train custom dictionaries for specific data types:
180
+
181
+ [source,ruby]
182
+ ----
183
+ # Train dictionary on sample data
184
+ training_data = Dir.glob('samples/*.json').map { |f| File.read(f) }
185
+ dictionary = Omnizip::Zstandard.train_dictionary(training_data, size: 100.kilobytes)
186
+
187
+ # Use trained dictionary for better compression
188
+ Omnizip.compress_file('data.json', 'output.7z',
189
+ compression: :zstandard,
190
+ level: 5,
191
+ dictionary: dictionary
192
+ )
193
+
194
+ # Can improve compression 10-30% for similar data
195
+ ----
196
+
197
+ === Streaming with Zstandard
198
+
199
+ Excellent streaming performance:
200
+
201
+ [source,ruby]
202
+ ----
203
+ # Stream compression for real-time data
204
+ Omnizip::OutputStream.open('stream.7z', format: :seven_zip) do |stream|
205
+ stream.compression = :zstandard
206
+ stream.level = 3 # Fast for real-time
207
+
208
+ # Process log entries as they arrive
209
+ log_stream.each do |log_entry|
210
+ stream.put_next_entry("log_#{log_entry.id}.txt")
211
+ stream.write(log_entry.content)
212
+ end
213
+ end
214
+ ----
215
+
216
+ == Use Cases
217
+
218
+ === Log File Compression
219
+
220
+ Perfect for compressing logs quickly:
221
+
222
+ [source,ruby]
223
+ ----
224
+ # Compress today's logs rapidly
225
+ log_files = Dir.glob('/var/log/app/*.log')
226
+
227
+ Omnizip.compress_files(
228
+ log_files,
229
+ "logs_#{Date.today}.7z",
230
+ compression: :zstandard,
231
+ level: 5 # Fast with good compression
232
+ ) do |progress|
233
+ puts "Compressing logs: #{progress.percentage}%"
234
+ end
235
+ ----
236
+
237
+ === Web Application Responses
238
+
239
+ Compress API responses on-the-fly:
240
+
241
+ [source,ruby]
242
+ ----
243
+ class ExportController < ApplicationController
244
+ def download
245
+ # Generate export data
246
+ data = generate_export_data
247
+
248
+ # Compress quickly with Zstandard
249
+ compressed = Omnizip::Buffer.create(:seven_zip) do |archive|
250
+ archive.compression = :zstandard
251
+ archive.level = 3 # Fast compression
252
+
253
+ data.each do |filename, content|
254
+ archive.add(filename, content)
255
+ end
256
+ end
257
+
258
+ send_data compressed.string,
259
+ filename: 'export.7z',
260
+ type: 'application/x-7z-compressed'
261
+ end
262
+ end
263
+ ----
264
+
265
+ === Database Dumps
266
+
267
+ Compress database backups efficiently:
268
+
269
+ [source,ruby]
270
+ ----
271
+ # Stream database dump to compressed archive
272
+ require 'open3'
273
+
274
+ Omnizip::OutputStream.open('db-backup.7z', format: :seven_zip) do |stream|
275
+ stream.compression = :zstandard
276
+ stream.level = 7
277
+ stream.put_next_entry('database.sql')
278
+
279
+ # Stream pg_dump output directly
280
+ Open3.popen3('pg_dump mydb') do |stdin, stdout, stderr, wait_thr|
281
+ while chunk = stdout.read(65536)
282
+ stream.write(chunk)
283
+ end
284
+ end
285
+ end
286
+ ----
287
+
288
+ == Memory Efficiency
289
+
290
+ Zstandard is memory efficient:
291
+
292
+ [cols="1,1,1"]
293
+ |===
294
+ |Level |Compression RAM |Decompression RAM
295
+
296
+ |1-3
297
+ |~1 MB
298
+ |<1 MB
299
+
300
+ |4-7
301
+ |~8 MB
302
+ |<1 MB
303
+
304
+ |8-15
305
+ |~30 MB
306
+ |<1 MB
307
+
308
+ |16-22
309
+ |~100 MB
310
+ |<1 MB
311
+ |===
312
+
313
+ *Note: Decompression always requires minimal memory*
314
+
315
+ == Best Practices
316
+
317
+ . **Use Level 3-5 for General Use**: Excellent speed/ratio balance
318
+ . **Level 1 for Real-Time**: When speed is critical
319
+ . **Level 10+ for Archival**: When time permits better compression
320
+ . **Train Dictionaries**: For repetitive data types (JSON, logs)
321
+ . **Monitor Performance**: Should achieve 50-200 MB/s compression
322
+
323
+ == Command-Line Usage
324
+
325
+ [source,bash]
326
+ ----
327
+ # Create Zstandard-compressed archive
328
+ $ omnizip archive create backup.7z data/ \
329
+ --compression zstandard \
330
+ --level 5
331
+
332
+ # Fast compression
333
+ $ omnizip archive create logs.7z logs/ \
334
+ --compression zstandard \
335
+ --level 1 \
336
+ --verbose
337
+ Algorithm: Zstandard, Level: 1
338
+ Compression speed: 185 MB/s
339
+ Original: 500 MB
340
+ Compressed: 145 MB (71% reduction)
341
+ Time: 2.7s
342
+ ----
343
+
344
+ == Technical Details
345
+
346
+ **Zstandard Features**:
347
+
348
+ * **Fast Entropy Encoding**: Finite State Entropy (FSE) for speed
349
+ * **Adaptive Window**: Dynamically sized based on level
350
+ * **Dictionary Compression**: Optional pre-trained dictionaries
351
+ * **Multi-Threading**: Native parallel compression support
352
+ * **Seekable Format**: Optional frame indexes for random access
353
+
354
+ **Implementation**: Uses zstd-ruby gem (native binding)
355
+
356
+ == See Also
357
+
358
+ * link:deflate.html[Deflate] - Traditional fast compression
359
+ * link:lzma2.html[LZMA2] - Better ratio, slower speed
360
+ * link:../advanced-features/streaming.html[Streaming] - Zstandard excels at streaming
361
+ * link:../performance-tuning.html[Performance Tuning] - Optimize for speed
@@ -0,0 +1,354 @@
1
+ ---
2
+ title: Creating Archives
3
+ nav_order: 1
4
+ parent: Guides
5
+ ---
6
+
7
+ == Creating Archives
8
+
9
+ Step-by-step guide to creating archives with Omnizip.
10
+
11
+ == Quick Examples
12
+
13
+ === Create ZIP Archive
14
+
15
+ [source,ruby]
16
+ ----
17
+ require 'omnizip'
18
+
19
+ Omnizip::Archive.create('backup.zip') do |archive|
20
+ archive.add_file('document.pdf')
21
+ archive.add_directory('photos/')
22
+ end
23
+ ----
24
+
25
+ === Create 7z Archive
26
+
27
+ [source,ruby]
28
+ ----
29
+ Omnizip::Archive.create('backup.7z', format: :seven_zip) do |archive|
30
+ archive.add_directory('data/')
31
+ end
32
+ ----
33
+
34
+ === Create RAR5 Archive
35
+
36
+ [source,ruby]
37
+ ----
38
+ require 'omnizip/formats/rar/rar5/writer'
39
+
40
+ # STORE compression (uncompressed)
41
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar')
42
+ writer.add_file('document.txt')
43
+ writer.add_file('image.png')
44
+ writer.write
45
+
46
+ # LZMA compression (default level 3)
47
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
48
+ compression: :lzma
49
+ )
50
+ writer.add_file('large_dataset.json')
51
+ writer.write
52
+
53
+ # LZMA level 5 (best compression)
54
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
55
+ compression: :lzma,
56
+ level: 5
57
+ )
58
+ writer.add_directory('photos/')
59
+ writer.write
60
+
61
+ # Include modification time
62
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
63
+ include_mtime: true
64
+ )
65
+ writer.add_file('document.txt')
66
+ writer.write
67
+
68
+ # Include CRC32 (STORE compression only)
69
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
70
+ compression: :store,
71
+ include_crc32: true
72
+ )
73
+ writer.add_file('data.bin')
74
+ writer.write
75
+ ----
76
+
77
+ IMPORTANT: RAR5 CRC32 checksums only work with STORE compression. When LZMA is used, CRC32 is automatically disabled. Use BLAKE2sp (always present) for compressed file integrity.
78
+
79
+ === RAR5 Multi-Volume Archives (v0.5.0)
80
+
81
+ Split large archives across multiple volumes:
82
+
83
+ [source,ruby]
84
+ ----
85
+ require 'omnizip/formats/rar/rar5/writer'
86
+
87
+ # Basic multi-volume with default naming (part1, part2, ...)
88
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
89
+ multi_volume: true,
90
+ volume_size: '100M' # Human-readable sizes supported
91
+ )
92
+ writer.add_directory('large_dataset/')
93
+ volumes = writer.write
94
+ # => ['backup.part1.rar', 'backup.part2.rar', ...]
95
+
96
+ # Custom volume naming patterns
97
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('data.rar',
98
+ multi_volume: true,
99
+ volume_size: '4.7GB', # CD/DVD sizes
100
+ volume_naming: 'numeric' # data.001.rar, data.002.rar, ...
101
+ )
102
+ writer.add_file('huge_database.sql')
103
+ volumes = writer.write
104
+
105
+ # Volume naming options:
106
+ # - 'part' (default): archive.part1.rar, archive.part2.rar
107
+ # - 'volume': archive.volume1.rar, archive.volume2.rar
108
+ # - 'numeric': archive.001.rar, archive.002.rar
109
+
110
+ # Minimum volume size: 64 KB
111
+ ----
112
+
113
+ === RAR5 Solid Compression (v0.5.0)
114
+
115
+ Achieve 10-30% better compression ratios for similar files:
116
+
117
+ [source,ruby]
118
+ ----
119
+ require 'omnizip/formats/rar/rar5/writer'
120
+
121
+ # Enable solid compression
122
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('project.rar',
123
+ compression: :lzma,
124
+ level: 5,
125
+ solid: true # Shared dictionary across files
126
+ )
127
+ writer.add_directory('source_code/')
128
+ writer.write
129
+
130
+ # Best for:
131
+ # - Source code repositories
132
+ # - Log files
133
+ # - Text documents
134
+ # - Similar structured data
135
+
136
+ # Trade-offs:
137
+ # - Cannot extract individual files without decompressing entire block
138
+ # - Corruption may affect multiple files
139
+ # - Slightly longer extraction time for single files
140
+ ----
141
+
142
+ === RAR5 AES-256 Encryption (v0.5.0)
143
+
144
+ Password-protect archives with industry-standard encryption:
145
+
146
+ [source,ruby]
147
+ ----
148
+ require 'omnizip/formats/rar/rar5/writer'
149
+
150
+ # Basic password protection
151
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('secure.rar',
152
+ compression: :lzma,
153
+ password: 'SecurePassword123!'
154
+ )
155
+ writer.add_file('confidential.pdf')
156
+ writer.write
157
+
158
+ # Custom key derivation iterations (higher = more secure, slower)
159
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('protected.rar',
160
+ compression: :lzma,
161
+ level: 5,
162
+ password: 'VerySecurePassword2025!',
163
+ kdf_iterations: 524_288 # 2^19, more secure than default
164
+ )
165
+ writer.add_directory('sensitive_data/')
166
+ writer.write
167
+
168
+ # KDF iteration options:
169
+ # - 65,536 (2^16): Minimum, fast but less secure
170
+ # - 262,144 (2^18): Default, balanced security/performance
171
+ # - 1,048,576 (2^20): Maximum, strongest security
172
+
173
+ # Security features:
174
+ # - AES-256-CBC encryption with PKCS#7 padding
175
+ # - PBKDF2-HMAC-SHA256 key derivation
176
+ # - Per-file IV generation
177
+ # - Password verification before decryption
178
+ ----
179
+
180
+ === RAR5 PAR2 Recovery Records (v0.5.0)
181
+
182
+ Add error correction for archive recovery:
183
+
184
+ [source,ruby]
185
+ ----
186
+ require 'omnizip/formats/rar/rar5/writer'
187
+
188
+ # Enable PAR2 recovery with default 5% redundancy
189
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
190
+ compression: :lzma,
191
+ recovery: true
192
+ )
193
+ writer.add_directory('important_data/')
194
+ files = writer.write
195
+ # => ['backup.rar', 'backup.par2', 'backup.vol00+01.par2', ...]
196
+
197
+ # Custom redundancy percentage
198
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('critical.rar',
199
+ compression: :lzma,
200
+ level: 5,
201
+ recovery: true,
202
+ recovery_percent: 15 # Can recover up to 15% data loss
203
+ )
204
+ writer.add_file('mission_critical.db')
205
+ files = writer.write
206
+
207
+ # Redundancy guidelines:
208
+ # - 5% (default): General backups
209
+ # - 10%: Important data
210
+ # - 20-30%: High-value data
211
+ # - 50-100%: Maximum protection
212
+
213
+ # Recovery capabilities:
214
+ # - Detect corruption at block level
215
+ # - Repair damaged archives automatically
216
+ # - Works with multi-volume, solid, and encrypted archives
217
+ ----
218
+
219
+ === RAR5 Combined Features (v0.5.0)
220
+
221
+ Use all features together for comprehensive protection:
222
+
223
+ [source,ruby]
224
+ ----
225
+ require 'omnizip/formats/rar/rar5/writer'
226
+
227
+ # Production-ready backup configuration
228
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('complete_backup.rar',
229
+ # Compression
230
+ compression: :lzma,
231
+ level: 5,
232
+ solid: true,
233
+
234
+ # Security
235
+ password: 'SecureBackup2025!',
236
+ kdf_iterations: 262_144,
237
+
238
+ # Multi-volume
239
+ multi_volume: true,
240
+ volume_size: '4G', # DVD-sized volumes
241
+ volume_naming: 'part',
242
+
243
+ # Recovery
244
+ recovery: true,
245
+ recovery_percent: 10,
246
+
247
+ # Optional fields
248
+ include_mtime: true
249
+ )
250
+
251
+ writer.add_directory('/critical/data')
252
+ writer.add_directory('/important/documents')
253
+ files = writer.write
254
+
255
+ puts "Backup created: #{files.size} files"
256
+ archive_files = files.select { |f| f.end_with?('.rar') }
257
+ par2_files = files.select { |f| f.include?('.par2') }
258
+ puts " Archive volumes: #{archive_files.size}"
259
+ puts " PAR2 files: #{par2_files.size}"
260
+ puts " Total size: #{files.sum { |f| File.size(f) } / 1024 / 1024}MB"
261
+ ----
262
+
263
+ === RAR5 Best Practices
264
+
265
+ **For Maximum Compression:**
266
+ [source,ruby]
267
+ ----
268
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
269
+ compression: :lzma,
270
+ level: 5, # Best compression
271
+ solid: true, # 10-30% better ratios
272
+ include_mtime: true
273
+ )
274
+ ----
275
+
276
+ **For Important Data:**
277
+ [source,ruby]
278
+ ----
279
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('backup.rar',
280
+ compression: :lzma,
281
+ level: 3, # Balanced performance
282
+ recovery: true,
283
+ recovery_percent: 15, # 15% redundancy
284
+ include_mtime: true
285
+ )
286
+ ----
287
+
288
+ **For Optical Media:**
289
+ [source,ruby]
290
+ ----
291
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('archive.rar',
292
+ compression: :lzma,
293
+ level: 5,
294
+ solid: true,
295
+ multi_volume: true,
296
+ volume_size: '4.7GB', # DVD size
297
+ recovery: true,
298
+ include_mtime: true
299
+ )
300
+ ----
301
+
302
+ **For Secure Archives:**
303
+ [source,ruby]
304
+ ----
305
+ writer = Omnizip::Formats::Rar::Rar5::Writer.new('secure.rar',
306
+ compression: :lzma,
307
+ level: 5,
308
+ password: ENV['BACKUP_PASSWORD'],
309
+ kdf_iterations: 524_288, # Enhanced security
310
+ recovery: true,
311
+ recovery_percent: 10,
312
+ include_mtime: true
313
+ )
314
+ ----
315
+
316
+ == Adding Files
317
+
318
+ === Individual Files
319
+
320
+ [source,ruby]
321
+ ----
322
+ archive.add_file('source.txt', 'dest.txt')
323
+ ----
324
+
325
+ === Directories
326
+
327
+ [source,ruby]
328
+ ----
329
+ archive.add_directory('folder/')
330
+ ----
331
+
332
+ === From Data
333
+
334
+ [source,ruby]
335
+ ----
336
+ archive.add_data('config.json', JSON.generate(config))
337
+ ----
338
+
339
+ == Compression Options
340
+
341
+ [source,ruby]
342
+ ----
343
+ Omnizip::Archive.create('archive.7z',
344
+ format: :seven_zip,
345
+ algorithm: :lzma2,
346
+ level: 9) do |archive|
347
+ # ...
348
+ end
349
+ ----
350
+
351
+ == See Also
352
+
353
+ * link:extracting-archives.html[Extracting Archives]
354
+ * link:../reference/api/overview.html[Ruby API]