class MultiparameterAttributesHandler::Manipulator

Attributes

hash[RW]
value_mod[RW]

Public Class Methods

new(hash, &value_mod) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 6
def initialize(hash, &value_mod)
  @hash = hash
  @value_mod = value_mod
end

Public Instance Methods

multiparameters() click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 11
def multiparameters
  keys = multiparameter_keys.collect do |k| 
    k.gsub(ends_with_number_letter_in_brackets, "")
  end
  keys.uniq!
  keys.delete_if{|k| empty_date_values_for? k}
  return keys
end
output() click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 33
def output
  begin
    multiparameters.each do |multiparameter|
      hash[multiparameter] = value_of(multiparameter)
    end
  rescue => e
    errors << e
  end
  return hash if errors.empty?
  raise_combined_error(errors)
end
value_of(multiparameter) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 25
def value_of(multiparameter)
  values = values_for(multiparameter)
  return values unless values.kind_of? Array
  time = convert_to_time(multiparameter, values)
  return time unless value_mod
  value_mod.call(time)
end
values_for(multiparameter) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 20
def values_for(multiparameter)
  return hash[multiparameter] unless multiparameters.include? multiparameter
  keys_for(multiparameter).collect{|k| hash[k]}
end

Private Instance Methods

add_missing_keys_for(multiparameter, keys) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 80
def add_missing_keys_for(multiparameter, keys)
  postscript = characters_after_sequence_number(keys.first)
  numbers = sequence_numbers(keys)
  (1..numbers.last).each do |number|
    next if number < 3 # don't replace missing date keys
    next if numbers.include? number
    key = "#{multiparameter}(#{number}#{postscript})"
    hash[key] = '00'
    keys << key
  end
end
characters_after_sequence_number(sample_key) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 92
def characters_after_sequence_number(sample_key)
  match = sample_key.match(/\(\d+(\w*)\)/)
  match ? match[1] : ""
end
convert_to_time(multiparameter, values) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 46
def convert_to_time(multiparameter, values)
  begin
    if values.length == 3
      Date.new *values.collect(&:to_i)
    else
      Time.local *values
    end
  rescue => e
    msg = "Error determining value_of #{multiparameter} from #{values} (#{e.message})"
    raise_assignment_errors(multiparameter, values, msg, e)
  end
end
empty_date_values_for?(multiparameter) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 97
def empty_date_values_for?(multiparameter)
  keys = keys_for(multiparameter)[0..2].select{|p| hash[p].empty?}
  !keys.empty?
end
ends_with_number_letter_in_brackets() click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 63
def ends_with_number_letter_in_brackets
  /\(\d+\w+\)$/
end
errors() click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 112
def errors
  @errors ||= []
end
keys_for(multiparameter) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 67
def keys_for(multiparameter)
  keys = multiparameter_keys.select{|k| /^#{multiparameter}\(/ =~ k}
  add_missing_keys_for(multiparameter, keys)
  return keys.sort if sequence_starting_at_one?(keys)
  
  raise_assignment_errors(
    multiparameter, 
    keys, 
    "key number sequence incomplete or not starting at one"
  )
  
end
multiparameter_keys() click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 59
def multiparameter_keys
  hash.keys.select{|k| k =~ ends_with_number_letter_in_brackets}
end
raise_assignment_errors(multiparameter, values, message, error = StandardError) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 116
def raise_assignment_errors(multiparameter, values, message, error = StandardError)
  msg = "Error determining value_of #{multiparameter} from #{values} (#{message})"
  raise AttributeAssignmentError.new(error, multiparameter), msg
end
raise_combined_error(errors) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 121
def raise_combined_error(errors)
  error_descriptions = errors.collect { |ex| ex.message }.join(",")
  msg = "#{errors.size} error(s) on determining value of multiparameter attributes [#{error_descriptions}]"
  raise MultiparameterAssignmentErrors.new(errors), msg
end
sequence_numbers(keys) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 108
def sequence_numbers(keys)
  keys.collect{|k| m = k.match(/\((\d+)\w+\)/); m ? m[1].to_i : nil}.sort
end
sequence_starting_at_one?(keys) click to toggle source
# File lib/multiparameter_attributes_handler/manipulator.rb, line 102
def sequence_starting_at_one?(keys)
  numbers = sequence_numbers(keys)
  expected = (1..10).to_a
  numbers == expected[0..(numbers.length - 1)]
end