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