class Rapporteur::MessageList

A container of keys and one or more messages per key. This acts similarly to an ActiveModel::Errors collection from Ruby on Rails.

Public Class Methods

new(list_type) click to toggle source

Public: Initialize a new MessageList instance.

list_type - A Symbol representing the type of this list. This Symbol is

used to determine the structure of the I18n key used when
translating the given message Symbols.
Allowed values: :messages or :errors.

Returns a MessageList instance.

# File lib/rapporteur/message_list.rb, line 25
def initialize(list_type)
  @list_type = list_type
  @messages = Hash.new { |hash, key| hash[key] = Set.new }
end

Public Instance Methods

add(attribute, message, i18n_options = {}) click to toggle source

Public: Adds a new message to the list for the given attribute.

attribute - A Symbol describing the category, attribute, or name to which

the message pertains.

message - A Symbol, String, or Proc which contains the message for the

attribute.

If a String is given, it is directly used for the message.

If a Symbol is given, it is used to lookup the full message
from I18n, under the "rapporteur.<list_type>.<message Symbol>"
key. For instance, if this is a :messages list, and the
attribute is :time, then I18n would be queried for
"rapporteur.messages.time".

If a Proc is given, it is `.call`'d with no parameters. The
return value from the Proc is directly used for the message.

i18n_options - A Hash of optional key/value pairs to pass to the I18n

translator.

Examples

list.add(:time, '2013-08-23T12:34:00Z')
list.add(:time, :too_late)
list.add(:time, :too_late, :time => 'midnight')
list.add(:time, lambda { Time.now.iso8601 })

Returns the MessageList instance.

# File lib/rapporteur/message_list.rb, line 59
def add(attribute, message, i18n_options = {})
  @messages[attribute.to_sym].add(normalize_message(attribute, message, i18n_options))
  self
end
full_messages() click to toggle source

Public: Generates an Array containing the combination of all of the added attributes and their messages.

Examples

list.add(:time, 'is now')
list.add(:time, 'is valuable')
list.add(:day, 'is today')
list.full_messages
# => ["time is now", "time is valuable", "day is today"]

Returns an Array containing Strings of messages.

# File lib/rapporteur/message_list.rb, line 77
def full_messages
  @messages.map { |attribute, attribute_messages|
    attribute_messages.map { |message| "#{attribute} #{message}" }
  }.flatten
end
to_hash() click to toggle source

Public: Returns the added attributes and their messages as a Hash, keyed by the attribute, with either an Array containing all of the added messages or just the single attribute message.

Examples

list.add(:time, 'is now')
list.add(:time, 'is valuable')
list.add(:day, 'is today')
list.full_messages
# => {:time => ["is now", "is valuable"], :day => "is today"}

Returns a Hash instance.

# File lib/rapporteur/message_list.rb, line 97
def to_hash
  hash = {}
  @messages.each_pair do |key, value|
    hash[key] = if value.size == 1
      value.first
    else
      value.to_a
    end
  end
  hash
end

Private Instance Methods

generate_message(key, type, i18n_options) click to toggle source
# File lib/rapporteur/message_list.rb, line 111
def generate_message(key, type, i18n_options)
  I18n.translate(type, **i18n_options.merge(default: [type, type.to_s], scope: [:rapporteur, @list_type, key]))
end
normalize_message(attribute, message, i18n_options) click to toggle source
# File lib/rapporteur/message_list.rb, line 115
def normalize_message(attribute, message, i18n_options)
  case message
  when Symbol
    generate_message(attribute, message, i18n_options)
  when Proc
    message.call
  else
    message
  end
end