Sha256: 659cd1cd523ebfac6bad0ecae5281a78752d6880c8946a7b3cce6a56b1d5b52e

Contents?: true

Size: 1.64 KB

Versions: 2

Compression:

Stored size: 1.64 KB

Contents

require 'rltk'
require 'rltk/ast'

module ::Rubiks

  # == Rubiks ValidatedNode
  #
  # Provides a basic validation framework to ASTNodes.
  #
  # A minimal implementation could be:
  #
  #  class NamedNode < ::Rubiks::ValidatedNode
  #    name :name, String
  #
  #    validates :name_present
  #
  #    def name_present
  #      errors << "Name required on NamedNode" if self.name.blank?
  #    end
  #
  #    def parse_name(name_value)
  #      return if name_value.nil?
  #
  #      self.name = name_value.to_s
  #    end
  #  end
  #
  # Which provides you with the following behavior:
  #
  #   name_node = nameNode.new
  #   name_node.valid?           # => false
  #   name_node.errors           # => ["Name required on NamedNode"]
  #
  #   name_node.name = 7
  #   name_node.valid?           # => true
  #
  class ValidatedNode < ::RLTK::ASTNode

    class << self
      attr_accessor :validators

      alias_method :validator_methods, :validators
    end

    def self.validates(*validator_symbols)
      @validators ||= []
      @validators << validator_symbols.flatten
      @validators.flatten!
      @validators.compact!
      @validators.uniq!

      return @validators
    end

    def self.inherited(klass)
      super
      klass.validators = self.validators.nil? ?
                          [] :
                          self.validators.dup
    end

    def errors
      @errors ||= []
    end

    def valid?
      validate if errors.empty?

      return errors.empty?
    end

    def validate
      self.class.validator_methods.each do |validator_method|
        self.__send__(validator_method) if respond_to?(validator_method)
      end
    end

  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rubiks-0.0.6 lib/rubiks/nodes/validated_node.rb
rubiks-0.0.5 lib/rubiks/nodes/validated_node.rb