class EmailTemplator

An email template which can be personalized for a given resource

Constants

ATTRIBUTES
DELIMITERS

2-array with left and right keyword delimiters

KEYWORDS

white-list of special keywords to be replaced

Attributes

errors[R]

Public Class Methods

keywords_with_delimiters() click to toggle source
# File lib/email_templator.rb, line 75
def self.keywords_with_delimiters
  keywords.map do |keyword|
    keyword_with_delimiters keyword
  end
end
new(subject, body) click to toggle source
# File lib/email_templator.rb, line 15
def initialize(subject, body)
  @subject, @body = subject, body

  @errors = []
end

Private Class Methods

keyword_with_delimiters(keyword) click to toggle source
# File lib/email_templator.rb, line 83
def self.keyword_with_delimiters keyword
  "#{self::DELIMITERS.first}#{keyword}#{self::DELIMITERS.last}"
end
keywords() click to toggle source
# File lib/email_templator.rb, line 87
def self.keywords
  self::KEYWORDS.keys.map(&:to_s).sort
end

Public Instance Methods

personalize(resource) click to toggle source
# File lib/email_templator.rb, line 36
def personalize resource
  raise ArgumentError, @errors unless valid?

  resource = pre_personalize_hook resource

  replace_map = self.class::KEYWORDS.inject({}) do |hash, (keyword,method)|
    replace = resource.public_send(method)
    hash.merge!(keyword => replace.to_s)
  end.freeze

  personalized = {}

  ATTRIBUTES.each do |attribute|
    attribute_value = public_send(attribute).dup

    replace_map.each do |key, value|
      attribute_value.gsub!(self.class.keyword_with_delimiters(key), value)
    end

    personalized[attribute] = attribute_value
  end

  self.class.new(personalized[:subject], personalized[:body]).freeze
end
pre_personalize_hook(resource) click to toggle source
# File lib/email_templator.rb, line 61
def pre_personalize_hook resource
  resource
end
unknown_keywords() click to toggle source
# File lib/email_templator.rb, line 65
def unknown_keywords
  regexp = /#{Regexp.escape(self.class::DELIMITERS.first)}(.*?)#{Regexp.escape(self.class::DELIMITERS.last)}/

  present_keywords = ATTRIBUTES.map do |attribute|
    public_send(attribute).to_s.scan(regexp).map(&:first)
  end.flatten

  present_keywords - self.class.keywords
end
valid?() click to toggle source
# File lib/email_templator.rb, line 21
def valid?
  ATTRIBUTES.each do |attribute|
    value = public_send(attribute)
    if value.nil? || value.empty?
      @errors << "#{attribute.to_s.capitalize} can't be blank"
    end
  end

  unless unknown_keywords.empty?
    @errors << "Unknown keywords found: #{unknown_keywords.join(', ')}"
  end

  @errors.empty?
end