class MailchimpClient

Attributes

previous_response[R]

Public Class Methods

new(api_key, timeout) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 23
def initialize(api_key, timeout)
  @api_key = api_key
  @gibbon = Gibbon.new(@api_key)
  @gibbon.timeout = timeout
end

Public Instance Methods

batch_destroy!(emails) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 87
def batch_destroy!(emails)
  @previous_response = @gibbon.list_batch_unsubscribe(:id => @list['id'], :emails => emails, :delete_member => true, :send_goodbye => false, :send_notify => false)
rescue Timeout::Error
  raise RequestTimeout
end
batch_subscribe(batch) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 75
def batch_subscribe(batch)
  @previous_response = @gibbon.list_batch_subscribe(:id => @list['id'], :batch => batch, :double_optin => false, :update_existing => true)
rescue Timeout::Error
  raise RequestTimeout
end
destroy!(email) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 81
def destroy!(email)
  @previous_response = @gibbon.list_unsubscribe(:id => @list['id'], :email_address => email, :delete_member => true, :send_goodbye => false, :send_notify => false)
rescue Timeout::Error
  raise RequestTimeout
end
destroy_all_subscribers!() click to toggle source

WARNING: For large lists this is much slower than deleting all subscribers through Mailchimp's website, but it should work. It's useful for scenarios that require automation like Mailchimp unit tests.

# File lib/mcmailer/mailchimp_client.rb, line 97
def destroy_all_subscribers!
  responses = []
  batch_size = 1500

  until subscribers.count.zero? do
    begin
      emails = self.subscribers(0, batch_size).collect {|s| s['email']}
      batch_destroy!(emails)
    rescue UnexpectedResponse
      raise
    end

    responses << @previous_response
    break if @previous_response['success_count'].zero?
  end

  @previous_response = responses
rescue Timeout::Error
  raise RequestTimeout
end
subscribe(email, merge_vars={}) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 63
def subscribe(email, merge_vars={})
  @previous_response = @gibbon.list_subscribe(:id => @list['id'], :email_address => email, :double_optin => false, :update_existing => true, :merge_vars => merge_vars)
rescue Timeout::Error
  raise RequestTimeout
end
subscriber_info(email) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 69
def subscriber_info(email)
  @previous_response = @gibbon.list_member_info(:id => @list['id'], :email_address => [email])
rescue Timeout::Error
  raise RequestTimeout
end
subscribers(start=0, limit=100) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 52
def subscribers(start=0, limit=100)
  @previous_response = @gibbon.list_members(:id => @list['id'], :start => start, :limit => limit)
  if !@previous_response.has_key?('data')
    raise UnexpectedResponse, "response hash did not have a 'data' key"
  end

  @previous_response['data']
rescue Timeout::Error
  raise RequestTimeout
end
use_list(name) click to toggle source
# File lib/mcmailer/mailchimp_client.rb, line 29
def use_list(name)
  begin
    @previous_response = @gibbon.lists
  rescue Timeout::Error
    raise RequestTimeout
  end

  if @previous_response.has_key?('data')
    lists = @previous_response['data']
    matches = lists.select {|list| list.has_key?('name') && list['name'] == name}

    if matches.empty?
      raise ListNotFound, "provided name => '#{name}'"
    elsif matches.length > 1
      raise UnexpectedResponse, "list names should be unique but found #{matches.length} lists by the name of '#{name}'"
    else
      @list = matches.first
    end
  else
    raise UnexpectedResponse, "response hash did not have a 'data' key"
  end
end