nepalez/attestor

View on GitHub
lib/attestor/validations/validator.rb

Summary

Maintainability
A
0 mins
Test Coverage
# encoding: utf-8

module Attestor

  module Validations

    # @private
    class Validator
      include Reporter

      def initialize(name = :invalid, except: nil, only: nil, &block)
        @name      = name.to_sym
        @whitelist = normalize(only)
        @blacklist = normalize(except)
        @block     = block
        freeze
      end

      attr_reader :name, :whitelist, :blacklist, :block

      def used_in_context?(context)
        symbol = context.to_sym
        whitelisted?(symbol) && !blacklisted?(symbol)
      end

      def validate!(object)
        block ? object.instance_eval(&block) : object.__send__(name)
      end

      private

      def whitelisted?(symbol)
        whitelist.empty? || whitelist.include?(symbol)
      end

      def blacklisted?(symbol)
        blacklist.include? symbol
      end

      def normalize(list)
        Array(list).map(&:to_sym).uniq
      end

    end # class Validator

  end # module Validations

end # module Attestor