Class: Omnizip::Pipe::StreamDecompressor

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/pipe/stream_decompressor.rb

Overview

Stream-based decompression for pipe operations

Accepts compressed archive from any IO-like source and extracts to directory or streams to output. Handles multi-file archives and provides error recovery for corrupted streams.

Examples:

Decompress to directory

decompressor = StreamDecompressor.new($stdin, output_dir: 'extracted/')
decompressor.decompress

Decompress to stdout

decompressor = StreamDecompressor.new($stdin, output: $stdout)
decompressor.decompress

Constant Summary collapse

DEFAULT_CHUNK_SIZE =

Default chunk size for streaming extraction (64KB)

64 * 1024

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input, output_dir: nil, output: nil, **options) ⇒ StreamDecompressor

Initialize stream decompressor

Parameters:

  • input (IO)

    Input stream containing archive

  • output_dir (String, nil) (defaults to: nil)

    Directory to extract to

  • output (IO, nil) (defaults to: nil)

    Output stream (for single-file extraction)

  • options (Hash)

    Decompression options

Options Hash (**options):

  • :format (Symbol)

    Archive format (auto-detected if nil)

  • :chunk_size (Integer)

    Write buffer size

  • :progress (Proc)

    Progress callback

  • :preserve_paths (Boolean)

    Preserve directory structure



36
37
38
39
40
41
42
43
44
45
46
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 36

def initialize(input, output_dir: nil, output: nil, **options)
  @input = input
  @output_dir = output_dir
  @output = output
  @options = options
  @chunk_size = options[:chunk_size] || DEFAULT_CHUNK_SIZE
  @bytes_written = 0
  @progress_callback = options[:progress]
  @format = options[:format]
  @preserve_paths = options.fetch(:preserve_paths, true)
end

Instance Attribute Details

#bytes_writtenObject (readonly)

Returns the value of attribute bytes_written.



24
25
26
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 24

def bytes_written
  @bytes_written
end

#inputObject (readonly)

Returns the value of attribute input.



24
25
26
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 24

def input
  @input
end

#optionsObject (readonly)

Returns the value of attribute options.



24
25
26
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 24

def options
  @options
end

#outputObject (readonly)

Returns the value of attribute output.



24
25
26
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 24

def output
  @output
end

#output_dirObject (readonly)

Returns the value of attribute output_dir.



24
25
26
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 24

def output_dir
  @output_dir
end

Instance Method Details

#decompressHash<String, Integer>, Integer

Decompress input stream

Extracts archive to output directory or streams to output. Returns hash of extracted files or bytes written.

Returns:

  • (Hash<String, Integer>, Integer)

    Files => bytes or total bytes

Raises:



55
56
57
58
59
60
61
62
63
64
# File 'lib/omnizip/pipe/stream_decompressor.rb', line 55

def decompress
  if @output
    decompress_to_stream
  elsif @output_dir
    decompress_to_directory
  else
    raise ArgumentError,
          "Either output_dir or output must be specified"
  end
end