Sha256: 07539e1b0b527366ba46ae9901878668a3c82aceccf442ba86e1d8bc81ea9a71

Contents?: true

Size: 1.36 KB

Versions: 4

Compression:

Stored size: 1.36 KB

Contents

class ValidationAssertionCollector
  def self.gather(klass, &block)
    collector = self.new(klass)
    collector.instance_eval(&block)
    collector.assertions
  end
  
  def self.define_method_for_validation_method(validation_method, validatable_class)
    define_method validation_method.gsub(/^validates_/,'').to_sym do |attribute|
      assertions << ValidationAssertion.new(self.klass, validatable_class, attribute)
      define_methods_on_assertion_to_collect_options validatable_class, assertions.last
    end
  end

  Validatable::ClassMethods.public_instance_methods.sort.grep(/^validates_/).each do |validation_method|
    next if validation_method == 'validates_true_for'
    validatable_class = Validatable.const_get(validation_method.split(/_/).collect { |word| word.capitalize}.join)
    define_method_for_validation_method(validation_method, validatable_class)
  end
  
  attr_accessor :klass
  
  def initialize(klass)
    self.klass = klass
  end
    
  def define_methods_on_assertion_to_collect_options(validatable_class, assertion)
    validatable_class.all_understandings.each do |option|
      next if option == :if
      class << assertion; self; end.instance_eval do
        define_method option do |value|
          self.options.merge!(option=>value)
          self
        end
      end
    end
    assertion
  end
  
  def assertions
    @assertions ||= []
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
validatable-1.3.4 lib/validation_assertion_collector.rb
validatable-1.4.0 lib/validation_assertion_collector.rb
validatable-1.3.0 lib/validation_assertion_collector.rb
validatable-1.3.2 lib/validation_assertion_collector.rb