Sha256: b0bcd5958891b2d17031aff6cf88ecaa01f9b937095f8de3badfe9ef3e7f0282

Contents?: true

Size: 1.36 KB

Versions: 7

Compression:

Stored size: 1.36 KB

Contents

class ValidationAssertionCollector #:nodoc:
  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::Macros.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

7 entries across 7 versions & 1 rubygems

Version Path
validatable-1.6.4 lib/validation_assertion_collector.rb
validatable-1.5.0 lib/validation_assertion_collector.rb
validatable-1.5.2 lib/validation_assertion_collector.rb
validatable-1.6.1 lib/validation_assertion_collector.rb
validatable-1.6.2 lib/validation_assertion_collector.rb
validatable-1.6.3 lib/validation_assertion_collector.rb
validatable-1.6.0 lib/validation_assertion_collector.rb