lib/hungryform/resolver.rb in hungryform-0.0.4 vs lib/hungryform/resolver.rb in hungryform-0.0.6

- old
+ new

@@ -3,12 +3,13 @@ # It contains all form elements and params class Resolver attr_accessor :elements, :params def initialize(options = {}) - @params = options[:params] || {} - @elements = {} + self.params = ActiveSupport::HashWithIndifferentAccess.new(options[:params] || {}) + + self.elements = {} end # Gets element value by element's name. # If name is lambda - returns lambda's result # If name is present in the resolvers' elements hash - returns element's value @@ -24,49 +25,46 @@ # A sample name string can look like this: page1_group[GROUP_NUMBER]_field # where [GROUP_NUMBER] is a placeholder. When an element is present # we get its placeholders and replace substrings in the name argument element.placeholders.each { |k, v| name[k] &&= v } if element - return @elements[name].value if @elements.key?(name) - return @params[name] if @params.key?(name) - - name + elements[name].try(:value) || params[name] || name end # Gets dependency rules hash and returns true or false depending on # the result of a recursive processing of the rules def resolve_dependency(dependency) dependency.each do |operator, arguments| + operator = operator.to_sym + case operator - when 'AND' - return resolve_multi_dependency(:and, arguments) - when 'OR' - return resolve_multi_dependency(:or, arguments) - when 'NOT' + when :and, :or + return resolve_multi_dependency(operator, arguments) + when :not return !resolve_dependency(arguments) end arguments = [arguments] unless arguments.is_a?(Array) arguments = arguments[0..1].map { |name| get_value(name) } return false if arguments.any?(&:nil?) case operator - when 'EQ' + when :eq return arguments[0].to_s == arguments[1].to_s - when 'LT' + when :lt return arguments[0].to_f < arguments[1].to_f - when 'GT' + when :gt return arguments[0].to_f > arguments[1].to_f - when 'SET' + when :set return !arguments[0].empty? end end end private - # Helper method to resolve AND or OR conditions. + # Method resolves AND or OR conditions. # Walks through the arguments and resolves their dependencies. def resolve_multi_dependency(type, arguments) if arguments.size == 0 fail HungryFormException, "No arguments for #{type.upcase} comparison: #{arguments}" end