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,137 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+
5
+ module Benchmark
6
+ # Generates test data files for benchmarking compression algorithms
7
+ class TestData
8
+ LOREM_IPSUM = <<~TEXT
9
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do
10
+ eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
11
+ enim ad minim veniam, quis nostrud exercitation ullamco laboris
12
+ nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
13
+ in reprehenderit in voluptate velit esse cillum dolore eu fugiat
14
+ nulla pariatur. Excepteur sint occaecat cupidatat non proident,
15
+ sunt in culpa qui officia deserunt mollit anim id est laborum.
16
+ TEXT
17
+
18
+ attr_reader :data_dir
19
+
20
+ def initialize(data_dir = "benchmark/data")
21
+ @data_dir = data_dir
22
+ FileUtils.mkdir_p(@data_dir)
23
+ end
24
+
25
+ def generate_text(size, filename: "text.txt")
26
+ path = File.join(data_dir, filename)
27
+ content = generate_lorem_text(size)
28
+ File.binwrite(path, content)
29
+ path
30
+ end
31
+
32
+ def generate_source_code(size, filename: "source.rb")
33
+ path = File.join(data_dir, filename)
34
+ content = generate_ruby_source(size)
35
+ File.binwrite(path, content)
36
+ path
37
+ end
38
+
39
+ def generate_repetitive(size, filename: "repetitive.bin")
40
+ path = File.join(data_dir, filename)
41
+ pattern = "ABCDEFGH" * 32
42
+ content = (pattern * ((size / pattern.bytesize) + 1))[0, size]
43
+ File.binwrite(path, content)
44
+ path
45
+ end
46
+
47
+ def generate_random(size, filename: "random.bin")
48
+ path = File.join(data_dir, filename)
49
+ content = Random.bytes(size)
50
+ File.binwrite(path, content)
51
+ path
52
+ end
53
+
54
+ def generate_multimedia(size, filename: "multimedia.bin")
55
+ path = File.join(data_dir, filename)
56
+ content = generate_gradient_data(size)
57
+ File.binwrite(path, content)
58
+ path
59
+ end
60
+
61
+ def cleanup
62
+ FileUtils.rm_rf(data_dir)
63
+ FileUtils.mkdir_p(data_dir)
64
+ end
65
+
66
+ private
67
+
68
+ def generate_lorem_text(size)
69
+ paragraphs = []
70
+ current_size = 0
71
+
72
+ while current_size < size
73
+ paragraphs << LOREM_IPSUM
74
+ current_size += LOREM_IPSUM.bytesize
75
+ end
76
+
77
+ paragraphs.join("\n\n")[0, size]
78
+ end
79
+
80
+ def generate_ruby_source(size)
81
+ code = <<~RUBY
82
+ # frozen_string_literal: true
83
+
84
+ module Example
85
+ class DataProcessor
86
+ attr_reader :data
87
+
88
+ def initialize(data)
89
+ @data = data
90
+ end
91
+
92
+ def process
93
+ data.map { |item| transform(item) }
94
+ end
95
+
96
+ def transform(item)
97
+ item.upcase.reverse
98
+ end
99
+
100
+ def filter(predicate)
101
+ data.select { |item| predicate.call(item) }
102
+ end
103
+
104
+ def aggregate
105
+ data.inject(0) { |sum, item| sum + item.length }
106
+ end
107
+ end
108
+ end
109
+ RUBY
110
+
111
+ lines = []
112
+ current_size = 0
113
+
114
+ counter = 0
115
+ while current_size < size
116
+ lines << code
117
+ counter += 1
118
+ lines << "\n# Generated code block #{counter}\n"
119
+ current_size = lines.join.bytesize
120
+ end
121
+
122
+ lines.join[0, size]
123
+ end
124
+
125
+ def generate_gradient_data(size)
126
+ data = []
127
+ step = 256.0 / [size, 256].min
128
+
129
+ size.times do |i|
130
+ value = ((i * step) % 256).to_i
131
+ data << value.chr
132
+ end
133
+
134
+ data.join
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,91 @@
1
+ # RAR v3 Format Specification
2
+ # Based on RAR 3.x archive format
3
+
4
+ format:
5
+ name: "RAR3"
6
+ version: "3.0"
7
+ extension: ".rar"
8
+
9
+ # RAR 3.x signature: "Rar!\x1A\x07\x00"
10
+ magic_bytes: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x00]
11
+
12
+ block_types:
13
+ marker: 0x72 # Archive marker block
14
+ archive: 0x73 # Archive header block
15
+ file: 0x74 # File header block
16
+ comment: 0x75 # Comment header block
17
+ old_auth: 0x76 # Old-style authentication block
18
+ old_subblock: 0x77 # Old-style subblock
19
+ recovery: 0x78 # Recovery record block
20
+ auth: 0x79 # Authentication block
21
+ subblock: 0x7A # Subblock
22
+ terminator: 0x7B # Archive end block
23
+
24
+ archive_flags:
25
+ volume: 0x0001 # Archive volume
26
+ comment: 0x0002 # Archive comment present
27
+ lock: 0x0004 # Archive locked
28
+ solid: 0x0008 # Solid archive
29
+ new_naming: 0x0010 # New volume naming scheme
30
+ auth_info: 0x0020 # Authenticity information present
31
+ recovery: 0x0040 # Recovery record present
32
+ encrypted: 0x0080 # Block headers encrypted
33
+ first_volume: 0x0100 # First volume
34
+
35
+ file_flags:
36
+ split_before: 0x0001 # File continued from previous volume
37
+ split_after: 0x0002 # File continued in next volume
38
+ encrypted: 0x0004 # File encrypted
39
+ comment: 0x0008 # File comment present
40
+ solid: 0x0010 # Information from previous files used
41
+ dictionary_mask: 0x00E0 # Dictionary size (bits 5-7)
42
+ large_file: 0x0100 # file64 operations
43
+ unicode: 0x0200 # Filename is Unicode
44
+ salt: 0x0400 # Salt present
45
+ version: 0x0800 # Version flag
46
+ ext_time: 0x1000 # Extended time field present
47
+ ext_flags: 0x2000 # Extended flags field
48
+
49
+ compression_methods:
50
+ store: 0x30 # No compression
51
+ fastest: 0x31 # Fastest compression
52
+ fast: 0x32 # Fast compression
53
+ normal: 0x33 # Normal compression
54
+ good: 0x34 # Good compression
55
+ best: 0x35 # Best compression
56
+
57
+ host_os:
58
+ msdos: 0 # MS DOS
59
+ os2: 1 # OS/2
60
+ win32: 2 # Windows
61
+ unix: 3 # Unix
62
+ macos: 4 # Mac OS
63
+ beos: 5 # BeOS
64
+
65
+ dictionary_sizes:
66
+ 64k: 0 # 64 KB
67
+ 128k: 1 # 128 KB
68
+ 256k: 2 # 256 KB
69
+ 512k: 3 # 512 KB
70
+ 1024k: 4 # 1024 KB (1 MB)
71
+ 2048k: 5 # 2048 KB (2 MB)
72
+ 4096k: 6 # 4096 KB (4 MB)
73
+ auto: 7 # Auto-detect
74
+
75
+ encryption:
76
+ supported: true
77
+ algorithms:
78
+ - aes128
79
+ - aes256
80
+ key_derivation: pbkdf2
81
+ salt_size: 8
82
+
83
+ features:
84
+ recovery_records: true
85
+ solid_archives: true
86
+ multivolume: true
87
+ file_comments: true
88
+ archive_comments: true
89
+ unicode_filenames: true
90
+ large_files: true # > 4 GB
91
+ extended_timestamps: true
@@ -0,0 +1,102 @@
1
+ # RAR v5 Format Specification
2
+ # Based on RAR 5.x archive format
3
+
4
+ format:
5
+ name: "RAR5"
6
+ version: "5.0"
7
+ extension: ".rar"
8
+
9
+ # RAR 5.x signature: "Rar!\x1A\x07\x01\x00"
10
+ magic_bytes: [0x52, 0x61, 0x72, 0x21, 0x1A, 0x07, 0x01, 0x00]
11
+
12
+ block_types:
13
+ main_header: 0x01 # Main archive header
14
+ file_header: 0x02 # File header
15
+ service_header: 0x03 # Service header
16
+ encryption_header: 0x04 # Archive encryption header
17
+ end_marker: 0x05 # End of archive marker
18
+
19
+ main_header_flags:
20
+ volume: 0x0001 # Archive is volume
21
+ volume_number: 0x0002 # Volume number field present
22
+ solid: 0x0004 # Solid archive
23
+ recovery: 0x0008 # Recovery record present
24
+ locked: 0x0010 # Archive locked
25
+
26
+ file_header_flags:
27
+ directory: 0x0001 # Entry is a directory
28
+ time_present: 0x0002 # Time field present
29
+ crc32_present: 0x0004 # CRC32 field present
30
+ unpacked_size_unknown: 0x0008 # Unpacked size is unknown
31
+
32
+ encryption_flags:
33
+ password_check: 0x0001 # Check password present
34
+ use_mac: 0x0002 # Use MAC
35
+
36
+ compression_methods:
37
+ store: 0 # No compression
38
+ fastest: 1 # Fastest compression
39
+ fast: 2 # Fast compression
40
+ normal: 3 # Normal compression
41
+ good: 4 # Good compression
42
+ best: 5 # Best compression (maximum)
43
+
44
+ # RAR 5 uses BLAKE2sp for checksums
45
+ checksum:
46
+ algorithm: blake2sp
47
+ size: 32 # bytes
48
+
49
+ host_os:
50
+ windows: 0 # Windows
51
+ unix: 1 # Unix/Linux
52
+
53
+ dictionary_sizes:
54
+ 128k: 0 # 128 KB
55
+ 256k: 1 # 256 KB
56
+ 512k: 2 # 512 KB
57
+ 1024k: 3 # 1024 KB (1 MB)
58
+ 2048k: 4 # 2048 KB (2 MB)
59
+ 4096k: 5 # 4096 KB (4 MB)
60
+ 8192k: 6 # 8192 KB (8 MB)
61
+ 16384k: 7 # 16384 KB (16 MB)
62
+ 32768k: 8 # 32768 KB (32 MB)
63
+ 65536k: 9 # 65536 KB (64 MB)
64
+ 131072k: 10 # 131072 KB (128 MB)
65
+ 262144k: 11 # 262144 KB (256 MB)
66
+ 524288k: 12 # 524288 KB (512 MB)
67
+ 1048576k: 13 # 1048576 KB (1024 MB / 1 GB)
68
+
69
+ encryption:
70
+ supported: true
71
+ algorithms:
72
+ - aes256
73
+ key_derivation: pbkdf2
74
+ kdf_iterations: 262144 # PBKDF2 iterations
75
+ salt_size: 16 # bytes
76
+
77
+ compression_features:
78
+ solid_archives: true
79
+ multivolume: true
80
+ recovery_records: true
81
+ unicode_filenames: true # UTF-8 encoding
82
+ large_files: true # No size limitations
83
+ extended_timestamps: true
84
+ 64bit_sizes: true
85
+
86
+ # RAR 5 specific features
87
+ advanced_features:
88
+ blake2_checksums: true
89
+ improved_compression: true
90
+ better_unicode: true
91
+ optional_crc32: true
92
+ extended_time_format: true
93
+
94
+ # Extra record types
95
+ extra_records:
96
+ encryption: 0x01
97
+ hash: 0x02
98
+ time: 0x03
99
+ version: 0x04
100
+ redirection: 0x05
101
+ owner: 0x06
102
+ service: 0x07
@@ -0,0 +1,142 @@
1
+ name: Documentation
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ - master
8
+ paths:
9
+ - 'docs/**'
10
+ - '.github/workflows/docs.yml'
11
+ pull_request:
12
+ paths:
13
+ - 'docs/**'
14
+ - '.github/workflows/docs.yml'
15
+
16
+ jobs:
17
+ build:
18
+ name: Build Jekyll Site
19
+ runs-on: ubuntu-latest
20
+
21
+ steps:
22
+ - name: Checkout repository
23
+ uses: actions/checkout@v4
24
+
25
+ - name: Setup Ruby
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: '3.2'
29
+ bundler-cache: false
30
+
31
+ - name: Cache dependencies
32
+ uses: actions/cache@v4
33
+ with:
34
+ path: docs/vendor/bundle
35
+ key: ${{ runner.os }}-gems-${{ hashFiles('docs/Gemfile.lock') }}
36
+ restore-keys: |
37
+ ${{ runner.os }}-gems-
38
+
39
+ - name: Install dependencies
40
+ run: |
41
+ cd docs
42
+ bundle config path vendor/bundle
43
+ bundle install --jobs 4 --retry 3
44
+
45
+ - name: Build Jekyll site
46
+ run: |
47
+ cd docs
48
+ bundle exec jekyll build --trace
49
+ env:
50
+ JEKYLL_ENV: production
51
+
52
+ - name: Upload build artifact
53
+ uses: actions/upload-artifact@v4
54
+ with:
55
+ name: site
56
+ path: docs/_site
57
+ retention-days: 7
58
+
59
+ link-check:
60
+ name: Check Links
61
+ runs-on: ubuntu-latest
62
+ needs: build
63
+ continue-on-error: true
64
+
65
+ steps:
66
+ - name: Checkout repository
67
+ uses: actions/checkout@v4
68
+
69
+ - name: Download build artifact
70
+ uses: actions/download-artifact@v4
71
+ with:
72
+ name: site
73
+ path: docs/_site
74
+
75
+ - name: Install lychee
76
+ run: |
77
+ curl -sSL https://github.com/lycheeverse/lychee/releases/download/lychee-v0.22.0/lychee-x86_64-unknown-linux-gnu.tar.gz | tar -xz
78
+ sudo mv lychee /usr/local/bin/
79
+
80
+ - name: Run link checker
81
+ run: |
82
+ cd docs
83
+ lychee --config .lychee.toml _site --format markdown --output lychee-report.md
84
+ continue-on-error: true
85
+
86
+ - name: Display link check summary
87
+ if: always()
88
+ run: |
89
+ cd docs
90
+ if [ -f lychee-report.md ]; then
91
+ echo "## Link Check Results" >> $GITHUB_STEP_SUMMARY
92
+ cat lychee-report.md >> $GITHUB_STEP_SUMMARY
93
+ fi
94
+
95
+ - name: Check for broken links
96
+ run: |
97
+ cd docs
98
+ lychee --config .lychee.toml _site
99
+
100
+ validate-structure:
101
+ name: Validate Documentation Structure
102
+ runs-on: ubuntu-latest
103
+
104
+ steps:
105
+ - name: Checkout repository
106
+ uses: actions/checkout@v4
107
+
108
+ - name: Check for required files
109
+ run: |
110
+ cd docs
111
+ required_files=(
112
+ "index.adoc"
113
+ "README.md"
114
+ "_config.yml"
115
+ "Gemfile"
116
+ ".lychee.toml"
117
+ )
118
+ missing_files=()
119
+ for file in "${required_files[@]}"; do
120
+ if [ ! -f "$file" ]; then
121
+ missing_files+=("$file")
122
+ fi
123
+ done
124
+ if [ ${#missing_files[@]} -gt 0 ]; then
125
+ echo "Missing required files:"
126
+ printf '%s\n' "${missing_files[@]}"
127
+ exit 1
128
+ fi
129
+
130
+ summary:
131
+ name: Build Summary
132
+ runs-on: ubuntu-latest
133
+ needs: [build, link-check, validate-structure]
134
+ if: always()
135
+
136
+ steps:
137
+ - name: Generate summary
138
+ run: |
139
+ echo "## Documentation Build Summary" >> $GITHUB_STEP_SUMMARY
140
+ echo "Jekyll build completed" >> $GITHUB_STEP_SUMMARY
141
+ echo "Link validation completed" >> $GITHUB_STEP_SUMMARY
142
+ echo "Structure validation completed" >> $GITHUB_STEP_SUMMARY
data/docs/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ # Jekyll build files
2
+ _site/
3
+ .sass-cache/
4
+ .jekyll-cache/
5
+ .jekyll-metadata
6
+
7
+ # Lychee cache
8
+ .lycheecache
9
+
10
+ # OS files
11
+ .DS_Store
12
+ Thumbs.db
13
+
14
+ # Editor files
15
+ *.swp
16
+ *.swo
17
+ *~
18
+
19
+ # Ruby
20
+ *.gem
21
+ *.rbc
data/docs/.lychee.toml ADDED
@@ -0,0 +1,67 @@
1
+ # Lychee link checker configuration for Omnizip documentation
2
+
3
+ # Check all links recursively
4
+ include_verbatim = false
5
+
6
+ # Follow redirects
7
+ max_redirects = 5
8
+
9
+ # Timeout for requests (seconds)
10
+ timeout = 30
11
+
12
+ # Number of concurrent requests
13
+ max_concurrency = 10
14
+
15
+ # Accept HTTP status codes
16
+ accept = [200, 201, 204, 206, 301, 302, 303, 304, 307, 308]
17
+
18
+ # Retry failed requests
19
+ max_retries = 3
20
+
21
+ # User agent string
22
+ user_agent = "lychee/omnizip-docs"
23
+
24
+ # Exclude patterns (use regex syntax)
25
+ exclude = [
26
+ # Exclude localhost and example URLs
27
+ "http://localhost.*",
28
+ "http://127\\.0\\.0\\.1.*",
29
+ "http://example\\.com.*",
30
+ "https://example\\.com.*",
31
+
32
+ # Exclude email addresses
33
+ "mailto:.*",
34
+
35
+ # Exclude same-page anchors (handled by Jekyll/AsciiDoc)
36
+ "^#.*",
37
+
38
+ # Exclude common placeholder URLs
39
+ "http://www\\.example\\.com.*",
40
+ "https://www\\.example\\.com.*",
41
+
42
+ # Exclude GitHub edit links (these are templates)
43
+ ".*/edit/.*",
44
+
45
+ # Exclude all internal site links - they work on deployed site
46
+ # but fail when checking local files due to baseurl path issues
47
+ "https?://metanorma\\.github\\.io/omnizip/.*",
48
+
49
+ # Exclude root-relative links with baseurl (local checking issue)
50
+ # These work when deployed but fail on local file system checks
51
+ "^/omnizip/.*"
52
+ ]
53
+
54
+ # Cache responses to avoid repeated checks
55
+ cache = true
56
+
57
+ # Only check unique links
58
+ no_progress = true
59
+
60
+ # Check HTTPS certificates
61
+ insecure = false
62
+
63
+ # Scheme (http, https, file)
64
+ scheme = ["https", "http"]
65
+
66
+ # Don't fail on missing local files
67
+ skip_missing = true
data/docs/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "jekyll", "~> 4.4"
6
+ gem "jekyll-asciidoc"
7
+ gem "jekyll-seo-tag"
8
+ gem "just-the-docs"
9
+
10
+ group :jekyll_plugins do
11
+ gem "jekyll-feed"
12
+ gem "jekyll-sitemap"
13
+ end
@@ -0,0 +1,26 @@
1
+ # RAR Write Support Documentation
2
+
3
+ ## Overview
4
+
5
+ The key distinction:
6
+
7
+ RAR format structure = Publicly documented, implementable ✅
8
+ WinRAR's specific compression = Proprietary ❌
9
+
10
+ ## Important Licensing Information
11
+
12
+ WinRAR is owned by Alexander Roshal and RARLAB. Creating RAR archives using WinRAR requires:
13
+
14
+ 1. **A valid WinRAR license** - Purchase from https://www.rarlab.com/
15
+ 2. **WinRAR installation** - The command-line tool must be installed
16
+
17
+ RAR format structure = Publicly documented, implementable ✅
18
+ WinRAR's specific compression = Proprietary ❌
19
+
20
+ ### Why Not Built-In?
21
+
22
+ Unlike formats such as ZIP, 7z, TAR, etc., there is a confusion that RAR compression cannot be implemented freely due to:
23
+
24
+ - Proprietary algorithm patents: but there are NO patents on RAR compression algorithms
25
+ - Licensing restrictions from RARLAB: the RAR format structure is publicly documented, implementable, and already implemented independently in libarchive which is fully open source.
26
+ - Legal risks of reverse engineering: the RAR format structure is documented and does not require reverse engineering.
data/docs/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Omnizip Documentation
2
+
3
+ This directory contains the documentation site for Omnizip, built with [Jekyll](https://jekyllrb.com/) and the [Just the Docs](https://just-the-docs.github.io/just-the-docs/) theme.
4
+
5
+ ## Building the Documentation Site
6
+
7
+ ### Prerequisites
8
+
9
+ - Ruby 3.0 or higher
10
+ - Bundler
11
+
12
+ ### Installation
13
+
14
+ ```bash
15
+ cd docs
16
+ bundle install
17
+ ```
18
+
19
+ ### Building
20
+
21
+ ```bash
22
+ bundle exec jekyll build
23
+ ```
24
+
25
+ The built site will be in the `_site` directory.
26
+
27
+ ### Serving Locally
28
+
29
+ ```bash
30
+ bundle exec jekyll serve
31
+ ```
32
+
33
+ Then open http://localhost:4000/omnizip/ in your browser.
34
+
35
+ ## Documentation Structure
36
+
37
+ ```
38
+ docs/
39
+ ├── index.adoc # Home page
40
+ ├── getting-started/ # Installation and quick start guides
41
+ ├── guides/ # Comprehensive usage guides
42
+ │ ├── basic-usage/ # Basic operations
43
+ │ ├── advanced-usage/ # Advanced features
44
+ │ ├── compression-algorithms/ # Algorithm documentation
45
+ │ ├── archive-formats/ # Format documentation
46
+ │ └── filters/ # Filter documentation
47
+ ├── reference/ # Technical reference
48
+ │ ├── cli/ # CLI documentation
49
+ │ └── api/ # Ruby API documentation
50
+ ├── resources/ # Additional resources
51
+ ├── concepts/ # Core concepts
52
+ ├── developer/ # Development documentation
53
+ ├── examples/ # Usage examples
54
+ └── troubleshooting/ # Troubleshooting guides
55
+ ```
56
+
57
+ ## Writing Documentation
58
+
59
+ Documentation is written in [AsciiDoc](https://asciidoctor.org/) format. Each page should start with YAML front matter:
60
+
61
+ ```yaml
62
+ ---
63
+ title: Page Title
64
+ nav_order: 1
65
+ ---
66
+ ```
67
+
68
+ ### Linking
69
+
70
+ Use AsciiDoc link syntax:
71
+
72
+ - Internal link: `link:path/to/page.adoc[Link text]`
73
+ - External link: `https://example.com[Link text]`
74
+
75
+ ### Code Blocks
76
+
77
+ Use source code blocks with syntax highlighting:
78
+
79
+ ```asciidoc
80
+ [source,ruby]
81
+ ----
82
+ require 'omnizip'
83
+ ----
84
+ ```
85
+
86
+ ## Checking Links
87
+
88
+ The documentation site includes a link checker using [lychee](https://github.com/lycheeverse/lychee). To check links:
89
+
90
+ ```bash
91
+ # Install lychee
92
+ cargo install lychee
93
+
94
+ # Run link checker
95
+ cd docs
96
+ lychee --config .lychee.toml _site
97
+ ```
98
+
99
+ ## License
100
+
101
+ Copyright 2025 Ribose Inc.