Class: Omnizip::Models::FilterChain

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/models/filter_chain.rb

Overview

Ordered sequence of filters for compression/decompression

Manages a pipeline of filters that are applied in sequence. Filters are applied in reverse order during decode.

Examples:

Create filter chain for XZ executable

chain = FilterChain.new(format: :xz)
chain.add_filter(name: :"bcj-x86", architecture: :x86)
chain.add_filter(name: :lzma2)  # Main compression
encoded = chain.encode_all(data, position)

Constant Summary collapse

MAX_FILTERS_XZ =

Maximum filters in XZ format

4
MAX_FILTERS_SEVEN_ZIP =

Maximum filters in 7z format

4

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(attributes = {}) ⇒ FilterChain

Initialize filter chain

Parameters:

  • attributes (Hash) (defaults to: {})

    Initialization attributes

Options Hash (attributes):

  • :format (Symbol)

    Target format



48
49
50
51
# File 'lib/omnizip/models/filter_chain.rb', line 48

def initialize(attributes = {})
  @format = attributes[:format] || :xz
  @filters = attributes[:filters] || []
end

Instance Attribute Details

#filtersArray<FilterConfig> (readonly)

Returns Ordered filter configurations.

Returns:



33
34
35
# File 'lib/omnizip/models/filter_chain.rb', line 33

def filters
  @filters
end

#formatSymbol (readonly)

Returns Format identifier (:xz, :seven_zip).

Returns:

  • (Symbol)

    Format identifier (:xz, :seven_zip)



36
37
38
# File 'lib/omnizip/models/filter_chain.rb', line 36

def format
  @format
end

Instance Method Details

#add_filter(filter_attributes = {}) ⇒ self

Add a filter to the chain

Parameters:

  • filter_attributes (Hash) (defaults to: {})

    Filter configuration

Options Hash (filter_attributes):

  • :name (Symbol)

    Filter name

  • :properties (String)

    Filter properties

  • :architecture (Symbol)

    Target architecture

Returns:

  • (self)

    For chaining



60
61
62
63
64
65
# File 'lib/omnizip/models/filter_chain.rb', line 60

def add_filter(filter_attributes = {})
  filter = FilterConfig.new(filter_attributes)
  filter.validate!
  @filters << filter
  self
end

#decode_all(data, position = 0) ⇒ String

Decode data through all filters in reverse order

Parameters:

  • data (String)

    Input data

  • position (Integer) (defaults to: 0)

    Stream position

Returns:

  • (String)

    Decoded data



111
112
113
114
115
116
117
118
# File 'lib/omnizip/models/filter_chain.rb', line 111

def decode_all(data, position = 0)
  result = data
  @filters.reverse_each do |filter_config|
    filter = filter_config.filter_instance
    result = filter.decode(result, position)
  end
  result
end

#empty?Boolean

Check if chain is empty

Returns:

  • (Boolean)

    True if no filters



130
131
132
# File 'lib/omnizip/models/filter_chain.rb', line 130

def empty?
  @filters.empty?
end

#encode_all(data, position = 0) ⇒ String

Encode data through all filters in order

Parameters:

  • data (String)

    Input data

  • position (Integer) (defaults to: 0)

    Stream position

Returns:

  • (String)

    Encoded data



97
98
99
100
101
102
103
104
# File 'lib/omnizip/models/filter_chain.rb', line 97

def encode_all(data, position = 0)
  result = data
  @filters.each do |filter_config|
    filter = filter_config.filter_instance
    result = filter.encode(result, position)
  end
  result
end

#filter_idsArray<Integer>

Get filter IDs for current format

Returns:

  • (Array<Integer>)

    Array of filter IDs in order



123
124
125
# File 'lib/omnizip/models/filter_chain.rb', line 123

def filter_ids
  @filters.map { |f| f.id_for_format(@format) }
end

#max_filtersInteger

Get maximum filters for current format

Returns:

  • (Integer)

    Maximum number of filters allowed



70
71
72
73
74
75
76
# File 'lib/omnizip/models/filter_chain.rb', line 70

def max_filters
  case @format
  when :xz then MAX_FILTERS_XZ
  when :seven_zip then MAX_FILTERS_SEVEN_ZIP
  else raise ArgumentError, "Unknown format: #{@format}"
  end
end

#sizeInteger

Get number of filters in chain

Returns:

  • (Integer)

    Filter count



137
138
139
# File 'lib/omnizip/models/filter_chain.rb', line 137

def size
  @filters.size
end

#validate!Boolean

Validate filter chain

Returns:

  • (Boolean)

    True if valid

Raises:

  • (ArgumentError)

    If validation fails



82
83
84
85
86
87
88
89
90
# File 'lib/omnizip/models/filter_chain.rb', line 82

def validate!
  if @filters.size > max_filters
    raise ArgumentError,
          "Too many filters for #{@format}: #{@filters.size} > #{max_filters}"
  end

  @filters.each(&:validate!)
  true
end