Class: Omnizip::Pipe::StreamCompressor

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

Overview

Stream-based compression for pipe operations

Accepts any IO-like input source and writes compressed output to any IO-like sink, using chunk-based processing to avoid loading entire streams into memory.

Examples:

Compress stdin to stdout

compressor = StreamCompressor.new($stdin, $stdout, :zip)
compressor.compress

Compress with custom chunk size

compressor = StreamCompressor.new(
  input_file,
  output_file,
  :zip,
  chunk_size: 1024 * 1024  # 1MB chunks
)
compressor.compress

Constant Summary collapse

DEFAULT_CHUNK_SIZE =

Default chunk size for reading input (64KB)

64 * 1024

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(input, output, format, compression: nil, **options) ⇒ StreamCompressor

Initialize stream compressor

Parameters:

  • input (IO)

    Input stream to compress

  • output (IO)

    Output stream for compressed data

  • format (Symbol)

    Archive format (:zip, :seven_zip)

  • compression (Symbol, nil) (defaults to: nil)

    Compression algorithm

  • options (Hash)

    Compression options

Options Hash (**options):

  • :entry_name (String)

    Name for entry (default: 'stream.dat')

  • :chunk_size (Integer)

    Read buffer size

  • :level (Integer)

    Compression level (1-9)

  • :progress (Proc)

    Progress callback



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/omnizip/pipe/stream_compressor.rb', line 40

def initialize(input, output, format, compression: nil, **options)
  @input = input
  @output = output
  @format = format
  @compression = compression
  @options = options
  @chunk_size = options[:chunk_size] || DEFAULT_CHUNK_SIZE
  @bytes_read = 0
  @bytes_written = 0
  @progress_callback = options[:progress]
end

Instance Attribute Details

#bytes_writtenObject (readonly)

Returns the value of attribute bytes_written.



27
28
29
# File 'lib/omnizip/pipe/stream_compressor.rb', line 27

def bytes_written
  @bytes_written
end

#formatObject (readonly)

Returns the value of attribute format.



27
28
29
# File 'lib/omnizip/pipe/stream_compressor.rb', line 27

def format
  @format
end

#inputObject (readonly)

Returns the value of attribute input.



27
28
29
# File 'lib/omnizip/pipe/stream_compressor.rb', line 27

def input
  @input
end

#optionsObject (readonly)

Returns the value of attribute options.



27
28
29
# File 'lib/omnizip/pipe/stream_compressor.rb', line 27

def options
  @options
end

#outputObject (readonly)

Returns the value of attribute output.



27
28
29
# File 'lib/omnizip/pipe/stream_compressor.rb', line 27

def output
  @output
end

Instance Method Details

#compressInteger

Compress input stream to output stream

Reads input in chunks and writes compressed output, maintaining constant memory usage regardless of input size.

Returns:

  • (Integer)

    Total bytes written to output

Raises:

  • (ArgumentError)

    If format is unsupported



59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/omnizip/pipe/stream_compressor.rb', line 59

def compress
  case @format
  when :zip
    compress_zip
  when :seven_zip, :"7z"
    compress_7z
  else
    raise ArgumentError, "Unsupported format: #{@format}"
  end

  @bytes_written
end