Custom compression pipeline
Memory-Based Compression
require 'cabriolet'
require 'stringio'
# Compress in memory without disk I/O
input_data = File.read('large_file.dat', mode: 'rb')
output_buffer = StringIO.new
output_buffer.set_encoding(Encoding::BINARY)
compressor = Cabriolet::CAB::Compressor.new(
io: output_buffer,
compression: :lzx
)
compressor.add_data('file.dat', input_data)
compressor.compress
# Get compressed data
cab_data = output_buffer.string
puts "Compressed #{input_data.size} to #{cab_data.size} bytes"Custom I/O Handler
require 'cabriolet'
class S3IOHandler < Cabriolet::System::IOHandler
def initialize(bucket, key)
@bucket = bucket
@key = key
@s3 = Aws::S3::Client.new
end
def read(offset, size)
@s3.get_object(
bucket: @bucket,
key: @key,
range: "bytes=#{offset}-#{offset + size - 1}"
).body.read
end
def size
@s3.head_object(bucket: @bucket, key: @key).content_length
end
end
# Use with Cabriolet
handler = S3IOHandler.new('my-bucket', 'archive.cab')
cabinet = Cabriolet::CAB::Parser.new.parse_io(handler)Format Conversion Pipeline
require 'cabriolet'
require 'zip'
# Convert CAB to ZIP
cab = Cabriolet::CAB::Parser.new.parse('archive.cab')
Zip::File.open('archive.zip', Zip::File::CREATE) do |zipfile|
cab.files.each do |file|
zipfile.get_output_stream(file.name) do |stream|
stream.write(file.data)
end
end
end
puts "Converted CAB to ZIP"