omnizip 0.3.9 → 0.3.11

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 (182) hide show
  1. checksums.yaml +4 -4
  2. data/TODO.refactor/00-overview.md +67 -0
  3. data/TODO.refactor/01-registry-base-class.md +81 -0
  4. data/TODO.refactor/02-error-hierarchy.md +57 -0
  5. data/TODO.refactor/03-autoload-entry-point.md +69 -0
  6. data/TODO.refactor/04-filter-base-consolidation.md +49 -0
  7. data/TODO.refactor/05-send-private-methods.md +64 -0
  8. data/TODO.refactor/06-instance-variable-access.md +69 -0
  9. data/TODO.refactor/07-respond-to-replacement.md +91 -0
  10. data/TODO.refactor/08-spec-doubles.md +27 -0
  11. data/TODO.refactor/09-cli-shared-module.md +35 -0
  12. data/TODO.refactor/10-format-detector-ocp.md +34 -0
  13. data/TODO.refactor/11-convenience-decoupling.md +38 -0
  14. data/TODO.refactor/12-thread-safety.md +8 -0
  15. data/TODO.refactor/13-lutaml-model-migration.md +82 -0
  16. data/TODO.refactor/14-add-missing-specs.md +25 -0
  17. data/lib/omnizip/algorithm.rb +0 -2
  18. data/lib/omnizip/algorithm_registry.rb +29 -57
  19. data/lib/omnizip/algorithms/lzma/dictionary.rb +4 -3
  20. data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +2 -0
  21. data/lib/omnizip/algorithms/lzma/range_decoder.rb +1 -1
  22. data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +6 -5
  23. data/lib/omnizip/algorithms/lzma2/encoder.rb +0 -2
  24. data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +0 -2
  25. data/lib/omnizip/algorithms/lzma2/properties.rb +0 -2
  26. data/lib/omnizip/algorithms/ppmd7/model.rb +1 -1
  27. data/lib/omnizip/algorithms/ppmd8/context.rb +0 -2
  28. data/lib/omnizip/algorithms/ppmd8/model.rb +1 -1
  29. data/lib/omnizip/algorithms/ppmd8.rb +0 -2
  30. data/lib/omnizip/algorithms/ppmd_base.rb +0 -2
  31. data/lib/omnizip/algorithms/sevenzip_lzma2.rb +0 -5
  32. data/lib/omnizip/algorithms/xz_lzma2.rb +0 -5
  33. data/lib/omnizip/algorithms/zstandard/frame/header.rb +3 -5
  34. data/lib/omnizip/algorithms.rb +1 -0
  35. data/lib/omnizip/archive_handler.rb +75 -0
  36. data/lib/omnizip/archive_handlers/tar_handler.rb +51 -0
  37. data/lib/omnizip/archive_handlers/zip_handler.rb +73 -0
  38. data/lib/omnizip/archive_handlers.rb +11 -0
  39. data/lib/omnizip/checksum_registry.rb +23 -96
  40. data/lib/omnizip/cli/shared.rb +31 -0
  41. data/lib/omnizip/cli.rb +6 -43
  42. data/lib/omnizip/commands/archive_create_command.rb +0 -6
  43. data/lib/omnizip/commands/archive_extract_command.rb +0 -4
  44. data/lib/omnizip/commands/archive_list_command.rb +0 -4
  45. data/lib/omnizip/commands/archive_repair_command.rb +0 -2
  46. data/lib/omnizip/commands/archive_verify_command.rb +0 -2
  47. data/lib/omnizip/commands/compress_command.rb +0 -2
  48. data/lib/omnizip/commands/decompress_command.rb +0 -2
  49. data/lib/omnizip/commands/list_command.rb +0 -2
  50. data/lib/omnizip/commands/metadata_command.rb +0 -5
  51. data/lib/omnizip/commands/parity_create_command.rb +0 -2
  52. data/lib/omnizip/commands/parity_repair_command.rb +0 -2
  53. data/lib/omnizip/commands/parity_verify_command.rb +0 -2
  54. data/lib/omnizip/commands/profile_list_command.rb +0 -2
  55. data/lib/omnizip/commands/profile_show_command.rb +0 -2
  56. data/lib/omnizip/convenience.rb +111 -234
  57. data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +1 -1
  58. data/lib/omnizip/crypto/aes256/cipher.rb +6 -1
  59. data/lib/omnizip/error.rb +22 -18
  60. data/lib/omnizip/filter.rb +5 -3
  61. data/lib/omnizip/filter_registry.rb +74 -98
  62. data/lib/omnizip/filters/bcj2.rb +0 -2
  63. data/lib/omnizip/filters/bcj_x86.rb +0 -2
  64. data/lib/omnizip/filters/filter_base.rb +4 -70
  65. data/lib/omnizip/filters/registry.rb +0 -2
  66. data/lib/omnizip/format_detector.rb +21 -12
  67. data/lib/omnizip/format_registry.rb +69 -53
  68. data/lib/omnizip/formats/bzip2_file.rb +0 -4
  69. data/lib/omnizip/formats/cpio/entry.rb +0 -2
  70. data/lib/omnizip/formats/cpio/reader.rb +0 -1
  71. data/lib/omnizip/formats/cpio/writer.rb +0 -1
  72. data/lib/omnizip/formats/cpio.rb +0 -3
  73. data/lib/omnizip/formats/format_spec_loader.rb +1 -1
  74. data/lib/omnizip/formats/gzip.rb +0 -4
  75. data/lib/omnizip/formats/iso/directory_record.rb +6 -3
  76. data/lib/omnizip/formats/iso/reader.rb +2 -2
  77. data/lib/omnizip/formats/iso.rb +0 -1
  78. data/lib/omnizip/formats/lzip.rb +5 -27
  79. data/lib/omnizip/formats/lzma_alone.rb +7 -27
  80. data/lib/omnizip/formats/msi/reader.rb +1 -0
  81. data/lib/omnizip/formats/msi/string_pool.rb +2 -3
  82. data/lib/omnizip/formats/msi.rb +1 -6
  83. data/lib/omnizip/formats/ole/allocation_table.rb +0 -1
  84. data/lib/omnizip/formats/ole/dirent.rb +9 -4
  85. data/lib/omnizip/formats/ole/header.rb +0 -1
  86. data/lib/omnizip/formats/ole/ranges_io.rb +1 -1
  87. data/lib/omnizip/formats/ole/storage.rb +5 -6
  88. data/lib/omnizip/formats/ole.rb +0 -3
  89. data/lib/omnizip/formats/rar/block_parser.rb +0 -1
  90. data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +1 -1
  91. data/lib/omnizip/formats/rar/decompressor.rb +1 -0
  92. data/lib/omnizip/formats/rar/header.rb +0 -1
  93. data/lib/omnizip/formats/rar/rar5/writer.rb +0 -3
  94. data/lib/omnizip/formats/rar/reader.rb +2 -3
  95. data/lib/omnizip/formats/rar/writer.rb +0 -1
  96. data/lib/omnizip/formats/rar.rb +0 -4
  97. data/lib/omnizip/formats/rpm/entry.rb +0 -1
  98. data/lib/omnizip/formats/rpm/header.rb +1 -6
  99. data/lib/omnizip/formats/rpm/lead.rb +37 -26
  100. data/lib/omnizip/formats/rpm/tag.rb +0 -1
  101. data/lib/omnizip/formats/rpm/writer.rb +0 -1
  102. data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +0 -1
  103. data/lib/omnizip/formats/seven_zip/coder_chain.rb +1 -2
  104. data/lib/omnizip/formats/seven_zip/encoded_header.rb +0 -1
  105. data/lib/omnizip/formats/seven_zip/encrypted_header.rb +0 -1
  106. data/lib/omnizip/formats/seven_zip/header.rb +0 -1
  107. data/lib/omnizip/formats/seven_zip/header_encryptor.rb +0 -1
  108. data/lib/omnizip/formats/seven_zip/header_writer.rb +0 -1
  109. data/lib/omnizip/formats/seven_zip/models/file_entry.rb +1 -1
  110. data/lib/omnizip/formats/seven_zip/parser.rb +1 -2
  111. data/lib/omnizip/formats/seven_zip/reader.rb +13 -2
  112. data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +0 -1
  113. data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +0 -1
  114. data/lib/omnizip/formats/seven_zip/writer.rb +4 -6
  115. data/lib/omnizip/formats/seven_zip.rb +2 -5
  116. data/lib/omnizip/formats/tar/entry.rb +0 -2
  117. data/lib/omnizip/formats/tar/header.rb +0 -2
  118. data/lib/omnizip/formats/tar/reader.rb +0 -2
  119. data/lib/omnizip/formats/tar/writer.rb +0 -2
  120. data/lib/omnizip/formats/tar.rb +0 -3
  121. data/lib/omnizip/formats/xar/entry.rb +0 -1
  122. data/lib/omnizip/formats/xar/header.rb +0 -1
  123. data/lib/omnizip/formats/xar/reader.rb +0 -1
  124. data/lib/omnizip/formats/xar/toc.rb +1 -2
  125. data/lib/omnizip/formats/xar/writer.rb +11 -3
  126. data/lib/omnizip/formats/xar.rb +0 -3
  127. data/lib/omnizip/formats/xz/reader.rb +7 -3
  128. data/lib/omnizip/formats/xz.rb +3 -40
  129. data/lib/omnizip/formats/xz_impl/block_decoder.rb +4 -10
  130. data/lib/omnizip/formats/xz_impl/block_encoder.rb +0 -2
  131. data/lib/omnizip/formats/xz_impl/block_header_parser.rb +0 -2
  132. data/lib/omnizip/formats/xz_impl/index_decoder.rb +0 -1
  133. data/lib/omnizip/formats/xz_impl/index_encoder.rb +0 -1
  134. data/lib/omnizip/formats/xz_impl/stream_encoder.rb +1 -1
  135. data/lib/omnizip/formats/xz_impl/stream_footer.rb +0 -1
  136. data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +0 -1
  137. data/lib/omnizip/formats/xz_impl/stream_header.rb +0 -1
  138. data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +0 -2
  139. data/lib/omnizip/formats/zip/central_directory_header.rb +2 -3
  140. data/lib/omnizip/formats/zip/end_of_central_directory.rb +0 -2
  141. data/lib/omnizip/formats/zip/local_file_header.rb +0 -2
  142. data/lib/omnizip/formats/zip/reader.rb +12 -2
  143. data/lib/omnizip/formats/zip/writer.rb +73 -1
  144. data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +0 -2
  145. data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +0 -2
  146. data/lib/omnizip/formats/zip/zip64_extra_field.rb +0 -2
  147. data/lib/omnizip/formats/zip.rb +0 -3
  148. data/lib/omnizip/formats.rb +8 -24
  149. data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +2 -2
  150. data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +1 -1
  151. data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +0 -6
  152. data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +3 -4
  153. data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +0 -1
  154. data/lib/omnizip/io/source.rb +136 -0
  155. data/lib/omnizip/io.rb +2 -0
  156. data/lib/omnizip/link_handler.rb +7 -3
  157. data/lib/omnizip/metadata/metadata_editor.rb +1 -1
  158. data/lib/omnizip/models/algorithm_metadata.rb +33 -60
  159. data/lib/omnizip/models/compression_options.rb +40 -53
  160. data/lib/omnizip/models/conversion_options.rb +9 -18
  161. data/lib/omnizip/models/parallel_options.rb +25 -0
  162. data/lib/omnizip/optimization_registry.rb +8 -44
  163. data/lib/omnizip/parallel/job_scheduler.rb +26 -8
  164. data/lib/omnizip/parallel/parallel_compressor.rb +10 -20
  165. data/lib/omnizip/parallel/parallel_extractor.rb +20 -11
  166. data/lib/omnizip/parity/par2_repairer.rb +5 -5
  167. data/lib/omnizip/parity/par2_verifier.rb +27 -22
  168. data/lib/omnizip/parity.rb +4 -4
  169. data/lib/omnizip/password/encryption_registry.rb +11 -50
  170. data/lib/omnizip/password/zip_crypto_strategy.rb +1 -4
  171. data/lib/omnizip/pipe/stream_decompressor.rb +2 -3
  172. data/lib/omnizip/profile/archive_profile.rb +0 -2
  173. data/lib/omnizip/profile/binary_profile.rb +0 -2
  174. data/lib/omnizip/profile/compression_profile.rb +0 -1
  175. data/lib/omnizip/profile/profile_detector.rb +0 -2
  176. data/lib/omnizip/profile/text_profile.rb +0 -2
  177. data/lib/omnizip/profile.rb +0 -2
  178. data/lib/omnizip/registry.rb +112 -0
  179. data/lib/omnizip/version.rb +1 -1
  180. data/lib/omnizip/zip/file.rb +20 -9
  181. data/lib/omnizip.rb +26 -58
  182. metadata +24 -2
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Omnizip
4
+ # Generic, thread-safe registry base class.
5
+ #
6
+ # Subclasses override the hooks +#not_found_error_class+,
7
+ # +#normalize_key+, and +#label+ to specialize behavior. They may also
8
+ # override +#register+ / +#get+ to add domain-specific arguments
9
+ # (e.g., +#register_with_formats+ on FilterRegistry).
10
+ #
11
+ # The base class is intentionally minimal: it owns a Hash store and a
12
+ # Mutex, and exposes the canonical CRUD quintet (+register+, +get+,
13
+ # +registered?+, +available+, +reset!+). Backward-compat aliases are
14
+ # provided so existing call sites keep working.
15
+ class Registry
16
+ class << self
17
+ def not_found_error_class
18
+ Omnizip::Error
19
+ end
20
+
21
+ def normalize_key(key)
22
+ key.to_sym
23
+ end
24
+
25
+ def label
26
+ return "Item" unless name
27
+
28
+ name.gsub(/^Omnizip::/, "")
29
+ end
30
+
31
+ def register(key, value)
32
+ synchronize { storage[normalize_key(key)] = value }
33
+ value
34
+ end
35
+
36
+ # Register a lazy trigger for +key+. When +get(key)+ is called and
37
+ # the key isn't yet in storage, the block is invoked. The block is
38
+ # expected to trigger autoload of the implementation file (e.g., by
39
+ # referencing a constant), which then self-registers.
40
+ def register_lazy(key, &trigger)
41
+ lazy_triggers[normalize_key(key)] = trigger
42
+ end
43
+
44
+ def get(key)
45
+ normalized = normalize_key(key)
46
+ value = storage[normalized]
47
+ return value if value
48
+
49
+ trigger = lazy_triggers[normalized]
50
+ if trigger
51
+ synchronize { lazy_triggers.delete(normalized) }
52
+ trigger.call
53
+ value = storage[normalized]
54
+ return value if value
55
+ end
56
+
57
+ raise not_found_error_class,
58
+ "#{label} not registered: #{key.inspect}. " \
59
+ "Available: #{available.join(', ')}"
60
+ end
61
+
62
+ def registered?(key)
63
+ normalized = normalize_key(key)
64
+ storage.key?(normalized) || lazy_triggers.key?(normalized)
65
+ end
66
+
67
+ def available
68
+ storage.keys
69
+ end
70
+ alias all available
71
+ alias strategies available
72
+
73
+ def reset!
74
+ # Clear stored entries but keep lazy triggers — the builtin
75
+ # autoload list should survive a reset so subsequent +get+ calls
76
+ # for builtins still trigger the autoload (which re-registers).
77
+ synchronize { storage.clear }
78
+ end
79
+ alias clear reset!
80
+ alias clear! reset!
81
+ alias reset reset!
82
+
83
+ def entries
84
+ synchronize { storage.dup }
85
+ end
86
+
87
+ def each(&block)
88
+ return to_enum(:each) unless block
89
+
90
+ entries.each(&block)
91
+ end
92
+
93
+ private
94
+
95
+ def storage
96
+ @storage ||= {}
97
+ end
98
+
99
+ def lazy_triggers
100
+ @lazy_triggers ||= {}
101
+ end
102
+
103
+ def synchronize(&block)
104
+ mutex.synchronize(&block)
105
+ end
106
+
107
+ def mutex
108
+ @mutex ||= Mutex.new
109
+ end
110
+ end
111
+ end
112
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Omnizip
4
- VERSION = "0.3.9"
4
+ VERSION = "0.3.11"
5
5
  end
@@ -50,7 +50,6 @@ module Omnizip
50
50
  @modified = false
51
51
  @reader = nil
52
52
  @writer = nil
53
-
54
53
  # Load existing archive if it exists
55
54
  if ::File.exist?(file_path) && !create
56
55
  load_archive
@@ -189,6 +188,18 @@ module Omnizip
189
188
  end
190
189
  alias_method :length, :size
191
190
 
191
+ # Mark this archive as having unsaved changes. The next +#commit+
192
+ # or +#close+ will write the archive to disk.
193
+ def modified!
194
+ @modified = true
195
+ self
196
+ end
197
+
198
+ # True if there are unsaved changes.
199
+ def modified?
200
+ @modified
201
+ end
202
+
192
203
  # Check if archive contains an entry
193
204
  # @param entry_name [String] Entry name to check
194
205
  # @return [Boolean] True if entry exists
@@ -374,8 +385,7 @@ module Omnizip
374
385
  extra_field: "",
375
386
  comment: "",
376
387
  ).tap do |header|
377
- # Store original data in header for writing
378
- header.instance_variable_set(:@_original_data, data)
388
+ header.cached_original_data = data
379
389
  end
380
390
  end
381
391
 
@@ -384,7 +394,7 @@ module Omnizip
384
394
  return "" if entry.directory?
385
395
 
386
396
  # Check if we have cached data (for new entries not yet written)
387
- cached_data = entry.header.instance_variable_get(:@_original_data)
397
+ cached_data = entry.header.cached_original_data
388
398
  return cached_data if cached_data
389
399
 
390
400
  # Otherwise read from file
@@ -416,10 +426,11 @@ module Omnizip
416
426
  return "" unless compressed_data
417
427
 
418
428
  # Decompress
419
- @reader.send(:decompress_data,
420
- compressed_data,
421
- reader_entry.compression_method,
422
- reader_entry.uncompressed_size)
429
+ @reader.decompress(
430
+ compressed_data,
431
+ reader_entry.compression_method,
432
+ reader_entry.uncompressed_size,
433
+ )
423
434
  end
424
435
  end
425
436
 
@@ -447,7 +458,7 @@ module Omnizip
447
458
  next if entry.directory?
448
459
 
449
460
  header = entry.header
450
- cached = header.instance_variable_get(:@_original_data)
461
+ cached = header.cached_original_data
451
462
  entry_data[entry.name] = cached || read_entry_data(entry)
452
463
  end
453
464
 
data/lib/omnizip.rb CHANGED
@@ -17,27 +17,30 @@
17
17
  #
18
18
 
19
19
  module Omnizip
20
- # Core version - autoloaded
21
20
  autoload :VERSION, "omnizip/version"
22
21
 
23
- # Error classes - autoloaded
24
22
  autoload :Error, "omnizip/error"
25
23
  autoload :CompressionError, "omnizip/error"
26
24
  autoload :DecompressionError, "omnizip/error"
27
25
  autoload :AlgorithmNotFoundError, "omnizip/error"
28
26
  autoload :UnknownAlgorithmError, "omnizip/error"
27
+ autoload :UnknownChecksumError, "omnizip/error"
28
+ autoload :UnknownFilterError, "omnizip/error"
29
+ autoload :UnknownEncryptionStrategyError, "omnizip/error"
30
+ autoload :ConversionNotSupportedError, "omnizip/error"
29
31
  autoload :UnsupportedFormatError, "omnizip/error"
30
32
  autoload :FormatError, "omnizip/error"
31
33
  autoload :InvalidArchiveError, "omnizip/error"
34
+ autoload :IOOperationError, "omnizip/error"
32
35
  autoload :IOError, "omnizip/error"
33
36
  autoload :ChecksumError, "omnizip/error"
34
- autoload :OptimizationNotFound, "omnizip/error"
37
+ autoload :OptimizationNotFoundError, "omnizip/error"
35
38
  autoload :ProgressError, "omnizip/error"
36
39
  autoload :ETAError, "omnizip/error"
37
40
  autoload :NotLicensedError, "omnizip/error"
38
41
  autoload :RarNotAvailableError, "omnizip/error"
39
42
 
40
- # Core registries
43
+ autoload :Registry, "omnizip/registry"
41
44
  autoload :Algorithm, "omnizip/algorithm"
42
45
  autoload :AlgorithmRegistry, "omnizip/algorithm_registry"
43
46
  autoload :FormatRegistry, "omnizip/format_registry"
@@ -45,11 +48,9 @@ module Omnizip
45
48
  autoload :ChecksumRegistry, "omnizip/checksum_registry"
46
49
  autoload :FilterRegistry, "omnizip/filter_registry"
47
50
 
48
- # Base classes
49
51
  autoload :Filter, "omnizip/filter"
50
52
  autoload :FilterPipeline, "omnizip/filter_pipeline"
51
53
 
52
- # Feature modules
53
54
  autoload :Buffer, "omnizip/buffer"
54
55
  autoload :Pipe, "omnizip/pipe"
55
56
  autoload :Chunked, "omnizip/chunked"
@@ -66,15 +67,25 @@ module Omnizip
66
67
  autoload :Platform, "omnizip/platform"
67
68
  autoload :Profiler, "omnizip/profiler"
68
69
  autoload :Commands, "omnizip/commands"
69
-
70
- # Sub-module files
70
+ autoload :CliOutputFormatter, "omnizip/cli/output_formatter"
71
+
72
+ # Implementation namespaces. Each namespace file declares autoloads
73
+ # for its concrete classes. The classes self-register with their
74
+ # registry on load (see lib/omnizip/algorithms/lzma.rb etc.).
75
+ autoload :Algorithms, "omnizip/algorithms"
76
+ autoload :Filters, "omnizip/filters"
77
+ autoload :Checksums, "omnizip/checksums"
71
78
  autoload :IO, "omnizip/io"
72
79
  autoload :Crypto, "omnizip/crypto"
73
80
  autoload :Formats, "omnizip/formats"
74
81
  autoload :Zip, "omnizip/zip"
82
+ autoload :Extraction, "omnizip/extraction"
83
+ autoload :Implementations, "omnizip/implementations"
84
+ autoload :ArchiveHandler, "omnizip/archive_handler"
85
+ autoload :ArchiveHandlers, "omnizip/archive_handlers"
86
+ autoload :Convenience, "omnizip/convenience"
75
87
  end
76
88
 
77
- # Models module with autoloaded classes
78
89
  module Omnizip
79
90
  module Models
80
91
  autoload :AlgorithmMetadata, "omnizip/models/algorithm_metadata"
@@ -95,59 +106,15 @@ module Omnizip
95
106
  end
96
107
  end
97
108
 
98
- # Algorithms (with registration - must be required explicitly)
99
- require_relative "omnizip/algorithms/ppmd_base"
100
- require_relative "omnizip/algorithms/lzma"
101
- require_relative "omnizip/algorithms/lzma2"
102
- require_relative "omnizip/algorithms/ppmd7"
103
- require_relative "omnizip/algorithms/ppmd8"
104
- require_relative "omnizip/algorithms/bzip2"
105
- require_relative "omnizip/algorithms/deflate"
106
- require_relative "omnizip/algorithms/deflate64"
107
- require_relative "omnizip/algorithms/zstandard"
108
-
109
- # Filters implementations (with registration)
110
- require_relative "omnizip/filters/bcj"
111
- require_relative "omnizip/filters/bcj_x86"
112
- require_relative "omnizip/filters/bcj2"
113
- require_relative "omnizip/filters/bcj_arm"
114
- require_relative "omnizip/filters/bcj_arm64"
115
- require_relative "omnizip/filters/bcj_ppc"
116
- require_relative "omnizip/filters/bcj_sparc"
117
- require_relative "omnizip/filters/bcj_ia64"
118
- require_relative "omnizip/filters/delta"
119
- require_relative "omnizip/filters/registry"
120
-
121
- # Checksum implementations (with registration)
122
- require_relative "omnizip/checksums/crc_base"
123
- require_relative "omnizip/checksums/crc32"
124
- require_relative "omnizip/checksums/crc64"
125
-
126
- # Archive formats registry (with autoload declarations for lazy loading)
127
- require_relative "omnizip/formats"
128
-
129
- # Archive formats (with registration - must be required explicitly)
130
- require_relative "omnizip/formats/seven_zip"
131
- require_relative "omnizip/formats/zip"
132
- require_relative "omnizip/formats/rar"
133
- require_relative "omnizip/formats/tar"
134
- require_relative "omnizip/formats/gzip"
135
- require_relative "omnizip/formats/bzip2_file"
136
- require_relative "omnizip/formats/xz"
137
-
138
- # MSI format (must be loaded after OLE to override .msi registration)
139
- require_relative "omnizip/formats/msi"
140
-
141
- # Platform-specific features
142
109
  module Omnizip
143
110
  module Platform
144
111
  autoload :NtfsStreams, "omnizip/platform/ntfs_streams"
145
112
  end
146
113
 
147
- # Implementations module with autoloaded classes
148
114
  module Implementations
149
115
  autoload :SevenZip, "omnizip/implementations/seven_zip"
150
116
  autoload :XZUtils, "omnizip/implementations/xz_utils"
117
+
151
118
  module SevenZip
152
119
  module LZMA
153
120
  autoload :StateMachine,
@@ -175,7 +142,8 @@ module Omnizip
175
142
  end
176
143
  end
177
144
 
178
- # Load convenience module to extend Omnizip with utility methods
179
- require "omnizip/convenience"
180
-
181
- # Formats auto-register when their files are loaded (see individual format files)
145
+ # Trigger autoload of Convenience so its methods are available on the
146
+ # Omnizip module (it calls `extend Convenience` at the bottom of the
147
+ # file). Without this, Omnizip.compress_file and friends would not be
148
+ # defined until the first manual reference.
149
+ Omnizip::Convenience
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omnizip
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.9
4
+ version: 0.3.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ribose Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2026-03-24 00:00:00.000000000 Z
11
+ date: 2026-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -120,6 +120,21 @@ files:
120
120
  - LICENSE
121
121
  - README.adoc
122
122
  - Rakefile
123
+ - TODO.refactor/00-overview.md
124
+ - TODO.refactor/01-registry-base-class.md
125
+ - TODO.refactor/02-error-hierarchy.md
126
+ - TODO.refactor/03-autoload-entry-point.md
127
+ - TODO.refactor/04-filter-base-consolidation.md
128
+ - TODO.refactor/05-send-private-methods.md
129
+ - TODO.refactor/06-instance-variable-access.md
130
+ - TODO.refactor/07-respond-to-replacement.md
131
+ - TODO.refactor/08-spec-doubles.md
132
+ - TODO.refactor/09-cli-shared-module.md
133
+ - TODO.refactor/10-format-detector-ocp.md
134
+ - TODO.refactor/11-convenience-decoupling.md
135
+ - TODO.refactor/12-thread-safety.md
136
+ - TODO.refactor/13-lutaml-model-migration.md
137
+ - TODO.refactor/14-add-missing-specs.md
123
138
  - benchmark/README.md
124
139
  - benchmark/benchmark_suite.rb
125
140
  - benchmark/compression_bench.rb
@@ -301,6 +316,10 @@ files:
301
316
  - lib/omnizip/algorithms/zstandard/literals.rb
302
317
  - lib/omnizip/algorithms/zstandard/literals_encoder.rb
303
318
  - lib/omnizip/algorithms/zstandard/sequences.rb
319
+ - lib/omnizip/archive_handler.rb
320
+ - lib/omnizip/archive_handlers.rb
321
+ - lib/omnizip/archive_handlers/tar_handler.rb
322
+ - lib/omnizip/archive_handlers/zip_handler.rb
304
323
  - lib/omnizip/buffer.rb
305
324
  - lib/omnizip/buffer/memory_archive.rb
306
325
  - lib/omnizip/buffer/memory_extractor.rb
@@ -317,6 +336,7 @@ files:
317
336
  - lib/omnizip/chunked/writer.rb
318
337
  - lib/omnizip/cli.rb
319
338
  - lib/omnizip/cli/output_formatter.rb
339
+ - lib/omnizip/cli/shared.rb
320
340
  - lib/omnizip/commands.rb
321
341
  - lib/omnizip/commands/.keep
322
342
  - lib/omnizip/commands/archive_create_command.rb
@@ -581,6 +601,7 @@ files:
581
601
  - lib/omnizip/io.rb
582
602
  - lib/omnizip/io/buffered_input.rb
583
603
  - lib/omnizip/io/buffered_output.rb
604
+ - lib/omnizip/io/source.rb
584
605
  - lib/omnizip/io/stream_manager.rb
585
606
  - lib/omnizip/link_handler.rb
586
607
  - lib/omnizip/link_handler/hard_link.rb
@@ -668,6 +689,7 @@ files:
668
689
  - lib/omnizip/progress/progress_reporter.rb
669
690
  - lib/omnizip/progress/progress_tracker.rb
670
691
  - lib/omnizip/progress/silent_reporter.rb
692
+ - lib/omnizip/registry.rb
671
693
  - lib/omnizip/rubyzip_compat.rb
672
694
  - lib/omnizip/temp.rb
673
695
  - lib/omnizip/temp/safe_extract.rb