lib/fluent_conditions.rb in fluent_conditions-0.0.2 vs lib/fluent_conditions.rb in fluent_conditions-0.0.3

- old
+ new

@@ -1,9 +1,12 @@ +require File.expand_path('../fluent_conditions/condition_builder.rb', __FILE__) +require File.expand_path('../fluent_conditions/accessor_definers.rb', __FILE__) + module FluentConditions def self.included(base) - base.instance_variable_set(:@builder, Class.new(Builder)) + base.instance_variable_set(:@builder, Class.new(ConditionBuilder)) base.class_eval do include InstanceMethods end @@ -18,133 +21,16 @@ def is_not self.class.instance_variable_get(:@builder).new(self, :negative) end end - module ClassMethods + module ClassMethods def fluent(field, options = {}) - builder = instance_variable_get(:@builder) + accessor_definer = AccessorDefinerFactory.make_for(options) + condition_builder = instance_variable_get(:@builder) - if options.include?(:values) - options[:values].each do |value| - builder.class_eval do - define_method(value) do - update_and_continue(instance_variable_get(:@object).send(field) == value) - end - - define_method("#{value}?") do - update_and_finish(instance_variable_get(:@object).send(field) == value) - end - - define_method("not_#{value}") do - update_and_continue(instance_variable_get(:@object).send(field) != value) - end - - define_method("not_#{value}?") do - update_and_finish(instance_variable_get(:@object).send(field) != value) - end - end - end - elsif options.include?(:if) - field_name = options[:as] - condition_check = options[:if] - - builder.class_eval do - define_method(field_name) do - update_and_continue(condition_check.call(instance_variable_get(:@object).send(field))) - end - - define_method("#{field_name}?") do - update_and_finish(condition_check.call(instance_variable_get(:@object).send(field))) - end - - define_method("not_#{field_name}") do - update_and_continue(!condition_check.call(instance_variable_get(:@object).send(field))) - end - - define_method("not_#{field_name}?") do - update_and_finish(!condition_check.call(instance_variable_get(:@object).send(field))) - end - end - else - builder.class_eval do - define_method(field) do - update_and_continue(instance_variable_get(:@object).send(field)) - end - - define_method("#{field}?") do - update_and_finish(instance_variable_get(:@object).send(field)) - end - - define_method("not_#{field}") do - update_and_continue(!instance_variable_get(:@object).send(field)) - end - - define_method("not_#{field}?") do - update_and_finish(!instance_variable_get(:@object).send(field)) - end - end - end + accessor_definer.define(condition_builder, field) end end - - class Builder - def initialize(object, type) - @object = object - @type = type - @previous, @current, @big_or = true, true, false - end - - def or - @or_flag = true - self - end - - def OR - @big_or = @big_or || result - @big_or_flag = true - @previous, @current = true, true - self - end - - def and - self - end - - private - - def update_and_continue(field_value) - update_result(field_value) - self - end - - def update_and_finish(field_value) - update_result(field_value) - end_result - end - - def update_result(field_value) - if @or_flag - @current = @current || field_value - @or_flag = false - else - @previous, @current = @previous && @current, field_value - end - end - - def end_result - if @big_or_flag - return (@big_or || result) if @type == :positive - return !(@big_or || result) if @type == :negative - end - return result if @type == :positive - return !result if @type == :negative - end - - def result - @previous && @current - end - - end end