class Recipes::Mailer

Public Instance Methods

add_mailer_queue() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 35
def add_mailer_queue
  insert_into_file "config/sidekiq.yml", "  - mailers", after: "- default\n"
end
ask() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 2
def ask
  email_services = {
    aws_ses: "Amazon SES",
    sendgrid: "Sendgrid (beta)",
    none: "None, thanks"
  }

  email_service = answer(:email_service) do
    email_services.keys[Ask.list("Which email service are you using?", email_services.values)]
  end
  set :email_service, email_service.to_sym
end
create() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 15
def create
  email_service = email_services(get(:email_service))
  return if email_service.nil?

  set(:mailer_delivery_method, email_service[:delivery_method])
  set(:mailer_gem_name, email_service[:gem_name])

  add_readme_header :mailing

  dependencies(email_service)
  config(email_service)

  ensure_sidekiq_install_and_add_mailers_queue
end
install() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 30
def install
  ask
  create
end

Private Instance Methods

aws_ses() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 113
def aws_ses
  gather_gems(:development) { gather_gem("letter_opener") }
  application "config.action_mailer.delivery_method = :letter_opener", env: "development"
end
config(service) click to toggle source
# File lib/potassium/recipes/mailer.rb, line 83
def config(service)
  template "../assets/config/mailer.rb.erb", 'config/mailer.rb'

  append_to_file '.env.development', "APPLICATION_HOST=localhost:3000\n"
  append_to_file '.env.development', "EMAIL_RECIPIENTS=\n"

  copy_file '../assets/app/mailers/application_mailer.rb', 'app/mailers/application_mailer.rb',
            force: true
  config_environments
  send(service[:name])
end
config_environments() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 66
  def config_environments
    gsub_file 'config/environments/production.rb', /$\s*config.action_mailer.*/, ''
    asset_host_dev = <<~RUBY
      config.action_mailer.asset_host = "http://\#{ENV.fetch('APPLICATION_HOST')}"
    RUBY
    application asset_host_dev, env: "development"
    asset_host_prod = <<~RUBY
      config.action_mailer.asset_host = "https://\#{ENV.fetch('APPLICATION_HOST')}"
    RUBY
    application asset_host_prod, env: "production"
    mailer_config = <<~RUBY
      require Rails.root.join("config/mailer")
    RUBY

    prepend_file "config/environments/production.rb", mailer_config
  end
dependencies(service) click to toggle source
# File lib/potassium/recipes/mailer.rb, line 57
def dependencies(service)
  if service[:version]
    gather_gem service[:gem_name], service[:version]
  else
    gather_gem service[:gem_name]
  end
  gather_gem 'recipient_interceptor'
end
email_services(service_name) click to toggle source
# File lib/potassium/recipes/mailer.rb, line 41
def email_services(service_name)
  email_services = {
    sendgrid: {
      name: 'sendgrid',
      gem_name: 'send_grid_mailer',
      delivery_method: :sendgrid
    },
    aws_ses: {
      name: 'aws_ses',
      gem_name: 'aws-sdk-rails',
      delivery_method: :aws_sdk
    }
  }
  email_services[service_name]
end
ensure_sidekiq_install_and_add_mailers_queue() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 118
def ensure_sidekiq_install_and_add_mailers_queue
  background_processor_recipe = load_recipe(:background_processor)
  background_processor_answer = get(:background_processor)

  if background_processor_recipe.installed?
    add_mailer_queue
  else
    recipe = self
    after(:install_sidekiq) { recipe.add_mailer_queue }
    background_processor_recipe.add_sidekiq unless background_processor_answer
  end
end
sendgrid() click to toggle source
# File lib/potassium/recipes/mailer.rb, line 95
  def sendgrid
    append_to_file '.env.development', "SENDGRID_API_KEY=\n"
    sendgrid_settings = <<~RUBY
      Rails.application.config.action_mailer.sendgrid_settings = {
        api_key: ENV['SENDGRID_API_KEY']
      }
    RUBY
    inject_into_file 'config/mailer.rb', sendgrid_settings,
                     after: "Rails.application.config.action_mailer.delivery_method = :sendgrid\n"
    sendgrid_dev_settings = <<~RUBY
      Rails.application.config.action_mailer.sendgrid_dev_settings = {
        api_key: ENV['SENDGRID_API_KEY']
      }
    RUBY
    application sendgrid_dev_settings, env: "development"
    application "config.action_mailer.delivery_method = :sendgrid_dev", env: "development"
  end