class Condition::ParamItem
Public Class Methods
new(rows)
click to toggle source
# File lib/condition/param_item.rb, line 7 def initialize(rows) @name = rows[0][0].to_sym @options = rows[0].size > 1 ? rows[0][1..rows[0].size - 1] : [] body = rows[1..rows.size - 1] @values = [] @keys = [] @params = {} @refs = [] @used_values = [] body.each do |row| index = 0 key = row[0].to_sym @keys = key @params[key] = ("$" + key.to_s).to_sym items = row[1..row.size - 1] value = nil items.each do |item| value = @values[index] ? @values[index] : {} value[key] = calc_item(item, index, key) @values[index] = value index += 1 end end end
Public Instance Methods
apply_ref(param)
click to toggle source
# File lib/condition/param_item.rb, line 73 def apply_ref(param) @refs.each do |it| @values[it[:index]][it[:key]] = param.get(it[:name], it[:count]) end end
calc_item(item, index, key)
click to toggle source
# File lib/condition/param_item.rb, line 40 def calc_item(item, index, key) if '#NULL' == item nil elsif '#TRUE' == item true elsif '#FALSE' == item false elsif '#EMPTY' == item '' elsif '#NOW' == item Time.now elsif /^#NOW\((.+)\)$/ =~ item Time.now + ($1.to_i) elsif /^#REF\((.+)\)$/ =~ item ary = $1.split(/,/) count = ary.size > 1 ? ary[1].strip.to_i : nil @refs << {index: index, key: key, name: ary[0].strip.to_sym, count: count} item elsif /^#JSON\((.+)\)$/ =~ item JSON.parse($1, {:symbolize_names => true}) elsif /^#TIME\((.+)\)$/ =~ item Time.parse($1) elsif /^#INT\((.+)\)$/ =~ item $1.to_i elsif /^#REGEXP\((.+)\)$/ =~ item Regexp.new($1) elsif /^#EVAL\((.+)\)$/ =~ item eval($1) else item end end
check_line(real, index)
click to toggle source
# File lib/condition/param_item.rb, line 181 def check_line(real, index) value_index = 0 @values.each do |value| targetFlag = @options.empty? ? value_index == index : true return if check_value(real, value, targetFlag) value_index += 1 end raise "#{@name} not found " + real.to_s end
check_value(real, value, targetFlag)
click to toggle source
# File lib/condition/param_item.rb, line 161 def check_value(real, value, targetFlag) matchFlag = true @unmatch_info = [] value.each_pair do |k, v| match = value_match?(v, real[k]) @unmatch_info << "key=#{k.to_s} " + v.to_s + " <> " + real[k].to_s if !match whereKeyFlag = nil != @options.index(k.to_s) matchFlag = false if !match targetFlag = false if whereKeyFlag && !match end if targetFlag && matchFlag @used_values << value return true elsif !targetFlag return false else raise "#{@name} not match " + real.to_s + "\nexpected <> real\n" + @unmatch_info.join("\n") end end
clear_used_values()
click to toggle source
# File lib/condition/param_item.rb, line 32 def clear_used_values @used_values = [] end
is_remain_value()
click to toggle source
# File lib/condition/param_item.rb, line 36 def is_remain_value @values.size > @used_values.size end
name()
click to toggle source
# File lib/condition/param_item.rb, line 79 def name @name end
options()
click to toggle source
# File lib/condition/param_item.rb, line 95 def options @options end
params()
click to toggle source
# File lib/condition/param_item.rb, line 91 def params @params end
value()
click to toggle source
# File lib/condition/param_item.rb, line 83 def value @values[0] end
value_match?(expected, real)
click to toggle source
# File lib/condition/param_item.rb, line 99 def value_match?(expected, real) if "#PRESENT" == expected (!real.nil?) && ("" != real.to_s) elsif expected == nil && real != nil || expected != nil && real == nil false elsif Regexp === expected expected =~ real.to_s elsif Time === real real == Time.parse(expected) elsif nil == real expected == nil elsif Hash === real if !(Hash === expected) false elsif real == expected true else result = true expected.each_pair do |k, v| res = value_match?(v, real[k]) if !res @unmatch_info << "key=#{k.to_s} #{v.to_s} <> #{real[k].to_s}" result = false end end result end elsif Array === real if !(Array === expected) @unmatch_info << "real is Array and expected is not Array" false elsif real.size() == 0 && expected.size() == 0 true elsif real == expected true elsif real.size() != expected.size() @unmatch_info << "real array size=#{real.size().to_s} <> expected size=#{expected.size().to_s}" false else index = 0 result = true while true break if index >= expected.size res = value_match?(expected[index], real[index]) if !res @unmatch_info << expected[index].to_s + " <> " + real[index].to_s result = false break end index += 1 end result end elsif Integer === expected real.to_i == expected elsif Array === expected && real.respond_to?("to_a") real.to_a == expected else real.to_s == expected.to_s end end
values()
click to toggle source
# File lib/condition/param_item.rb, line 87 def values @values end