Module: Cabriolet

Defined in:
lib/cabriolet.rb,
lib/cabriolet.rb,
lib/cabriolet/cli.rb,
lib/cabriolet/errors.rb,
lib/cabriolet/plugin.rb,
lib/cabriolet/version.rb,
lib/cabriolet/checksum.rb,
lib/cabriolet/modifier.rb,
lib/cabriolet/platform.rb,
lib/cabriolet/repairer.rb,
lib/cabriolet/constants.rb,
lib/cabriolet/streaming.rb,
lib/cabriolet/validator.rb,
lib/cabriolet/cab/parser.rb,
lib/cabriolet/chm/parser.rb,
lib/cabriolet/file_entry.rb,
lib/cabriolet/hlp/parser.rb,
lib/cabriolet/lit/parser.rb,
lib/cabriolet/format_base.rb,
lib/cabriolet/kwaj/parser.rb,
lib/cabriolet/models/file.rb,
lib/cabriolet/szdd/parser.rb,
lib/cabriolet/file_manager.rb,
lib/cabriolet/huffman/tree.rb,
lib/cabriolet/cab/extractor.rb,
lib/cabriolet/models/folder.rb,
lib/cabriolet/cab/compressor.rb,
lib/cabriolet/chm/compressor.rb,
lib/cabriolet/hlp/compressor.rb,
lib/cabriolet/lit/compressor.rb,
lib/cabriolet/models/cabinet.rb,
lib/cabriolet/oab/compressor.rb,
lib/cabriolet/plugin_manager.rb,
lib/cabriolet/quantum_shared.rb,
lib/cabriolet/base_compressor.rb,
lib/cabriolet/compressors/lzx.rb,
lib/cabriolet/format_detector.rb,
lib/cabriolet/huffman/decoder.rb,
lib/cabriolet/huffman/encoder.rb,
lib/cabriolet/kwaj/compressor.rb,
lib/cabriolet/models/chm_file.rb,
lib/cabriolet/models/hlp_file.rb,
lib/cabriolet/szdd/compressor.rb,
lib/cabriolet/binary/bitstream.rb,
lib/cabriolet/cab/decompressor.rb,
lib/cabriolet/chm/decompressor.rb,
lib/cabriolet/compressors/base.rb,
lib/cabriolet/compressors/lzss.rb,
lib/cabriolet/hlp/decompressor.rb,
lib/cabriolet/lit/decompressor.rb,
lib/cabriolet/oab/decompressor.rb,
lib/cabriolet/plugin_validator.rb,
lib/cabriolet/system/io_system.rb,
lib/cabriolet/algorithm_factory.rb,
lib/cabriolet/binary/structures.rb,
lib/cabriolet/compressors/mszip.rb,
lib/cabriolet/decompressors/lzx.rb,
lib/cabriolet/kwaj/decompressor.rb,
lib/cabriolet/lit/header_writer.rb,
lib/cabriolet/lit/piece_builder.rb,
lib/cabriolet/models/chm_header.rb,
lib/cabriolet/models/hlp_header.rb,
lib/cabriolet/models/lit_header.rb,
lib/cabriolet/models/oab_header.rb,
lib/cabriolet/offset_calculator.rb,
lib/cabriolet/szdd/decompressor.rb,
lib/cabriolet/decompressors/base.rb,
lib/cabriolet/decompressors/lzss.rb,
lib/cabriolet/decompressors/none.rb,
lib/cabriolet/hlp/winhelp/parser.rb,
lib/cabriolet/lit/guid_generator.rb,
lib/cabriolet/models/chm_section.rb,
lib/cabriolet/models/folder_data.rb,
lib/cabriolet/models/kwaj_header.rb,
lib/cabriolet/models/szdd_header.rb,
lib/cabriolet/system/file_handle.rb,
lib/cabriolet/cab/command_handler.rb,
lib/cabriolet/chm/command_handler.rb,
lib/cabriolet/compressors/quantum.rb,
lib/cabriolet/decompressors/mszip.rb,
lib/cabriolet/hlp/command_handler.rb,
lib/cabriolet/lit/command_handler.rb,
lib/cabriolet/lit/content_encoder.rb,
lib/cabriolet/oab/command_handler.rb,
lib/cabriolet/cli/command_registry.rb,
lib/cabriolet/extraction/extractor.rb,
lib/cabriolet/hlp/quickhelp/parser.rb,
lib/cabriolet/kwaj/command_handler.rb,
lib/cabriolet/system/memory_handle.rb,
lib/cabriolet/szdd/command_handler.rb,
lib/cabriolet/binary/chm_structures.rb,
lib/cabriolet/binary/hlp_structures.rb,
lib/cabriolet/binary/lit_structures.rb,
lib/cabriolet/binary/oab_structures.rb,
lib/cabriolet/hlp/winhelp/zeck_lz77.rb,
lib/cabriolet/lit/directory_builder.rb,
lib/cabriolet/lit/structure_builder.rb,
lib/cabriolet/models/winhelp_header.rb,
lib/cabriolet/binary/kwaj_structures.rb,
lib/cabriolet/binary/szdd_structures.rb,
lib/cabriolet/cli/command_dispatcher.rb,
lib/cabriolet/hlp/winhelp/compressor.rb,
lib/cabriolet/binary/bitstream_writer.rb,
lib/cabriolet/cli/base_command_handler.rb,
lib/cabriolet/hlp/quickhelp/compressor.rb,
lib/cabriolet/hlp/winhelp/decompressor.rb,
lib/cabriolet/cab/file_compression_work.rb,
lib/cabriolet/extraction/base_extractor.rb,
lib/cabriolet/hlp/quickhelp/file_writer.rb,
lib/cabriolet/hlp/winhelp/btree_builder.rb,
lib/cabriolet/lit/content_type_detector.rb,
lib/cabriolet/hlp/quickhelp/decompressor.rb,
lib/cabriolet/hlp/quickhelp/huffman_tree.rb,
lib/cabriolet/cab/file_compression_worker.rb,
lib/cabriolet/collections/file_collection.rb,
lib/cabriolet/hlp/quickhelp/topic_builder.rb,
lib/cabriolet/hlp/quickhelp/huffman_stream.rb,
lib/cabriolet/hlp/quickhelp/topic_compressor.rb,
lib/cabriolet/extraction/file_extraction_work.rb,
lib/cabriolet/hlp/quickhelp/offset_calculator.rb,
lib/cabriolet/hlp/quickhelp/structure_builder.rb,
lib/cabriolet/hlp/quickhelp/compression_stream.rb,
lib/cabriolet/extraction/file_extraction_worker.rb,
lib/cabriolet/decompressors/quantum.rb

Overview

Convenience methods at top level

Defined Under Namespace

Modules: Binary, CAB, CHM, Checksum, Collections, Commands, Compressors, Constants, Decompressors, Extraction, HLP, Huffman, KWAJ, LIT, Models, OAB, Platform, QuantumShared, SZDD, Streaming, System Classes: AlgorithmFactory, ArgumentError, BaseCompressor, CABOffsetCalculator, CLI, ChecksumError, CompressionError, DecompressionError, Error, FileEntry, FileManager, FormatBase, FormatDetector, FormatError, IOError, ModificationReport, Modifier, OffsetCalculator, ParseError, Plugin, PluginError, PluginManager, PluginValidator, ReadError, RepairReport, Repairer, SalvageReport, SeekError, SignatureError, UnsupportedFormatError, ValidationReport, Validator

Constant Summary collapse

VERSION =
"0.2.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.default_buffer_sizeObject

Default buffer size for I/O operations (4KB)



39
40
41
# File 'lib/cabriolet.rb', line 39

def default_buffer_size
  @default_buffer_size
end

.verboseObject

Enable or disable verbose output



36
37
38
# File 'lib/cabriolet.rb', line 36

def verbose
  @verbose
end

Class Method Details

.algorithm_factoryAlgorithmFactory

Get the global algorithm factory instance

Returns:



44
45
46
# File 'lib/cabriolet.rb', line 44

def algorithm_factory
  @algorithm_factory ||= AlgorithmFactory.new
end

.algorithm_factory=(factory) ⇒ AlgorithmFactory

Set the global algorithm factory instance

Parameters:

Returns:



52
53
54
# File 'lib/cabriolet.rb', line 52

def algorithm_factory=(factory)
  @algorithm_factory = factory
end

.detect_format(path) ⇒ Symbol?

Detect format of an archive file

Examples:

format = Cabriolet.detect_format('file.cab')
# => :cab

Parameters:

  • path (String)

    Path to the file

Returns:

  • (Symbol, nil)

    Detected format symbol or nil



194
195
196
# File 'lib/cabriolet.rb', line 194

def detect_format(path)
  FormatDetector.detect(path)
end

.extract(archive_path, output_dir, **options) ⇒ Hash

Extract files from an archive with automatic format detection

Examples:

Sequential extraction

Cabriolet.extract('archive.cab', 'output/')

Parallel extraction with 8 workers

stats = Cabriolet.extract('file.chm', 'docs/', workers: 8)
puts "Extracted #{stats[:extracted]} files"

Parameters:

  • archive_path (String)

    Path to the archive

  • output_dir (String)

    Directory to extract to

  • options (Hash)

    Extraction options

Options Hash (**options):

  • :workers (Integer) — default: 4

    Number of parallel workers (1 = sequential)

  • :preserve_paths (Boolean) — default: true

    Preserve directory structure

  • :overwrite (Boolean) — default: false

    Overwrite existing files

Returns:

  • (Hash)

    Extraction statistics



214
215
216
217
218
# File 'lib/cabriolet.rb', line 214

def extract(archive_path, output_dir, **options)
  archive = open(archive_path)
  extractor = Extraction::Extractor.new(archive, output_dir, **options)
  extractor.extract_all
end

.info(path) ⇒ Hash

Get information about an archive without full extraction

Examples:

info = Cabriolet.info('archive.cab')
# => { format: :cab, file_count: 145, total_size: 52428800, ... }

Parameters:

  • path (String)

    Path to the archive

Returns:

  • (Hash)

    Archive information



228
229
230
231
232
233
234
235
236
237
238
239
240
241
# File 'lib/cabriolet.rb', line 228

def info(path)
  archive = open(path)
  format = detect_format(path)

  {
    format: format,
    path: path,
    file_count: archive.files.count,
    total_size: archive.files.sum { |f| f.size || 0 },
    compressed_size: File.size(path),
    compression_ratio: calculate_compression_ratio(archive, path),
    files: archive.files.map { |f| file_info(f) },
  }
end

.open(path, **options) ⇒ Object

Open and parse an archive with automatic format detection

Examples:

archive = Cabriolet.open('unknown.archive')
archive.files.each { |f| puts f.name }

Parameters:

  • path (String)

    Path to the archive file

  • options (Hash)

    Options to pass to the parser

Returns:

  • (Object)

    Parsed archive object

Raises:



174
175
176
177
178
179
180
181
182
183
184
# File 'lib/cabriolet.rb', line 174

def open(path, **options)
  parser_class = FormatDetector.parser_for(path)

  unless parser_class
    format = detect_format(path)
    raise UnsupportedFormatError,
          "Unable to detect format or no parser available for: #{path} (detected: #{format || 'unknown'})"
  end

  parser_class.new(**options).parse(path)
end

.plugin_managerPluginManager

Get the global plugin manager instance

Returns:



59
60
61
# File 'lib/cabriolet.rb', line 59

def plugin_manager
  PluginManager.instance
end