Class: BinData::SanitizedParameters

Inherits:
Hash
  • Object
show all
Defined in:
lib/bindata/sanitize.rb

Overview

BinData objects are instantiated with parameters to determine their behaviour. These parameters must be sanitized to ensure their values are valid. When instantiating many objects with identical parameters, such as an array of records, there is much duplicated sanitizing.

The purpose of the sanitizing code is to eliminate the duplicated validation.

SanitizedParameters is a hash-like collection of parameters. Its purpose is to recursively sanitize the parameters of an entire BinData object chain at a single time.

Constant Summary collapse

BIG_ENDIAN =

Memoized constants

SanitizedBigEndian.new
LITTLE_ENDIAN =
SanitizedLittleEndian.new

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parameters, the_class, hints) ⇒ SanitizedParameters

Returns a new instance of SanitizedParameters.



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/bindata/sanitize.rb', line 188

def initialize(parameters, the_class, hints)
  parameters.each_pair { |key, value| self[key.to_sym] = value }

  @the_class = the_class

  if hints[:endian]
    self[:endian] ||= hints[:endian]
  end

  if hints[:search_prefix] && !hints[:search_prefix].empty?
    self[:search_prefix] = Array(self[:search_prefix]).concat(Array(hints[:search_prefix]))
  end

  sanitize!
end

Class Method Details

.sanitize(parameters, the_class) ⇒ Object



179
180
181
182
183
184
185
# File 'lib/bindata/sanitize.rb', line 179

def sanitize(parameters, the_class)
  if SanitizedParameters === parameters
    parameters
  else
    SanitizedParameters.new(parameters, the_class, {})
  end
end

Instance Method Details

#create_sanitized_params(params, the_class) ⇒ Object



280
281
282
# File 'lib/bindata/sanitize.rb', line 280

def create_sanitized_params(params, the_class)
  SanitizedParameters.new(params, the_class, hints)
end

#has_at_least_one_of?(*keys) ⇒ Boolean

Returns:

  • (Boolean)


206
207
208
209
210
211
212
# File 'lib/bindata/sanitize.rb', line 206

def has_at_least_one_of?(*keys)
  keys.each do |key|
    return true if has_parameter?(key)
  end

  false
end

#hintsObject



284
285
286
# File 'lib/bindata/sanitize.rb', line 284

def hints
  { endian: self[:endian], search_prefix: self[:search_prefix] }
end

#must_be_integer(*keys) ⇒ Object

def warn_renamed_parameter(old_key, new_key)

  val = delete(old_key)
  if val
    self[new_key] = val
    Kernel.warn ":#{old_key} has been renamed to :#{new_key} in #{@the_class}.  " \
    "Using :#{old_key} is now deprecated and will be removed in the future"
  end
end


230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/bindata/sanitize.rb', line 230

def must_be_integer(*keys)
  keys.each do |key|
    if has_parameter?(key)
      parameter = self[key]
      unless Symbol === parameter ||
             parameter.respond_to?(:arity) ||
             parameter.respond_to?(:to_int)
        raise ArgumentError, "parameter '#{key}' in #{@the_class} must " \
                             "evaluate to an integer, got #{parameter.class}"
      end
    end
  end
end

#rename_parameter(old_key, new_key) ⇒ Object



244
245
246
247
248
# File 'lib/bindata/sanitize.rb', line 244

def rename_parameter(old_key, new_key)
  if has_parameter?(old_key)
    self[new_key] = delete(old_key)
  end
end

#sanitize(key, &block) ⇒ Object



274
275
276
277
278
# File 'lib/bindata/sanitize.rb', line 274

def sanitize(key, &block)
  if needs_sanitizing?(key)
    self[key] = yield(self[key])
  end
end

#sanitize_choices(key, &block) ⇒ Object



264
265
266
267
268
# File 'lib/bindata/sanitize.rb', line 264

def sanitize_choices(key, &block)
  sanitize(key) do |obj|
    create_sanitized_choices(yield(obj))
  end
end

#sanitize_endian(key) ⇒ Object



270
271
272
# File 'lib/bindata/sanitize.rb', line 270

def sanitize_endian(key)
  sanitize(key) { |endian| create_sanitized_endian(endian) }
end

#sanitize_fields(key, &block) ⇒ Object



256
257
258
259
260
261
262
# File 'lib/bindata/sanitize.rb', line 256

def sanitize_fields(key, &block)
  sanitize(key) do |fields|
    sanitized_fields = create_sanitized_fields
    yield(fields, sanitized_fields)
    sanitized_fields
  end
end

#sanitize_object_prototype(key) ⇒ Object



250
251
252
253
254
# File 'lib/bindata/sanitize.rb', line 250

def sanitize_object_prototype(key)
  sanitize(key) do |obj_type, obj_params|
    create_sanitized_object_prototype(obj_type, obj_params)
  end
end

#warn_replacement_parameter(bad_key, suggested_key) ⇒ Object



214
215
216
217
218
219
# File 'lib/bindata/sanitize.rb', line 214

def warn_replacement_parameter(bad_key, suggested_key)
  if has_parameter?(bad_key)
    Kernel.warn ":#{bad_key} is not used with #{@the_class}.  " \
                "You probably want to change this to :#{suggested_key}"
  end
end