Sha256: 161018816067e946732621534fa73ad385b63b1df8c83bece83dbc768d5e62fa

Contents?: true

Size: 1.93 KB

Versions: 2

Compression:

Stored size: 1.93 KB

Contents

module Bbrcobranca
  module Util
    class Errors

      include Enumerable

      CALLBACKS_OPTIONS = [:if, :unless, :on, :allow_nil, :allow_blank, :strict]
      MESSAGE_OPTIONS = [:message]

      attr_reader :messages, :details

      def initialize(base)
        @base     = base
        @messages = apply_default_array({})
        @details = apply_default_array({})
      end

      def add(attribute, message = :invalid, options = {})
        message = message.call if message.respond_to?(:call)
        detail  = normalize_detail(message, options)
        message = normalize_message(attribute, message, options)
        details[attribute.to_sym]  << detail
        messages[attribute.to_sym] << message
      end

      def size
        @messages.values.flatten.size
      end
      alias :count :size

      def generate_message(attribute, type = :invalid, options = {})
        :"errors.attributes.#{attribute}.#{type}"
      end

      def full_messages
        @messages.values.flatten
      end
      alias :to_a :full_messages

      private

        def apply_default_array(hash)
          hash.default_proc = proc { |h, key| h[key] = [] }
          hash
        end

        def normalize_message(attribute, message, options)
          case message
          when Symbol
            generate_message(attribute, message, except(options, *CALLBACKS_OPTIONS))
          else
            if message.start_with?(variable_name(attribute))
              message
            else
              "#{variable_name(attribute)} #{message}"
            end
          end
        end

        def normalize_detail(message, options)
          { error: message }.merge(except(options, *CALLBACKS_OPTIONS + MESSAGE_OPTIONS))
        end

        def except(hash, *keys)
          dup = hash.dup
          keys.each { |key| dup.delete(key) }
          dup
        end

        def variable_name(symbol)
          symbol.to_s.tr("_", " ").capitalize
        end

    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bbrcobranca-0.0.2 lib/bbrcobranca/util/errors.rb
bbrcobranca-0.0.1 lib/bbrcobranca/util/errors.rb