class Feedigest::MailComposer

Constants

Mail

Attributes

feeds[R]

Public Class Methods

new(feeds) click to toggle source
# File lib/feedigest/mail_composer.rb, line 11
def initialize(feeds)
  @feeds = feeds
end

Public Instance Methods

mail() click to toggle source
# File lib/feedigest/mail_composer.rb, line 15
def mail
  @mail ||= Mail.new(
    Feedigest.config.fetch(:email_sender),
    Feedigest.config.fetch(:email_recipient),
    subject,
    html_body,
    text_body
  )
end

Private Instance Methods

entries_count() click to toggle source
# File lib/feedigest/mail_composer.rb, line 110
def entries_count
  feeds.reduce(0) { |count, feed| count + feed.entries.size }
end
entries_html(builder, entries) click to toggle source
# File lib/feedigest/mail_composer.rb, line 78
def entries_html(builder, entries)
  entries.group_by { |e| e.published.to_date }.each do |date, date_entries|
    builder.h3 date

    date_entries.each do |entry|
      entry_html(builder, entry)
    end
  end
end
entry_html(builder, entry) click to toggle source
# File lib/feedigest/mail_composer.rb, line 88
def entry_html(builder, entry)
  builder.p do
    builder.a(entry.title, href: entry.url)
  end
end
feed_html(builder, feed) click to toggle source
# File lib/feedigest/mail_composer.rb, line 66
def feed_html(builder, feed)
  builder.div do
    if feed.error
      builder.h2 feed.url
      builder.p "Error: #{feed.error}"
    else
      builder.h2 feed.title
      entries_html(builder, feed.entries)
    end
  end
end
feeds_without_error() click to toggle source
# File lib/feedigest/mail_composer.rb, line 106
def feeds_without_error
  feeds.select { |feed| feed[:error].nil? }
end
header_html(builder) click to toggle source
# File lib/feedigest/mail_composer.rb, line 54
def header_html(builder)
  builder.p(
    sprintf(
      'In the last %{hours}, %{entries} %{were} published in %{feeds}:',
      hours: pluralize(Feedigest.config.fetch(:entry_window), 'hour'),
      entries: pluralize(entries_count, 'entry', 'entries'),
      were: entries_count == 1 ? 'was' : 'were',
      feeds: pluralize(feeds_without_error.size, 'feed')
    )
  )
end
html_body() click to toggle source
# File lib/feedigest/mail_composer.rb, line 35
def html_body
  @html_body ||=
    Nokogiri::HTML::Builder.new(encoding: 'utf-8') { |builder|
      builder.div do
        header_html(builder)

        feeds.each do |feed|
          feed_html(builder, feed)
        end

        signature_html(builder)
      end
    }.to_html
end
pluralize(count, singular, plural = singular + 's') click to toggle source
# File lib/feedigest/mail_composer.rb, line 114
def pluralize(count, singular, plural = singular + 's')
  [count, count == 1 ? singular : plural].join(' ')
end
signature_html(builder) click to toggle source
# File lib/feedigest/mail_composer.rb, line 94
def signature_html(builder)
  builder.p do
    builder.text '--'
    builder.br
    builder.text 'Sent by '
    builder.a(
      "feedigest #{Feedigest::VERSION}",
      href: 'https://github.com/agorf/feedigest'
    )
  end
end
subject() click to toggle source
# File lib/feedigest/mail_composer.rb, line 27
def subject
  sprintf(
    'Digest for %s in %s',
    pluralize(entries_count, 'entry', 'entries'),
    pluralize(feeds_without_error.size, 'feed')
  )
end
text_body() click to toggle source
# File lib/feedigest/mail_composer.rb, line 50
def text_body
  ReverseMarkdown.convert(html_body)
end