module Patriot::Util::Param
namespace for parameter handling functions
Public Instance Methods
eval_attr(attr_val)
click to toggle source
replace parameter values in command attribute valeus @param attr_val an attribute value to be evaluated
# File lib/patriot/util/param.rb, line 8 def eval_attr(attr_val) if attr_val.is_a?(Hash) entries = {} attr_val.each{|k,v| entries[eval_attr(k)] = eval_attr(v) } return entries elsif attr_val.is_a?(Array) return attr_val.map{|e| eval_attr(e)} elsif attr_val.is_a?(String) return eval_string_attr(attr_val) else # only evaluate attributes in String return attr_val end end
eval_string_attr(str, vars = {})
click to toggle source
evaluate variables in a string expression @param str [String] a string expression to be evaluated @param vars [Hash] variables used in the evaluation @return [String] a evaluated string expression
# File lib/patriot/util/param.rb, line 27 def eval_string_attr(str, vars = {}) s = StringScanner.new(str) s.scan(/(.*?)\#\{/m) # retrun immediatelly if variables are not contained return str unless s.matched? prefix = s[1] nest = 1 # depth of parenthesis var = "" # variable expression prev_rest = s.rest while nest > 0 tmp = s.scan(/(.*?)[\{\}]/m) # for hash objects, etc if s.matched? if /.*?\{/ =~ tmp nest = nest + 1 var << s[0] else nest = nest - 1 if nest > 0 var << s[0] else # does not include the last parenthesis indicates end of the variable var << s[1] end end end raise "infinte loop #{str} : rest #{s.rest} : #{nest}" if prev_rest == s.rest prev_rest = s.rest end # evaluate the variable var_binding = build_var_binding(vars) var_binding = binding if var_binding.nil? evaled_var = eval var, var_binding # farther variables are handled by next invocation return "#{prefix}#{evaled_var}#{eval_string_attr(prev_rest, vars)}" end
Private Instance Methods
build_var_binding(vars)
click to toggle source
# File lib/patriot/util/param.rb, line 63 def build_var_binding(vars) return nil if vars.empty? raise "illegal key var exist in #{vars.inspect}" if vars.has_key?('vars') assign_exps = [vars.map{|k,v| "#{k} = vars['#{k}']"}] | ["binding"] return eval assign_exps.join(";") end