lib/set_builder/modifier/base.rb in set_builder-2.0.0.beta3 vs lib/set_builder/modifier/base.rb in set_builder-2.0.0.beta4

- old
+ new

@@ -1,5 +1,7 @@ +require "set_builder/modifier/arguments" + module SetBuilder module Modifier class Base attr_reader :operator, :values @@ -41,15 +43,15 @@ end end def errors_with_values [].tap do |errors| - types = self.class.operators[operator] || [] - if values.length != types.length - errors.push "wrong number of arguments; expected #{types.length} (#{types.join(", ")})" + arguments = self.class.parsed_operators[operator] || Arguments.new("") + if values.length != arguments.arity + errors.push "wrong number of arguments; expected #{arguments.arity} (#{arguments.types.join(", ")})" else - errors.concat values.each_with_index.flat_map { |value, i| errors_with_value_type(value, types[i]) } + errors.concat values.each_with_index.flat_map { |value, i| errors_with_value_type(value, arguments.types[i]) } end end end def errors_with_value_type(value, type) @@ -76,32 +78,32 @@ "#{string.inspect} is not a valid number" unless string.to_s =~ /\A\d+\Z/ end - def to_s(negative=false) - words = negative ? [self.class.negate(operator).to_s.gsub(/_/, " ")] : [operator.to_s.gsub(/_/, " ")] - arguments = self.class.operators[operator] || [] - (0...arguments.length).each do |i| - words << ValueMap.to_s(arguments[i], values[i]) - end - words.join(" ") + def to_s + arguments = self.class.parsed_operators[operator] || Arguments.new("") + operator.to_s.gsub(/_/, " ") + " " + arguments.to_s(values) end + def self.parsed_operators + @parsed_operators ||= Hash[operators.map { |operator, arguments| + [operator, Arguments.new(arguments)] }] + end + + + def self.negate(operator) operator end def self.to_hash - hash = {} - operators.each do |operator, array| - hash[operator.to_s] = array.map {|type| type.to_s } - end - hash + Hash[parsed_operators.map { |operator, arguments| + [operator.to_s, arguments.as_json] }] end def self.to_json